Zookeeper学习-05 Zookeeper总体架构

1、Zookeeper总体架构

应用使用Zookeeper客户端库使用Zookeeper服务。Zookeeper客户端负责和Zookeeper的集群交互。
Zookeeper集群可以有两种模式:standalone模式和quorum模式。
处于standalone模式的Zookeeper集群中只有一个独立运行的Zookeeper节点。
处于quorum模式的Zookeeper集群中包含多个Zookeeper节点。


05-01Zookeeper总体架构.png

2、session

Zookeeper客户端库和Zookeeper集群中的节点创建一个session。
客户端可以主动关闭session。
如果Zookeeper节点没有在session关联的timeout时间内收到客户端的数据的话,Zookeeper节点也会关闭session。
另外Zookeeper客户端库如果发现连接的Zookeeper出错,会自动和其他Zookeeper的节点建立连接。


05-02Zookeeper集群.png

3、Quorum模式

处于Quorum模式的Zookeeper集群包含多个Zookeeper节点。例如下图的Zookeeper集群有三个节点,其中节点1是leader节点,节点2和节点3是follower节点。
leader节点可以处理读写请求,follower节点只可以处理读请求。fllower在接到写请求时会把写请求转发给leader来处理。


05-03 3节点Zookeeper集群.png

4、数据一致性

  1. 可线性化(Linearizable)写入:先到达leader的写请求会被先处理,leader决定写请求的执行顺序。
  2. 客户端FIFO顺序:来自给定客户端的请求按照发送顺序执行。

5、底层分布式选举算法

ZAB(ZooKeeper Atomic Broadcast)选举算法是为 ZooKeeper 实现分布式协调功能而设计的。相较于 Raft 算法的投票机制,ZAB 算法增加了通过节点 ID 和数据 ID 作为参考进行选主,节点 ID 和数据 ID 越大,表示数据越新,优先成为主。相比较于 Raft 算法,ZAB 算法尽可能保证数据的最新性。所以,ZAB 算法可以说是对 Raft 算法的改进。使用 ZAB 算法选举时,集群中每个节点拥有 3 种角色:
Leader,主节点;
Follower,跟随者节点;
Observer,观察者,无投票权。
选举过程中,集群中的节点拥有 4 个状态:
Looking 状态,即选举状态。当节点处于该状态时,它会认为当前集群中没有 Leader,因此自己进入选举状态。
Leading 状态,即领导者状态,表示已经选出主,且当前节点为 Leader。
Following 状态,即跟随者状态,集群中已经选出主后,其他非主节点状态更新为 Following,表示对 Leader 的追随。
Observing 状态 ,即观察者状态,表示当前节点为 Observer,持观望态度,没有投票权和选举权。

投票过程中,每个节点都有一个唯一的三元组 (server_id, server_zxID, epoch),其中 server_id 表示本节点的唯一 ID;server_zxID 表示本节点存放的数据 ID,数据 ID 越大表示数据越新,选举权重越大;epoch 表示当前选取轮数,一般用逻辑时钟表示。

ZAB 选举算法的核心是“少数服从多数,ID 大的节点优先成为主”,因此选举过程中通过 (vote_id, vote_zxID) 来表明投票给哪个节点,其中 vote_id 表示被投票节点的 ID,vote_zxID 表示被投票节点的服务器 zxID。ZAB 算法选主的原则是:server_zxID 最大者成为 Leader;若 server_zxID 相同,则 server_id 最大者成为 Leader

接下来,以 3 个 Server 的集群为例,此处每个 Server 代表一个节点,介绍 ZAB 选主的过程。

第一步:当系统刚启动时,3 个服务器当前投票均为第一轮投票,即 epoch=1,且 zxID 均为 0。此时每个服务器都推选自己,并将选票信息 <epoch, vote_id, vote_zxID> 广播出去。

05-zab-step1.png

第二步:根据判断规则,由于 3 个 Server 的 epoch、zxID 都相同,因此比较 server_id,较大者即为推选对象,因此 Server 1 和 Server 2 将 vote_id 改为 3,更新自己的投票箱并重新广播自己的投票。
05-zab-step02.png

第三步:此时系统内所有服务器都推选了 Server 3,因此 Server 3 当选 Leader,处于 Leading 状态,向其他服务器发送心跳包并维护连接;Server1 和 Server2 处于 Following 状态。
05-zab-step3.png

总结:
ZAB 算法性能高,对系统无特殊要求,采用广播方式发送信息,若节点中有 n 个节点,每个节点同时广播,则集群中信息量为 n*(n-1) 个消息,容易出现广播风暴;且除了投票,还增加了对比节点 ID 和数据 ID,这就意味着还需要知道所有节点的 ID 和数据 ID,所以选举时间相对较长。但该算法选举稳定性比较好,当有新节点加入或节点故障恢复后,会触发选主,但不一定会真正切主,除非新节点或故障后恢复的节点数据 ID 和节点 ID 最大,且获得投票数过半,才会导致切主。

6、三个节点quorum模式Zookeeper集群(伪集群)构建

1)准备三个配置文件,其中dataDir和clientPort配置项要配置不同的值。三个配置文件的server.n部分都是一样的。同时在每个节点的dataDir目录下,需要创建myid文件,三个节点的myid文件内容分别为1、2和3


05-04 三个不同的文件.png

node1节点的配置内容:


05-05node节点配置.png

05-06myid文件目录.png

2)通过以下命令启动集群
zkServer.sh start-foreground /usr/local/apache-zookeeper-3.6.0-bin/conf/zoo-quorum-node1.cfg
zkServer.sh start-foreground /usr/local/apache-zookeeper-3.6.0-bin/conf/zoo-quorum-node2.cfg
zkServer.sh start-foreground /usr/local/apache-zookeeper-3.6.0-bin/conf/zoo-quorum-node3.cfg

说明:start-foreground 选项,让zkServer.sh在前台运行,把日志直接输出到console.如果日志输出到日志文件的话,因为是伪集群模式,会把日志输出到同一个文件。

  1. 在启动第一个节点的时候,会报一下错误信息:
    这是因为我们集群设置的是3个节点,在其他节点还没有启动的情况下,它是无法跟其他节点建立连接的:


    05-07启动第一个节点.png
  2. 启动第二个节点,那么现在集群中就存在两个节点了,并且第二个节点为leading状态,即为主节点


    05-08启动第二个节点.png

    第一个节点为following状态,即跟随者状态:


    05-09第一个节点的状态.png
  3. 启动第三个节点,触发选主
    第二个节点是主节点:


    05-10启动第三个节点.png

    第一个和第三个都是跟随者节点:


    05-11跟随节点.png

    05-12跟随节点.png

    其他说明:
    启动zookeeper失败提示8080端口被占用,这是zookeeper3.5的特性

    Zookeeper AdminServer,默认使用8080端口


    05-13AdminServer异常.png

    解决方法:
    修改zoo.cfg文件的配置,添加如下配置
admin.serverPort=8888

或者在启动脚本中增加 -Dzookeeper.admin.serverPort=端口号.
修改后再次启动zookeeper,查看启动日志,启动成功。

  1. 使用 zkCli客户端进行连接
zkCli.sh -server 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183
05-14客户端连接.png

根据日志,说明跟第一个节点建立了连接,并且也能够正常使用


05-15客户端连接第一个节点.png

如果此时杀掉第一个节点,来查看客户端是否能够重连:


05-16kill掉第一个节点.png

此时可以看到,客户端重新连接到了第三个节点,而且也能够正常使用:
05-17客户端重新连接.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • Google的三篇论文影响了很多很多人,也影响了很多很多系统。这三篇论文一直是分布式领域传阅的经典。根据MapRe...
    java欧阳丰阅读 229评论 0 0
  • 前言: 在Google上有三篇论文影响了很多很多人,也影响了很多很多系统。这三篇论文一直是分布式领域传阅的经典。根...
    程序源monster阅读 365评论 1 0
  • 浅谈分布式服务协调技术 Zookeeper Google的三篇论文影响了很多很多人,也影响了很多很多系统。这三篇论...
    algernoon阅读 1,566评论 1 12
  • 最近在学习ZooKeeper,一直想写篇相关博文记录下学习内容,碍于自己是个拖延症重度患者总是停留在准备阶段,直到...
    Lexus90511阅读 7,851评论 5 14
  • 声明:本文写的时候,当时就是完全不懂zk,边看网上的文章边学习归纳和整理,这不是我的产出,不用点赞打赏。大家理智友...
    _Zy阅读 75,766评论 38 129