标签:zk
本文参考以下链接:
http://www.cnblogs.com/yuyijq/p/4116365.html
http://www.cnblogs.com/yuyijq/p/3424473.html
http://www.cnblogs.com/yuyijq/p/3391945.html
那分布式协调服务又是个什么东西呢?首先我们来看“协调”是什么意思。
说到协调,我首先想到的是北京很多十字路口的交通协管,他们手握着小红旗,指挥车辆和行人是不是可以通行。如果我们把车辆和行人比喻成运行在计算机中的单元(线程),那么这个协管是干什么的?很多人都会想到,这不就是锁么?对,在一个并发的环境里,我们为了避免多个运行单元对共享数据同时进行修改,造成数据损坏的情况出现,我们就必须依赖像锁这样的协调机制,让有的线程可以先操作这些资源,然后其他线程等待。
节点状态: 每个集群中的节点都有一个状态 LOOKING, FOLLOWING, LEADING, OBSERVING。都属于这4种,每个节点启动的时候都是LOOKING状态,如果这个节点参与选举但最后不是leader,则状态是FOLLOWING,如果不参与选举则是OBSERVING,leader的状态是LEADING。
在FastLeaderElection里有一个Manager的内部类,这个类里有启动了两个线程:WorkerReceiver, WorkerSender。为什么说选举这部分复杂呢,我觉得就是这些线程就像左右互搏一样,非常难以理解。顾名思义,这两个线程一个是处理从别的节点接收消息的,一个是向外发送消息的。对于外面的逻辑接收和发送的逻辑都是异步的。
1. 判断消息里的epoch是不是比当前的大,如果大则消息里id对应的server我就承认它是leader
2. 如果epoch相等则判断zxid,如果消息里的zxid比我的大我就承认它是leader
3. 如果前面两个都相等那就比较一下server id吧,如果比我的大我就承认它是leader。
关于前面两个东西暂时我们不去关心它,对于新启动的集群这两者都是相等的。
那这样看来server id的大小也是leader选举的一环啊(有的人生下来注定就不平凡,这都是命啊)。
最后我们来看看,很多文章所介绍的,如果超过一半的人说它是leader,那它就是leader的逻辑吧
这里介绍的是一个新集群启动时候的选举过程,启动的时候就是根据zoo.cfg里的配置,向各个节点广播投票,一般都是选投自己。然后收到投票后就会进行进行判断。如果某个节点收到的投票数超过一半,那么它就是leader了。
了解了这个过程,我们来看看另外一个问题:
一个集群有3台机器,挂了一台后的影响是什么?挂了两台呢?
挂了一台:挂了一台后就是收不到其中一台的投票,但是有两台可以参与投票,按照上面的逻辑,它们开始都投给自己,后来按照选举的原则,两个人都投票给其中一个,那么就有一个节点获得的票等于2,2 > (3/2)=1 的,超过了半数,这个时候是能选出leader的。
挂了两台: 挂了两台后,怎么弄也只能获得一张票, 1 不大于 (3/2)=1的,这样就无法选出一个leader了。
一、环境介绍:至少3个节点,且必须为单数
原因:
在zookeeper的选举过程中,为了保证选举过程最后能选出leader,就一定不能出现两台机器得票相同的僵局,所以一般的,要求zk集群的server数量一定要是奇数,也就是2n+1台,并且,如果集群出现问题,其中存活的机器必须大于n+1台,否则leader无法获得多数server的支持,系统就自动挂掉。所以一般是3个或者3个以上节点。
系统:CentOS Linux release 7.3.1611 (Core)
软件版本:
zookeeper-3.4.10
java -version
java version "1.7.0_80"
在以下文件中添加以下内容
cat /etc/hosts
192.168.3.99 zk01.example.com
192.168.3.33 zk02.example.com
192.168.3.159 zk03.example.com
二、配置:
三台zookeeper配置文件相同
/opt/zookeeper-3.4.10/conf/zoo.cfg
tickTime=2000
autopurge.purgeInterval=2
dataLogDir=/opt/zookeeper-3.4.10/log/
initLimit=10
syncLimit=5
dataDir=/opt/zookeeper-3.4.10/data
clientPort=2181
server.1=192.168.3.99:2888:3888
这里的server.1要与/opt/zookeeper-3.4.10/conf/data/myid 数字与之对应
cat /opt/zookeeper-3.4.10/data/myid
1
server.2=192.168.3.33:2888:3888
cat /opt/zookeeper-3.4.10/data/myid
2
server.3=192.168.3.159:2888:3888
cat /opt/zookeeper-3.4.10/data/myid
3
名词解释:
在上面的例子中,我把三个zookeeper服务放到同一台机器上。上面的配置中有两个TCP port。后面一个是用于Zookeeper选举用的,而前一个是Leader和Follower或Observer交换数据使用的。
dataLogDir如果没提供的话使用的则是dataDir。zookeeper的持久化都存储在这两个目录里。dataLogDir里是放到的顺序日志(WAL)。而dataDir里放的是内存数据结构的snapshot,便于快速恢复。为了达到性能最大化,一般建议把dataDir和dataLogDir分到不同的磁盘上,这样就可以充分利用磁盘顺序写的特性。
syncLimit = 5 就表示fowller与leader的心跳时间是5 tick
autopurge.snapRetainCount,autopurge.purgeInterval -- 客户端在与zookeeper交互过程中会产生非常多的日志,而且zookeeper也会将内存中的数据作为snapshot保存下来,这些数据是不会被自动删除的,这样磁盘中这样的数据就会越来越多。不过可以通过这两个参数来设置,让zookeeper自动删除数据。autopurge.purgeInterval就是设置多少小时清理一次。而autopurge.snapRetainCount是设置保留多少个snapshot,之前的则删除。
配置-myid
在dataDir里会放置一个myid文件,里面就一个数字,用来唯一标识这个服务。这个id是很重要的,一定要保证整个集群中唯一。zookeeper会根据这个id来取出server.x上的配置。比如当前id为1,则对应着zoo.cfg里的server.1的配置。
2. 而且在后面我们介绍leader选举的时候,这个id的大小也是有意义的。
三、启动:
OK,上面就是配置的讲解了,现在我们可以启动zookeeper集群了。进入到bin目录,执行 ./zkServer.sh start即可。
/opt/zookeeper-3.4.10/bin/zkServer.sh start
四、测试连接
/opt/zookeeper-3.4.10/bin/zkCli.sh -server 192.168.3.159:2181
本文出自 “silence” 博客,请务必保留此出处http://silencezone.blog.51cto.com/3613477/1948638
标签:zk
原文地址:http://silencezone.blog.51cto.com/3613477/1948638