安装Zookeeper
首先可以从 apache.org 下载最新版本的Zookeeper: https://zookeeper.apache.org/releases.html#download 。建议下载未定版本。
下面演示的是Zookeeper的3.4.6稳定版的安装。
1. 单机服务
下面的例子慎示了如何使用基本的配置安装 Zookeeper,安装目录为 /usr/local/zookeeper,数据目录为/var/lib/zookeeper。
# tar-zxf zookeeper -3.4.6.tar.gzr
# mv zookeeper -3.4.6 /usr/local/zookeeper
# mkdir- p /var/lib/zookeeper
# cat > /usr/local/zookeeper/conf/zoo.cfg << EOF
> tickTime=2000
> dataDir=/var/lib/zookeeper
> clientPort=2181
> EOF
# export JAVA_HOME=/usr/java/ jdk1. 8.0_51
# /usr/local/zookeeper/bin/zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/ .. /conf/zoo.cfg
Startring zookeeper … STARTED
#
现在可以连到 Zookeeper 端口上,通过发送四字命令 srvr 来验证 Zookeeper 是否安装正确。
# telnet localhost 2181
Trying : : 1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.4.6-1569965, built on 02/20/2018 09:09 GMT
Latency min/avg/max: 0/0/0
Received : 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 4
Connection closed by foreign host.
#
2 . Zookeeper 群组( Ensemble)
Zookeeper 集群被称为群组。 Zookeeper 使用的是一致性协议,所以建议每个群组里应该包含奇数个节点(比如 3 个、 5 个等),因为只有当群组里的大多数节点处于可用状态, Zookeeper 才能处理外部的请求。也就是说,如果你有一个包含 3 个节点的群组,那么它允许一个节点失效。如果群组包含 5 个节点,那么它允许 2 个节点失效。
群组节点个数的选择
假设有一个包含5个节点的群组,如果要对群组做一些包括更换节点在内的配置更改,需要依次重启每一个节点一个节点的群组。如果你的群组无法容忍多个节点失效,那么在进行群组维护时就会存在风险。不过,也不建议一个群组包含超过 7 个节点,因为 Zookeeper 使用了一致性协议,节点过多会降低整个群组的性能。
群组需要有一些公共配置,上面列出了所有服务器的清单,并且每个服务器还要在数据目录中创建一个 myid 文件,用于指明自己的 ID。如果群组里服务器的机器名是 zoo1.example.com 、 zoo2.example.com 、 zoo3 .example.com ,那么配置文件可能是这样的:
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=20
syncLimit=5
server.1=zoo1.example.com:2888:3888
server.2=zoo2.example.com:2888:3888
server.3=zoo3.example.com:2888:3888
在这个配置中, initLimit表示用于在从节点与主节点之间建立初始化连接的时间上限,syncLimit表示允许从节点与主节点处于不同步状态的时间上限。这两个值都是tickTime的倍数,所以initLimit是 20*2000ms ,也就是 40s。配置里还列出了群组中所有服务器的地址。服务器地址遵循 server.X=hostname:peerPort:leaderPort 格式,各个参数说明如下:
X:服务器的 D,它必须是一个整数,不过不一定要从 0 开始,也不要求是连续的;
hostname:服务器的机器名或 IP 地址:
peerPort:用于节点间通信的 TCP 端口;
leaderPort:用于首领选举的 TCP 端口。
客户端只需要通过 clientPort 就能连接到群组,而群组节点间的通信则需要同时用到这 3 个端口( peerPort 、 leaderPort 、 clientPort )。除了公共的配置文件外,每个服务器都必须在 dataDir 目录中创建一个叫作 myid 的文件,文件里要包含服务器 ID,这个 ID 要与配置文件里配置的ID保持一致。
完成这些步骤后,就可以启动服务器,让它们彼此间进行通信了。