zookeeper概述

Zookeeper是什么

Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的数据一致性问题。

  • 本质上是一个分布式的小文件存储系统。
  • 提供给客户端监控存储在zookeeper内部数据的功能,从⽽可以达到基于数据的集群管理目的。诸如: 统⼀命名服务(dubbo)、分布式配置管理(solr的配置集中管理)、分布式消息队列(sub/pub)、分布式锁、分布式协调等功能。

Zookeeper角色架构

zookeeper概述.png
  • Leader
    • Zookeeper集群工作的核心角色;
    • 集群内部各个服务器的调度者;
    • 事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性;对于 create,setData,delete 等有写操作的请求,则需要统⼀转发给leader 处理, leader 需要决定编号、执⾏操作,这个过程称为⼀个事务。
  • Follower
    • 处理客户端非事务(读操作)请求。
    • 转发事务给Leader。
    • 参与Leader的选举投票。
  • Observer
    • 观察者角色,观察 Zookeeper 集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进⾏独⽴处理,对于事务请求,则会转发给 Leader服务器进⾏处理。
    • 不会参与任何形式的投票只提供非事务服务,通常⽤于在不影响集群事务处理能力的前提下提升集群的非事务处理能⼒。增加了集群增加并发的读请求。

Zookeeper的节点

Zookeeper的节点类型可以分为三大类:

  • 持久性节点(Persistent)
  • 临时性节点(Ephemeral)
  • 顺序性节点(Sequential)
    在实际创建节点的时候,会组合出四种节点类型:
  • 持久节点
  • 持久顺序节点
  • 临时节点
  • 临时顺序节点

节点具体描述:
持久节点:是Zookeeper中最常⻅的⼀种节点类型,所谓持久节点,就是指节点被创建后会⼀直存在服务器,直到删除操作主动清除;
持久顺序节点:就是有顺序的持久节点,节点特性和持久节点是⼀样的,只是额外特性表现在顺序上。顺序特性实质是在创建节点的时候,会在节点名后⾯加上⼀个数字后缀,来表示其顺序;
临时节点:就是会被⾃动清理掉的节点,它的⽣命周期和客户端会话绑在⼀起,客户端会话结束,节点会被删除掉。与持久性节点不同的是,临时节点不能创建⼦节点;
临时顺序节点:就是有顺序的临时节点,和持久顺序节点相同,在其创建的时候会在名字后⾯加上数字后缀;

事务ID:在Zookeeper中,对节点数据进行更改的称为事务,概述为能够改变Zookeeper服务器状态的操作。对于每一个事务请求,Zookeeper都会为其分配一个全局唯一的事务ID,用ZXID(自增长的)表示,通常是64位的数字。每个ZXID对应一次数据的更新操作,从这些ZXID的顺序可以间接识别出Zookeeper处理这些更新操作请求的全局顺序。

节点的状态信息

[zk: localhost:2181(CONNECTED) 0] get /

cZxid = 0x0  # Create ZXID,表示节点被创建时的事务ID
ctime = Thu Jan 01 08:00:00 CST 1970  # Create Time,表示节点创建时间
mZxid = 0x0 #  Modified ZXID,表示节点最后⼀次被修改时的事务ID
mtime = Thu Jan 01 08:00:00 CST 1970 #  Modified Time,表示节点最后⼀次被修改的时间
pZxid = 0x3600000010 # 该节点的子节点列表最后一次修改的事务ID
cversion = 126 # 子节点的版本号
dataVersion = 0 # 内容版本号
aclVersion = 0 # 标识acl版本
ephemeralOwner = 0x0 # 表示创建该临时节点时的会话sessionID,如果是持久节点那么值为0
dataLength = 0 # 表示数据长度
numChildren = 14 # 表示直系子节点数

Watcher机制

Zookeeper使用Watcher机制实现分布式数据的发布/订阅功能

发布/订阅
发布/订阅系统定义了一种一对多的订阅关系,能够让多个订阅者同时监听某一个主题对象,当该主题对象的状态发生变化时,发布者会通知所有订阅者,使他们能够做出相应的处理。

在Zookeeper中,其允许客户端向服务端注册一个Watcher监听,当服务端的一些指定事件触发了这个Watcher时,那么Zookeeper就会向指定客户端发送一个事件通知来实现分布式的通知功能。


Watcher注册通知过程.png

具体⼯作流程为:
客户端在向Zookeeper服务器注册的同时,会将Watcher对象存储在客户端的WatcherManager当中,当Zookeeper服务器触发Watcher事件后,会向客户端发送通知客户端线程从WatcherManager中取出对应的Watcher对象来执⾏回调逻辑。

Leader选举

选举机制

  • 半数机制:集群存活节点达半数以上,集群可用,因此Zookeeper适合安装奇数台服务器。
  • Zookeeper虽然在配置⽂件中并没有指定Master和Slave。但是,Zookeeper⼯作时,是有⼀个节点为Leader,其它为Follower,Leader是通过内部的选举机制产⽣的。

集群⾸次启动
在Zookeeper首次启动时,在这里假设是按照id值的序号来顺序启动,分析其如何进行选举。

zookeeper_server.png
  1. 首先id为1的节点启动,此时集群只有一台机器启动,该节点发出去的报文无响应,因此保持LOKKING状态。
  2. 接着id为2的节点启动,此时它和id为1的节点通信,互相交换⾃⼰的选举结果,由于两者都没有历史数据,所以id值较⼤的server2胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例⼦中的半数以上是3),所以服务器1、2还是继续保持LOOKING状态。
  3. 接着id为3的节点启动,根据前面的分析得到此时id为3的节点被选举为Leader。
  4. 随后id为4,5的节点依次启动后,虽然它们的id值大,但是集群中已经有半数以上的节点选举了节点3为Leader,所以节点4,5只能做Follower。

集群非首次启动
每个节点在选举时都会参考⾃身节点的zxid值(事务ID);优先选择zxid值⼤的节点称Leader!!

ZAB⼀致性协议

ZAB协议是Zookeeper为了解决集群分布式数据一致性问题。
为什么要进行数据的分布式存储?在Zookeeper中有两个好处:

  • 消除单点故障问题。将数据复制到多台机器上,防止一台机器宕机导致系统的不可用。
  • 负载均衡。能够让分布在不同机器上的数据都能够提供对外的客户端服务,有效提高性能。

但是Zookeeper引入了数据的分布式存储时,就可能会因为各种原因产生数据不一致的情况。
因此ZAB一致性协议就是用来解决这个问题。

ZAB协议
ZK就是分布式⼀致性问题的⼯业解决⽅案,paxos是其底层理论算法(晦涩难懂著名),其中zab,raft和众多开源算法是对paxos的⼯业级实现。ZK没有完全采⽤paxos算法,⽽是使⽤了⼀种称为Zookeeper Atomic Broadcast(ZAB,Zookeeper原⼦消息⼴播协议)的协议作为其数据⼀致性的核⼼算法。

ZAB 协议是为分布式协调服务 Zookeeper 专⻔设计的⼀种⽀持崩溃恢复原⼦⼴播协议。

ZAB的具体体现

主备模式保证⼀致性

image.png

ZK怎么处理集群中的数据?
所有客户端写⼊数据都是写⼊Leader中,然后,由 Leader 复制到Follower中。ZAB会将服务器数据的状态变更以事务Proposal的形式⼴播到所有的副本进程上,ZAB协议能够保证了事务操作的⼀个全局的变更序号(ZXID)

广播消息
ZAB协议的消息广播过程类似于二阶段提交过程
对于客户端提交的写请求全部由Leader接收,Leader 将请求封装成⼀个事务 Proposal(提议),将其发送给所有 Follwer ,如果收到超过半数反馈ACK,则执⾏ Commit 操作(先提交⾃⼰,再发送 Commit 给所有 Follwer)。




不能正常反馈Follower恢复正常后会进⼊数据同步阶段最终与Leader保持⼀致;

细节如下:

  • Leader接收到Client请求之后,会将这个请求封装成⼀个事务,并给这个事务分配⼀个全局递增的唯⼀ ID,称为事务ID(ZXID),ZAB 协议要求保证事务的顺序,因此必须将每⼀个事务按照 ZXID进⾏先后排序然后处理。
  • ZK集群为了保证任何事务操作能够有序的顺序执⾏,只能是 Leader 服务器接受写请求,即使是Follower 服务器接受到客户端的请求,也会转发到 Leader 服务器进⾏处理。

zk提供的应该是最终⼀致性的标准。zk所有节点接收写请求之后可以在⼀定时间内保证所有节点都能看到该条数据。

Leader 崩溃问题
Leader宕机后,ZK集群⽆法正常⼯作,ZAB协议提供了⼀个⾼效且可靠的leader选举算法。
Leader宕机后,被选举的新Leader需要解决的问题:

  • ZAB 协议确保那些已经在 Leader 提交的事务最终会被所有服务器提交
  • ZAB 协议确保丢弃那些只在 Leader 提出/复制,但没有提交的事务

基于上⾯的⽬的,ZAB协议设计了⼀个选举算法:能够确保已经被Leader提交的事务被集群接受,丢弃还没有提交的事务。
这个选举算法的关键点:保证选举出的新Leader拥有集群中所有节点最⼤编号(ZXID)的事务

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