一、zookeeper 介绍
1)zookeeper简介
ZooKeeper致力于开发和维护实现高度可靠的分布式协调的开源服务器。ZooKeeper的目标是开发和维护开源服务器,是Hadoop和Hbase,kafka的重要组件。
ZooKeeper是一种集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以分布式应用程序的某种形式使用。
2)zookeeper集群中的各个角色
Leader
Leader服务器是zk集群工作机制的核心.
事务请求的唯一调度者和处理者,保证集群事务请求处理的顺序性
Follower
Follower服务器是zk集群状态的跟随者.
处理非事务请求,转发事务请求给Leader服务器
参与事务请求的proposal投票
参与Leader选举投票
Observer
Observer是一种新型的zk节点,Observer服务器只提供非事务服务.通常用于不影响集群事务处理能力的前提下提升集群的非事务的处理能力。
Observer有另外一个优势,因为它不参与投票,所以他们不属于zk集群的关键部位,即使他们Failed,或者从集群中断开,也不会影响集群的可用性。
3)集群机器要求
容错率 首先从容错率来说明:(需要保证集群能够有半数进行投票) 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节点的错误。 所以集群最少为3台,最好为5台
4)环境要求
zookeeper是基于java程序,需要安装java版本1.8以上。
5)下载地址
http://mirror.bit.edu.cn/apache/zookeeper/
二、zookeeper 安装
1)机器准备3台
192.168.44.31 zk0001 192.168.44.32 zk0002 192.168.44.33 zk0003
绑定hosts文件,实现主机名解析
2)准备安装包
[root@zk0001 opt]# cd /opt/ [root@zk0001 opt]# tar xf zookeeper-3.4.6.tar.gz [root@zk0001 opt]# mv zookeeper-3.4.6 zookeeper [root@zk0001 zookeeper]# ls bin dist-maven LICENSE.txt src build.xml docs NOTICE.txt zookeeper-3.4.6.jar CHANGES.txt ivysettings.xml README_packaging.txt zookeeper-3.4.6.jar.asc conf ivy.xml README.txt zookeeper-3.4.6.jar.md5 contrib lib recipes zookeeper-3.4.6.jar.sha1
3)修改配置文件。conf目录下的zoo.cfg
[root@zk0001 conf]# mv zoo_sample.cfg zoo.cfg [root@zk0001 conf]# cat zoo.cfg tickTime=2000 initLimit=10 syncLimit=5 dataDir=/tmp/zookeeper clientPort=2181 server.1=zk0001:2888:3888 server.2=zk0002:2888:3888 server.3=zk0003:2888:3888
以上操作,集群3台机器都要进行操作
4)区别修改的配置文件
[root@zk0001 conf]# mkdir -p /tmp/zookeeper/ [root@zk0001 conf]# touch /tmp/zookeeper/myid # 创建该文件,文件内容为配置文件设定的server id。 --------------------------------------------- [root@zk0001 conf]# cat /tmp/zookeeper/myid 1 [root@zk0002 ~]# cat /tmp/zookeeper/myid 2 [root@zk0003 ~]# cat /tmp/zookeeper/myid 3
5)3台同时启动
/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/bin/zkServer.sh stop /opt/zookeeper/bin/zkServer.sh status
4)加载到开机自启动
cd /etc/rc.d/init.d/ [root@zk0002 init.d]# cat zookeeper #!/bin/bash #chkconfig:2345 20 90 #description:zookeeper #processname:zookeeper export JAVA_HOME=/opt/jdk1.8.0_211 case $1 in start) su root /opt/zookeeper/bin/zkServer.sh start;; stop) su root /opt/zookeeper/bin/zkServer.sh stop;; status) su root /opt/zookeeper/bin/zkServer.sh status;; restart) su root /opt/zookeeper/bin/zkServer.sh restart;; *) echo "require start|stop|status|restart" ;; esac
特别注意,文件内容一样。
添加权限
chmod +x zookeeper
加载到开机自启动
chkconfig --add zookeeper
查看开机内容
[root@zk0002 init.d]# chkconfig --list Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'. netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off network 0:off 1:off 2:on 3:on 4:on 5:on 6:off zookeeper 0:off 1:off 2:on 3:on 4:on 5:on 6:off
启动测试
[root@zk0002 ~]# service zookeeper status JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Mode: follower [root@zk0002 ~]# service zookeeper stop JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Stopping zookeeper ... STOPPED [root@zk0002 ~]# service zookeeper status JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Error contacting service. It is probably not running. [root@zk0002 ~]# service zookeeper start JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@zk0002 ~]# service zookeeper status JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Mode: follower
三、与python交互
from kazoo.client import KazooClient zk = KazooClient(hosts='192.168.44.33:2181') #如果是本地那就写127.0.0.1 zk.start() #与zookeeper连接 #makepath=True是递归创建,如果不加上中间那一段,就是建立一个空的节点 zk.create('/home/qatest',b'this is my house',makepath=True) node = zk.get_children('/home') # 查看根节点有多少个子节点 print(node) zk.stop() #与zookeeper断开
四、集群状态检测。可作为监控
# -*- coding: utf-8 -*- import subprocess ''' ansible zk -m shell -a 'sudo service zookeeper status' {'zk0003': 'follower', 'zk0002': 'leader', 'zk0001': 'follower'} stop 服务没有启动 error 机器可能存在问题 ''' class ZookeeperCluster: def command(self,cmd): obj = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, # 正确结果 stderr=subprocess.PIPE # 错误结果 ) res = obj.stdout.read().split('\n') return res def parse(self,res): msg = {} for i in res: if "|" in i: result_len = res.index(i) + 1 host = i.split("|")[0].split()[0] if "leader" in res[result_len]: msg[host] = "leader" elif "follower" in res[result_len]: msg[host] = "follower" elif "Error" in res[result_len]: msg[host] = "stop" else: msg[host] = "error" return msg def main(self): cmd = "ansible zk -m shell -a 'sudo service zookeeper status'" res = self.command(cmd) result = self.parse(res) print(result) if __name__ == '__main__': Cluster = ZookeeperCluster() Cluster.main()
执行效果
[supper-user@iotansible0001 tools2]$ python main.py {'zk0003': 'follower', 'zk0002': 'leader', 'zk0001': 'follower'} [supper-user@iotansible0001 tools2]$ python main.py {'zk0003': 'follower', 'zk0002': 'leader', 'zk0001': 'stop'} [supper-user@iotansible0001 tools2]$ python main.py {'zk0003': 'follower', 'zk0002': 'leader', 'zk0001': 'error'}
echo stat | nc localhost 2181
https://blog.csdn.net/u013673976/article/details/47279707
浙公网安备 33010602011771号