码迷,mamicode.com
首页 > 其他好文 > 详细

zookeeper集群安装

时间:2017-07-18 21:04:57      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:zk

本文参考以下链接:

http://www.cnblogs.com/yuyijq/p/4116365.html  

Zookeeper-Zookeeper leader选举

http://www.cnblogs.com/yuyijq/p/3424473.html

Zookeeper-Zookeeper可以干什么

http://www.cnblogs.com/yuyijq/p/3391945.html

Zookeeper--Zookeeper是什么


那分布式协调服务又是个什么东西呢?首先我们来看“协调”是什么意思。

说到协调,我首先想到的是北京很多十字路口的交通协管,他们手握着小红旗,指挥车辆和行人是不是可以通行。如果我们把车辆和行人比喻成运行在计算机中的单元(线程),那么这个协管是干什么的?很多人都会想到,这不就是锁么?对,在一个并发的环境里,我们为了避免多个运行单元对共享数据同时进行修改,造成数据损坏的情况出现,我们就必须依赖像锁这样的协调机制,让有的线程可以先操作这些资源,然后其他线程等待。

Zookeeper-Zookeeper leader选举

节点状态: 每个集群中的节点都有一个状态 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

zookeeper集群安装

标签:zk

原文地址:http://silencezone.blog.51cto.com/3613477/1948638

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!