zookeeper安装
该安装包免安装只需解压启动。官网:https://zookeeper.apache.org/doc/r3.6.1/
1 环境检查
#查看zookeeper进程,是否有zookeeper在启动 #查看是否有安装zookeeper find / -name zkServer.sh |
当查询到有zkServer.sh文件时,说明已安装过zookeeper,查看已安装zookeeper的zoo.cnf配置文件配置的dataDir和port属性。如果没有查询到zkServer.sh文件继续下一步。
#/usr/local/env/zookeeper-3.6.1/为上一步操作查询结果/usr/local/env/zookeeper-3.6.1/bin/zkServer.sh 的bin目录上一级全路径 cd /usr/local/env/zookeeper-3.6.1/ cd /conf #查看zoo.cf配置文件 cat zoo.cfg如下图所示 |
在配置时,避免与已安装的服务占用相同的dataDir和port。
2上传解压
上传apache-zookeeper-3.6.1-bin.tar.gz到/usr/local/env/pkg cd /usr/local/env/pkg tar -xzvf apache-zookeeper-3.6.1-bin.tar.gz -C /usr/local/env/ cd /usr/local/env |
3配置
(1)单节点配置
cd apache-zookeeper-3.6.1-bin #查看磁盘目录大小 df –h #创建zookeeper数据存储目录,需要查看目录磁盘大小,放到最大磁盘目录 mkdir –p /home/data/zookeeper-3.6.1/data/ #log目录可以不用手动创建,在配置文件中配置后,可自动创建 mkdir –p /home/data/zookeeper-3.6.1/log/ #创建一份zookeeper的配置文件 cp conf/zoo_sample.cfg conf/zoo.cfg #编辑配置 vim conf/zoo.cfg |
内容如下
#修改 dataDir属性的值 dataDir= /home/data/zookeeper-3.6.1/data #新增log存储 dataLogDir=/home/data/zookeeper-3.6.1/log |
建立软连接
#建立目录软连接 ln -s /usr/local/env/apache-zookeeper-3.6.1-bin /usr/local/zookeeper |
(2)集群配置
在搭建 zookeeper 集群之前,我们首先要明白为什么要选择三台机器搭建,2台不可以吗?4台不可以吗?
zookeeper 集群通常是用来对用户的分布式应用程序提供协调服务的,为了保证数据的一致性,对 zookeeper 集群进行了这样三种角色划分:leader、follower、observer分别对应着总统、议员和观察者。
总统(leader):负责进行投票的发起和决议,更新系统状态。
议员(follower):用于接收客户端请求并向客户端返回结果以及在选举过程中参与投票。
观察者(observer):也可以接收客户端连接,将写请求转发给leader节点,但是不参与投票过程,只同步leader的状态。通常对查询操作做负载。
我们知道,在每台机器数据保持一致的情况下,zookeeper集群可以保证,客户端发起的每次查询操作,集群节点都能返回同样的结果。
但是对于客户端发起的修改、删除等能改变数据的操作呢?集群中那么多台机器,你修改你的,我修改我的,最后返回集群中哪台机器的数据呢?
这就是一盘散沙,需要一个领导,于是在zookeeper集群中,leader的作用就体现出来了,只有leader节点才有权利发起修改数据的操作,而follower节点即使接收到了客户端发起的修改操作,也要将其转交给leader来处理,leader接收到修改数据的请求后,会向所有follower广播一条消息,让他们执行某项操作,follower 执行完后,便会向 leader 回复执行完毕。当 leader 收到半数以上的 follower 的确认消息,便会判定该操作执行完毕,然后向所有 follower 广播该操作已经生效。
所以zookeeper集群中leader是不可缺少的,但是 leader 节点是怎么产生的呢?其实就是由所有follower 节点选举产生的,讲究民主嘛,而且leader节点只能有一个,毕竟一个国家不能有多个总统。
这个时候回到我们的小标题,为什么 zookeeper 节点数是奇数,我们下面来一一来说明:
①、容错率
首先从容错率来说明:(需要保证集群能够有半数进行投票)
2台服务器,至少2台正常运行才行(2的半数为1,半数以上最少为2),正常运行1台服务器都不允许挂掉,但是相对于 单节点服务器,2台服务器还有两个单点故障,所以直接排除了。
3台服务器,至少2台正常运行才行(3的半数为1.5,半数以上最少为2),正常运行可以允许1台服务器挂掉
4台服务器,至少3台正常运行才行(4的半数为2,半数以上最少为3),正常运行可以允许1台服务器挂掉
5台服务器,至少3台正常运行才行(5的半数为2.5,半数以上最少为3),正常运行可以允许2台服务器挂掉
②、防脑裂
脑裂集群的脑裂通常是发生在节点之间通信不可达的情况下,集群会分裂成不同的小集群,小集群各自选出自己的leader节点,导致原有的集群出现多个leader节点的情况,这就是脑裂。
3台服务器,投票选举半数为1.5,一台服务裂开,和另外两台服务器无法通行,这时候2台服务器的集群(2票大于半数1.5票),所以可以选举出leader,而 1 台服务器的集群无法选举。
4台服务器,投票选举半数为2,可以分成 1,3两个集群或者2,2两个集群,对于 1,3集群,3集群可以选举;对于2,2集群,则不能选择,造成没有leader节点。
5台服务器,投票选举半数为2.5,可以分成1,4两个集群,或者2,3两集群,这两个集群分别都只能选举一个集群,满足zookeeper集群搭建数目。
以上分析,我们从容错率以及防止脑裂两方面说明了3台服务器是搭建集群的最少数目,4台发生脑裂时会造成没有leader节点的错误。
配置详情如下:
cd apache-zookeeper-3.6.1-bin #查看磁盘目录大小 df –h #创建zookeeper数据存储目录,需要查看目录磁盘大小,放到最大磁盘目录 mkdir –p /home/data/zookeeper-3.6.1/data/ #log目录可以不用手动创建,在配置文件中配置后,可自动创建 mkdir –p /home/data/zookeeper-3.6.1/log/ #创建一份zookeeper的配置文件 cp conf/zoo_sample.cfg conf/zoo.cfg #编辑文件内容 vim conf/zoo.cfg |
#内容如下
#修改 dataDir属性的值 dataDir= /home/data/zookeeper-3.6.1/data #新增log存储 dataLogDir=/home/data/zookeeper-3.6.1/log #增加各节点的zookeeper服务信息,ip以实际服务器节点为准 #server.A=B:C:D #A:其中 A 是一个数字,表示这个是服务器的编号,对应myid文件内容; #B:是这个服务器的 ip 地址; #C:Leader选举的端口; #D:Zookeeper服务器之间的通信端口。 server.0=192.168.80.44:2888:3888 server.1=192.168.80.45:2888:3888 server.2=192.168.80.46:2888:3888 |
创建myid
cd /home/data/zookeeper-3.6.1/data/ vim myid #内容为各服务编号: 0 |
#保存建立目录软连接 ln -s /usr/local/env/apache-zookeeper-3.6.1-bin /usr/local/zookeeper |
4 启动停止
#启动 sh /usr/local/zookeeper/bin/zkServer.sh start #停止 sh /usr/local/zookeeper/bin/zkServer.sh stop #状态查看 sh /usr/local/zookeeper/bin/zkServer.sh status #备注:单节模式 mode为standalone;集群模式mode会有一个leader节点,多个follower节点 |
# jps 显示当前系统的java进程情况及进程id,QuorumPeerMain 为zookeeper的进程 jps |
zkCli.sh -server ip:port #查看zookeeper中已经注册的内容,可以查看本机也可以查看远程。