Zookeeper 的核心原理

Zookeeper 的由来

  1. 各个节点的数据一致性

  2. 怎么保证任务只在一个节点执行

  3. 如果orderserver1挂了,其他节点如何发现并接替

  4. 存在共享资源,互斥性、安全性

Apache 的Zookeeper

Google 的Chubby 是一个分布式锁服务,通过Google Chubby 来解决分布式协作、Master选举等与分布式锁服务相关的问题

Zookeeper 的设计猜想

  1. 防止单点故障

    1. 集群方案(Leader Follower)还能分担请求,既做了高可用,又做高性能

  2. 每个节点的数据是一致的(必须要有leader)

    leader master(带中心化的) redis-cluser (无中心化的)

  3. 集群中的leader 挂了,怎么办?数据怎么恢复?

    选举机制?数据恢复

  4. 如何去保证数据一致性?(分布式事务)

    2PC 协议、二阶提交

2PC

(Two Phase Commitment Protocol)当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个“协调者”(TM)来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为AP。TM 负责调度AP 的行为,并最终决定这些AP是否要把事务真正进行提交;因为整个事务分为两个阶段提交,所以叫2PC.

阶段一:提交事务请求

  1. 事务询问

    1. 协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。

  2. 执行事务

    1. 各个参与者节点执行事务操作,并将Undo和Redo信息记录到事务日志中,尽量把提交过程中所有消耗时间的操作和准备的提前完成确保后面100%成功提交事务

  3. 各个参与者向协调者反馈事务询问的响应

    1. 如果各个参与者都成功执行了事务操作,那么就反馈给参与者yes的响应,表示事务可以执行;

    2. 如果参与者没有成功执行事务,就反馈给协调者no的响应,表示事务不可以执行;

    3. 2pc 协议的第一个阶段称为“投票阶段”,即各参与者投票表名是否需要继续执行接下去的事务提交操作。

阶段二:执行事务提交

在这个阶段,协调者会根据各参与者的反馈情况来决定最终是否可以进行事务提交操作;

两种可能:

  • 执行事务

  • 中断事务

Zookeeper 的集群角色

在zookeeper中,客户端随机连接到zookeeper中的一个节点。

如果是读请求,就直接从当前节点中读取数据

如果是写请求,那么请求会转发给leader 提交事务,然后leader将事务广播给集群中的follower节点(注意obeserver节点不参与投票),Follower 节点给leader 一个ack (ack表示当前的节点是不是能执行这个事务),只要有超过半数节点写入成功,那么写请求就会被提交。集群节点需要(2n+1)

Leader 角色

是zookeeper中的整个核心,起到了主导整个集群的作用

  1. 事务请求的调度和处理

  2. 保证事务处理的顺序性

Follower角色

  1. 处理客户端的非事务请求,

  2. 转发事务请求给leader服务器

  3. 参与事务请求Proposal 的投票(需要半数以上服务器通过才能通知leader commit数据; Leader发起的提案, 要求Follower投票)

  4. 参与leader节点选举的投票

Observer角色

是一个观察者角色

  1. 了解集群中的状态变化 ,和对这些状态进行同步

  2. 工作原理和follower节点一样,唯一差别是不参与事务请求的投票,不参与Leader选举

  3. Observer 只提供非事务请求,通常在于不影响集群事务处理能力的前提下,提升集群非事务处理能力

注:

为什么需要2n+1节点

表示奇数节点, zookeeper中要正常对外提供服务的话,它里面有个投票机制,这个机制就是必须要有过半的机器正常工作,并且能够彼此完成通信进行事务投票结果。

ZAB协议

ZAB(Zookeeper Atomic Broadcast) 协议是为分布式协调服务。ZooKeeper 专门设计的一种支持崩溃恢复的原子 广播协议。在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。

ZAB

支持崩溃恢复的原子广播协议,主要用于数据一致性

ZAB协议基本模式

  • 崩溃恢复(恢复leader节点和恢复数据)

  • 原子广播

消息广播的实现原理

消息广播过程实际是一个简化版的二阶提交。2PC

  1. leader 接收到消息请求后,将消息赋予一个全局唯一的64位自增id(ZXID)。ZXID大小,实现因果有序的特征。

  2. leader 为每一个follower 准备了一个FIFO队列,将带有zxid的消息作为一个提案(Proposal)分发给所有follower

  3. 当follower 收到proposal,先把proposal写到磁盘,写入成功后,再向leader 回复一个ack

  4. 当leader接收到合法数量的ack后,leader 就会向这个follower 发送commit命令,同时会在本地执行该消息。

  5. 当follower 收到消息的commit以后,会提交该消息。

注:leader 的投票过程,不需要Observer 的ack,但是Observer必须要同步Leader的数据,保证数据的一致性。

崩溃恢复

  1. 当leader失去了过半的follower节点的联系

  2. 当leader服务器宕机

集群进去崩溃恢复阶段

对于数据恢复来说

  1. 已经处理的消息不能丢失

    1. 当leader 收到合法数量的follower 的ack以后,就会向各个follower 广播消息(commit命令),同时自己也会commit 这条事务消息。

    2. 如果follower节点收到commit命令之前,leader挂了,会导致部分节点收到commit,部分节点没有收到。

    3. ZAB协议需要保证已经处理的消息不能丢失。

  2. 被丢弃的消息不能再次出现

  3. 当Leader收到事务请求,还未发起事务投票之前,leader挂了

ZAB 协议需要满足以上两种情况,必需要设计一个leader选举算法:能够保证已经被leader提交的事务Proposal能够提交、同时丢弃已经被跳过的事务Proposal。

ZAB的设计思想

  1. zxid 是最大的

    1. 如果leader选举算法能够保证新选举出来的leader服务器拥有集群中所有机器最高编号(ZXID最大)的事务Proposal,那么就可以保证这个新选举出来的Leader一定具有已经提交的提案。因为所有提案被Commit之前必须有超过半数的Follower ACK,即必须有超过半数的服务器的事务日志上有该提案的proposal,因此,只要有合法数量的节点正常工作,就必然有一个节点保存了所有被commit消息的proposal状态。

  2. epoch的概念,每产生一个新的leader,那么新的leader的epoch会+1,zxid 是64位的数据,低32位表示消息计数器(自增),每收到一条消息,这个值+1,新 leader选举后这个值重置为0。这样设计的原因在于,老的leader 挂了以后重启,他不会选举为leader,y因此此时它的zxid肯定小于当前新的leader.当老的 leader 作为 follower 接入新的 leader 后,新的 leader会让它将所有的拥有旧的epoch号的未被COMMIT的proposal清除 .高32位会存储epoch编号

ZXID

ZXID ,事务ID

为了保证事务顺序的一致性,Zookeeper 采用了递增的事务id号来标识事务。

所有的提议Proposal都在被提出的时候加上了zxid.

ZXID 是一个64位的数字(低32位和高32位组成)

  • 低32位:表示消息计数器

  • 高32位 :表示epoch,用来标识 leader 关系是否改变。 每次一个leader被选出来,都会有一个新的epoch(原来的epoch+1),标识当前属于那个leader的统治时期。

注:

epoch: 可以理解为当前集群所处的年代或者周期。

leader: 类似,有自己的年号,每次变更都会在前一个年代上加1。

Linux下查看epoch

/tmp/zookeeper/VERSION-2 路径会看到一个 currentEpoch文件。文件显示的是当前的epoch

通过命令查看事务日志

java -cp :/opt/zookeeper/zookeeper-3.4.10/lib/slf4j-api-1.6.1.jar:/opt/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.jar org.apache.zookeeper.server.LogFormatter /tmp/zookeeper/version-2/log.100000001

Leader 选举

注:

Fast Leader

ZXID(事务ID)事务ID 越大,那么表示数据越新, 最大会设置为Leader, ,

epoch ,每一轮投票,epoch 都会递增

myid (服务器id ,server id)

myid 越大,在leader 选举机制中权重越大

服务启动时的状态都是LOOKING,观望状态

LEADING

FOLLOWING

OBSERVING

服务器启动时的Leader 选举

  1. 每个服务器发出一个投票,初始情况,都会将自己作为Leader服务器进行投票,然后发送给其他集群中的服务器。

    1. 投票信息包含(myid,zxid,epoch)

  2. 接受来自各个服务器的投票

    1. 判断该投票是否有效

      1. 检查是否来自本轮投票epoch

      2. 检查是否来时LOOKING状态的服务器

  3. 处理投票

    1. 检查ZXID,如果ZXID比较大,那么设置为Leader,

    2. 如果ZXID相同,会检查myid,myid比较大的,设置为leader

  4. 统计投票

    1. 判断是否已经有过半机器接受到相同的投票信息

    2. 如果有过半机器接受,便认为已经选举出了Leader

  5. 改变服务器状态

    1. 如果是Follower,那么状态变为FOLLOWING

    2. 如果是Leader,那么状态变为LEADING

Leader 崩溃时的Leader选举

  1. 变更状态

    1. Leader 挂后,余下非Observer服务器都会将自己的服务器状态变为LOOKING,

    2. 开始进入Leader选举过程

  2. 每个Server会发起一个投票。

    1. 运行期间,ZXID 可能不同,然后将各自的投票发送给集群中的所有机器。

  3. 其余与启动时过程相同。

Zookeeper核心原理的更多相关文章

  1. hadoop系列:zookeeper(2)——zookeeper核心原理(选举)

    1.前述 上篇文章<hadoop系列:zookeeper(1)--zookeeper单点和集群安装>(http://blog.csdn.net/yinwenjie/article/deta ...

  2. 深入了解Zookeeper核心原理

    之前的文章Zookeeper基础原理&应用场景详解中将Zookeeper的基本原理及其应用场景做了一个详细的介绍,虽然介绍了其底层的存储原理.如何使用Zookeeper来实现分布式锁.但是我认 ...

  3. zookeeper核心原理全面解析

    下述各zookeeper机制的java客户端实践参考zookeeper java客户端之curator详解. 官方文档http://zookeeper.apache.org/doc/current/z ...

  4. zookeeper工作原理、安装配置、工具命令简介

    1.Zookeeper简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. 2.zo ...

  5. Zookeeper 3、Zookeeper工作原理(详细)

    1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...

  6. 高性能消息队列 CKafka 核心原理介绍(上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:闫燕飞 1.背景 Ckafka是基础架构部开发的高性能.高可用消息中间件,其主要用于消息传输.网站活动追踪.运营监控.日志聚合.流式 ...

  7. [转载] zookeeper工作原理、安装配置、工具命令简介

    转载自http://www.cnblogs.com/kunpengit/p/4045334.html 1 Zookeeper简介Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到 ...

  8. Zookeeper 3、Zookeeper工作原理(转)

    1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...

  9. ZooKeeper的原理(转)

    一.ZooKeeper的角色 领导者(Leader),负责进行投票的发起和决议,更新系统状态. 学习者(Learner),包括跟随者(Follower)和观察者(Observer),Follower用 ...

随机推荐

  1. react组件直接在document上添加事件

    demo:比如组件里有个div写的框框,点击document body的背景色变红,点击div写的框框没效果 componentDidMount(){ document.onclick = this. ...

  2. 用jquery实现带左右按键的轮播图

    成品如下: 简单来说就是点击“右”按钮时,转换到右边的下一幅图片,同时上面的小方块颜色也跟着改变,如果已经是最后一幅图片,再点击“右”,则转换到第一幅图片,是直接向左移找到第一幅图的,明天再做一下无缝 ...

  3. Kubernetes核心概念简介

    本文将会简单介绍Kubernetes的核心概念.因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍.相反,我们会使用一些图表(其中一些是动画)和示例来解释这些概 ...

  4. mysql 命令行查看数据库、创建数据库、选择数据库、删除数据库

    mysql数据库命名规则(标识符规则): 不能和已存在的命名重名: 由大小写字母.数据.下划线.@.# 和 $ 符号组成: 首字母不能是数字和$符. 不允许有空格和特殊字符. 不允许是mysql的保留 ...

  5. 使用cancelBubble竟然可以阻止所有浏览器的冒泡?

    以前一直以为cancelBubble是IE8及以下的专属,今天做一个测试的时候意外发现了所有浏览器都支持,便提出来希望有哪位解释下. 1.使用原生js在FF下和chrome下两种方法都可以阻止冒泡 d ...

  6. [IIS] [PHP] 500.19 随机出现

    微信确认有BUG: https://support.microsoft.com/en-au/help/3007507/-http-error-500.19-error-when-you-browse- ...

  7. Jmeter入门--断言(检查点)

    断言是在请求的返回层面增加一层判断机制.因为请求成功,并不代表结果一定正确,因为此需要检查机制提高测试准确性. 1.响应断言 模式匹配规则: 包括:返回结果包括你指定的内容,支持正则匹配 例如: 响应 ...

  8. 铁乐学python_Day43_协程

    铁乐学python_Day43_协程 引子 之前我们学习了线程.进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位. 按道理来说我们已经算是把cpu的利用率提高很多了. ...

  9. struts2.5动态方法绑定问题

    <global-allowed-methods>regex:.*</global-allowed-methods> <?xml version="1.0&quo ...

  10. 面对对象程序设计_task2_1001.A+B Format (20)

    Someting about 1001.A+B Format (20) 问题描述及我所写的代码:click here → My Task 看到这个题目的时候,我的想法很简单,直接判断直接输出,因为给定 ...