1.ZooKeeper是什么
ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
2.ZooKeeper集群搭建
需要先安装配置好java环境
安装包下载地址https://archive.apache.org/dist/zookeeper/选择stable稳定版本,目前是3.5.8的稳定版本
下载安装包
wget https://archive.apache.org/dist/zookeeper/stable/apache-zookeeper-3.5.8-bin.tar.gz
搭建三个集群节点,即三个ZooKeeper服务,新建三个文件夹
mkdir zookeeper1
mkdir zookeeper2
mkdir zookeeper3
将安装包复制到上述三个文件夹,分别解压
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
解压后的目录
bin 执行脚本
conf 配置文件
docs 文档
lib jar包
进入conf目录,ZooKeeper提供了一个配置文件示例zoo_sample.cfg,复制该文件
cp zoo_sample.cfg zoo1.cfg
其余两个zookeeper文件夹中进行同样的操作,文件名改为zoo2.cfg,zoo3.cfg
该配置文件中共5个参数
tickTime 通信心跳时间,服务器之间或客户端与服务器之间维持心跳的时间间隔,毫秒级,ZK基本上所有的时间都是这个时间的整数倍。
initLimit 初始通信时限,集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数
syncLimit 同步通信时限,集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数
dataDir 数据文件目录,内存数据库快照存放地址,如果没有指定事务日志存放地址(dataLogDir),默认也是存放在这个 路径下,建议两个地址分开存放到不同的设备上
clientPort 客户端连接端口,zookeeper会监听这个端口,接收客户端的访问请求
需要修改的参数
dataDir数据文件目录,分别使用/tmp/zookeeper1,/tmp/zookeeper2,/tmp/zookeeper3
clientPort客户端连接端口,每个zookeeper服务要启动在不同的端口,避免冲突,分别使用2181,2182,2183
需要增加的配置参数
server.x
server.1=127.0.0.1:3001:4001
server.2=127.0.0.1:3002:4002
server.3=127.0.0.1:3003:4003
这个三行配置在三个zookeeper配置中都是一样的,粘贴过去即可
该项配置的规则如下,格式server.n=A:B:C
1、统一前缀,"server.";
2、"server."后面的数字n表示机器的id(序号),不重复,需要在dataDir目录下新建myid文件,写入这个值
3、A表示集群中zk机器的ip;
4、B表示Zk集群中,follower与leader通信的端口;
5、C表示当leader宕机时,各follower选举新leader的通信端口;
配置信息如下
myid | dataDir路径 | clientPort | server通信端口 | leader选举端口 | 配置文件 |
1 | /tmp/zookeeper1 | 2181 | 3001 | 4001 | zoo1.cfg |
2 | /tmp/zookeeper2 | 2182 | 3002 | 4002 | zoo2.cfg |
3 | /tmp/zookeeper3 | 2183 | 3003 | 4003 | zoo3.cfg |
按上述表格所示在tmp文件夹下新建zookeeper1,zookeeper2,zookeeper3文件夹,创建myid文件并写入配置文件中server.n中的n的值到该文件
mkdir zookeeper1
touch myid
echo 1 > myid
其余两个做相同操作,myid值分别为2和3
配置完成,三个配置文件的内容
zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper1
clientPort=2181
server.1=127.0.0.1:3001:4001
server.2=127.0.0.1:3002:4002
server.3=127.0.0.1:3003:4003
zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper2
clientPort=2182
server.1=127.0.0.1:3001:4001
server.2=127.0.0.1:3002:4002
server.3=127.0.0.1:3003:4003
zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/tmp/zookeeper3
clientPort=2183
server.1=127.0.0.1:3001:4001
server.2=127.0.0.1:3002:4002
server.3=127.0.0.1:3003:4003
启动zookeeper服务
./zkServer.sh start /usr/zookeeper1/apache-zookeeper-3.5.8-bin/conf/zoo1.cfg
./zkServer.sh start /usr/zookeeper2/apache-zookeeper-3.5.8-bin/conf/zoo2.cfg
./zkServer.sh start /usr/zookeeper3/apache-zookeeper-3.5.8-bin/conf/zoo3.cfg
注意start后面要指定当前使用的配置文件
运行zookeeper命令行客户端
./zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
查看节点状态
./zkServer.sh status /usr/zookeeper2/apache-zookeeper-3.5.8-bin/conf/zoo2.cfg
2号节点为Leader节点,1,3号节点为follower节点
集群搭建完成
3.zookeeper集群节点个数最好是奇数个
zookeeper有这样一个特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。
假设一个集群有n个节点,宕机x个节点,那么要保证整个集群仍然可用就要满足不等式
n -x > n/2,即n > 2x
所以n可以取2x + m (m可以取1,2,3,4,5 .....)
n的最小值是2x + 1
所以最节约服务器资源的配置是奇数个节点