ZooKeeper
ZooKeeper
注意:
此文档对应的 ZooKeeper 版本为 3.7.1。
简介
ZooKeeper 是一种用于分布式应用程序的高性能协调服务。提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性,被广泛地应用于诸如 Hadoop、HBase、Kafka 和 Dubbo 等大型分布式系统中。详细信息参考 官方文档。
部署
ZooKeeper 有 2 部署方式:
- 单机部署(Single Server and Developer Setup)
- 集群部署(Clustered (Multi-Server) Setup)
生产环境中一般使用集群部署。
系统需求
硬件
对硬件配置的最低需求如下:
CPU | 内存 | 硬盘 |
---|---|---|
2核+ | 2 GB+ | 80G+ |
操作系统
ZooKeeper 包含以下组件:
客户端(Client):用于应用连接到 ZooKeeper 的 Java 程序。
服务器(Server):运行在 ZooKeeper 集群节点上的 Java 服务器。
原生客户端(Native Client):用于应用连接到 ZooKeeper 的 C 程序。
其他模块(Contrib):多个可选附加组件。
各组件对操作系统的支持如下:
Operating System | Client | Server | Native Client | Contrib |
---|---|---|---|---|
GNU/Linux | Development and Production | Development and Production | Development and Production | Development and Production |
Solaris | Development and Production | Development and Production | Not Supported | Not Supported |
FreeBSD | Development and Production | Development and Production | Not Supported | Not Supported |
Windows | Development and Production | Development and Production | Not Supported | Not Supported |
Mac OS X | Development Only | Development Only | Not Supported | Not Supported |
软件
ZooKeeper 需要 JDK 1.8 及以上环境。
集群部署
ZooKeeper 集群至少需要 3 台主机,且三台主机不能接入同一交换机,如果是虚拟机,也不能位于同一宿主机上。
环境
使用 3 台主机来部署集群,主机信息如下:
主机名 | IP | 操作系统 | CPU | 内存 |
---|---|---|---|---|
zknode1 | 192.168.44.150 | RHEL 7.9 | 2核 | 8 GB |
zknode2 | 192.168.44.151 | RHEL 7.9 | 2核 | 8 GB |
zknode3 | 192.168.44.152 | RHEL 7.9 | 2核 | 8 GB |
[root@zknode1 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
[root@zknode1 ~]# grep 'processor' /proc/cpuinfo | uniq | wc -l
2
[root@zknode1 ~]# cat /proc/meminfo | grep MemTotal
MemTotal: 7914804 kB
如未做特殊说明,以下操作均需要在集群所有主机上进行。
禁用 SELinux
修改文件 /etc/selinux/config
,将 SELINUX=enforcing
修改为 SELINUX=disabled
。
[root@zknode1 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
修改完成后重启主机。
[root@zknode1 ~]# init 6
重启后确认 SELinux 状态为 disabled
。
[root@zknode1 ~]# sestatus
SELinux status: disabled
关闭防火墙
关闭防火墙,禁止开机启动。
[root@zknode1 ~]# systemctl stop firewalld.service
[root@zknode1 ~]# systemctl disable firewalld.service
[root@zknode1 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
配置本地域名解析
将集群中所有机器的主机名和 IP 地址写入到 /etc/hosts
文件。
[root@zknode1 ~]# echo "192.168.44.150 zknode1" >> /etc/hosts
[root@zknode1 ~]# echo "192.168.44.151 zknode2" >> /etc/hosts
[root@zknode1 ~]# echo "192.168.44.152 zknode3" >> /etc/hosts
[root@zknode1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.44.150 zknode1
192.168.44.151 zknode2
192.168.44.152 zknode3
配置时间同步
需要保持集群所有主机的时间同步。RHEL 6 使用 ntpd
配置时间同步,RHEL 7 使用 chronyd
配置时间同步。
[root@zknode1 ~]# vi /etc/chrony.conf
server time.stonecoding.net iburst
[root@zknode1 ~]# systemctl restart chronyd.service
[root@zknode1 ~]# chronyc makestep
200 OK
[root@zknode1 ~]# chronyc sourcestats
210 Number of sources = 1
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev
==============================================================================
TIME.stonecoding.net 6 3 325 +9.811 25.043 +498us 871us
安装 JDK
在 官方网站 下载最新版本的 JDK,也可以下载 其他版本 的 JDK。
下载的安装包为:jdk-8u201-linux-x64.tar.gz。
在集群所有主机安装 JDK 并配置环境变量:
[root@zknode1 ~]# tar -xvzf jdk-8u201-linux-x64.tar.gz -C /usr/local/
[root@zknode1 ~]# vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export JAVA_HOME=/usr/local/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
[root@zknode1 ~]# source .bash_profile
[root@zknode1 ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
安装 ZooKeeper
在 官方网站 下载最新稳定版,下载的安装包为:apache-zookeeper-3.7.1-bin.tar.gz。
在集群所有主机解压安装 ZooKeeper 并配置环境变量:
[root@zknode1 ~]# tar -xvzf apache-zookeeper-3.7.1-bin.tar.gz -C /usr/local/
[root@zknode1 ~]# vi .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export JAVA_HOME=/usr/local/jdk1.8.0_201
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export ZK_HOME=/usr/local/apache-zookeeper-3.7.1-bin
export PATH=$PATH:${ZK_HOME}/bin
[root@zknode1 ~]# source .bash_profile
配置 ZooKeeper
在集群所有主机的 conf
目录下创建 ZooKeeper 配置文件:
[root@zknode1 ~]# cp /usr/local/apache-zookeeper-3.7.1-bin/conf/zoo_sample.cfg /usr/local/apache-zookeeper-3.7.1-bin/conf/zoo.cfg
[root@zknode1 ~]# vi /usr/local/apache-zookeeper-3.7.1-bin/conf/zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper/
autopurge.purgeInterval=1
clientPort=2181
initLimit=5
syncLimit=2
server.1=zknode1:2888:3888
server.2=zknode2:2888:3888
server.3=zknode3:2888:3888
然后分别在各个主机的 dataDir
目录创建 myid
文件,内容为配置文件中 server
的编号。
节点1:
[root@zknode1 ~]# mkdir /var/lib/zookeeper/
[root@zknode1 ~]# echo "1" > /var/lib/zookeeper/myid
节点2:
[root@zknode2 ~]# mkdir /var/lib/zookeeper/
[root@zknode2 ~]# echo "2" > /var/lib/zookeeper/myid
节点3:
[root@zknode3 ~]# mkdir /var/lib/zookeeper/
[root@zknode3 ~]# echo "3" > /var/lib/zookeeper/myid
启动 ZooKeeper
在集群所有主机启动 ZooKeeper :
[root@zknode1 ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/apache-zookeeper-3.7.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
客户端连接
[root@zknode1 ~]# zkCli.sh -server 127.0.0.1:2181