Zookeeper核心原理
Zookeeper 的核心原理
Zookeeper 的由来
各个节点的数据一致性
怎么保证任务只在一个节点执行
如果orderserver1挂了,其他节点如何发现并接替
存在共享资源,互斥性、安全性


Apache 的Zookeeper
Google 的Chubby 是一个分布式锁服务,通过Google Chubby 来解决分布式协作、Master选举等与分布式锁服务相关的问题
Zookeeper 的设计猜想
防止单点故障
集群方案(Leader Follower)还能分担请求,既做了高可用,又做高性能
每个节点的数据是一致的(必须要有leader)
leader master(带中心化的) redis-cluser (无中心化的)
集群中的leader 挂了,怎么办?数据怎么恢复?
选举机制?数据恢复
如何去保证数据一致性?(分布式事务)
2PC 协议、二阶提交
2PC
(Two Phase Commitment Protocol)当一个事务操作需要跨越多个分布式节点的时候,为了保持事务处理的ACID特性,就需要引入一个“协调者”(TM)来统一调度所有分布式节点的执行逻辑,这些被调度的分布式节点被称为AP。TM 负责调度AP 的行为,并最终决定这些AP是否要把事务真正进行提交;因为整个事务分为两个阶段提交,所以叫2PC.
阶段一:提交事务请求
事务询问
协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
执行事务
各个参与者节点执行事务操作,并将Undo和Redo信息记录到事务日志中,尽量把提交过程中所有消耗时间的操作和准备的提前完成确保后面100%成功提交事务
各个参与者向协调者反馈事务询问的响应
如果各个参与者都成功执行了事务操作,那么就反馈给参与者yes的响应,表示事务可以执行;
如果参与者没有成功执行事务,就反馈给协调者no的响应,表示事务不可以执行;
2pc 协议的第一个阶段称为“投票阶段”,即各参与者投票表名是否需要继续执行接下去的事务提交操作。
阶段二:执行事务提交
在这个阶段,协调者会根据各参与者的反馈情况来决定最终是否可以进行事务提交操作;
两种可能:
执行事务
中断事务

Zookeeper 的集群角色
在zookeeper中,客户端随机连接到zookeeper中的一个节点。
如果是读请求,就直接从当前节点中读取数据

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

Leader 角色
是zookeeper中的整个核心,起到了主导整个集群的作用
事务请求的调度和处理
保证事务处理的顺序性
Follower角色
处理客户端的非事务请求,
转发事务请求给leader服务器
参与事务请求Proposal 的投票(需要半数以上服务器通过才能通知leader commit数据; Leader发起的提案, 要求Follower投票)
参与leader节点选举的投票
Observer角色
是一个观察者角色
了解集群中的状态变化 ,和对这些状态进行同步
工作原理和follower节点一样,唯一差别是不参与事务请求的投票,不参与Leader选举
Observer 只提供非事务请求,通常在于不影响集群事务处理能力的前提下,提升集群非事务处理能力
注:
为什么需要2n+1节点
表示奇数节点, zookeeper中要正常对外提供服务的话,它里面有个投票机制,这个机制就是必须要有过半的机器正常工作,并且能够彼此完成通信进行事务投票结果。
ZAB协议
ZAB(Zookeeper Atomic Broadcast) 协议是为分布式协调服务。ZooKeeper 专门设计的一种支持崩溃恢复的原子 广播协议。在 ZooKeeper 中,主要依赖 ZAB 协议来实现分布式数据一致性,基于该协议,ZooKeeper 实现了一种主备模式的系统架构来保持集群中各个副本之间的数据一致性。
ZAB
支持崩溃恢复的原子广播协议,主要用于数据一致性
ZAB协议基本模式
崩溃恢复(恢复leader节点和恢复数据)
原子广播
消息广播的实现原理
消息广播过程实际是一个简化版的二阶提交。2PC
leader 接收到消息请求后,将消息赋予一个全局唯一的64位自增id(ZXID)。ZXID大小,实现因果有序的特征。
leader 为每一个follower 准备了一个FIFO队列,将带有zxid的消息作为一个提案(Proposal)分发给所有follower
当follower 收到proposal,先把proposal写到磁盘,写入成功后,再向leader 回复一个ack
当leader接收到合法数量的ack后,leader 就会向这个follower 发送commit命令,同时会在本地执行该消息。
当follower 收到消息的commit以后,会提交该消息。
注:leader 的投票过程,不需要Observer 的ack,但是Observer必须要同步Leader的数据,保证数据的一致性。
崩溃恢复
当leader失去了过半的follower节点的联系
当leader服务器宕机
集群进去崩溃恢复阶段
对于数据恢复来说
已经处理的消息不能丢失
当leader 收到合法数量的follower 的ack以后,就会向各个follower 广播消息(commit命令),同时自己也会commit 这条事务消息。
如果follower节点收到commit命令之前,leader挂了,会导致部分节点收到commit,部分节点没有收到。
ZAB协议需要保证已经处理的消息不能丢失。
被丢弃的消息不能再次出现
当Leader收到事务请求,还未发起事务投票之前,leader挂了
ZAB 协议需要满足以上两种情况,必需要设计一个leader选举算法:能够保证已经被leader提交的事务Proposal能够提交、同时丢弃已经被跳过的事务Proposal。
ZAB的设计思想
zxid 是最大的
如果leader选举算法能够保证新选举出来的leader服务器拥有集群中所有机器最高编号(ZXID最大)的事务Proposal,那么就可以保证这个新选举出来的Leader一定具有已经提交的提案。因为所有提案被Commit之前必须有超过半数的Follower ACK,即必须有超过半数的服务器的事务日志上有该提案的proposal,因此,只要有合法数量的节点正常工作,就必然有一个节点保存了所有被commit消息的proposal状态。
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 选举
每个服务器发出一个投票,初始情况,都会将自己作为Leader服务器进行投票,然后发送给其他集群中的服务器。
投票信息包含(myid,zxid,epoch)
接受来自各个服务器的投票
判断该投票是否有效
检查是否来自本轮投票epoch
检查是否来时LOOKING状态的服务器
处理投票
检查ZXID,如果ZXID比较大,那么设置为Leader,
如果ZXID相同,会检查myid,myid比较大的,设置为leader
统计投票
判断是否已经有过半机器接受到相同的投票信息
如果有过半机器接受,便认为已经选举出了Leader
改变服务器状态
如果是Follower,那么状态变为FOLLOWING
如果是Leader,那么状态变为LEADING
Leader 崩溃时的Leader选举
变更状态
Leader 挂后,余下非Observer服务器都会将自己的服务器状态变为LOOKING,
开始进入Leader选举过程
每个Server会发起一个投票。
运行期间,ZXID 可能不同,然后将各自的投票发送给集群中的所有机器。
其余与启动时过程相同。
Zookeeper核心原理的更多相关文章
- hadoop系列:zookeeper(2)——zookeeper核心原理(选举)
1.前述 上篇文章<hadoop系列:zookeeper(1)--zookeeper单点和集群安装>(http://blog.csdn.net/yinwenjie/article/deta ...
- 深入了解Zookeeper核心原理
之前的文章Zookeeper基础原理&应用场景详解中将Zookeeper的基本原理及其应用场景做了一个详细的介绍,虽然介绍了其底层的存储原理.如何使用Zookeeper来实现分布式锁.但是我认 ...
- zookeeper核心原理全面解析
下述各zookeeper机制的java客户端实践参考zookeeper java客户端之curator详解. 官方文档http://zookeeper.apache.org/doc/current/z ...
- zookeeper工作原理、安装配置、工具命令简介
1.Zookeeper简介 Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理等等. 2.zo ...
- Zookeeper 3、Zookeeper工作原理(详细)
1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...
- 高性能消息队列 CKafka 核心原理介绍(上)
欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:闫燕飞 1.背景 Ckafka是基础架构部开发的高性能.高可用消息中间件,其主要用于消息传输.网站活动追踪.运营监控.日志聚合.流式 ...
- [转载] zookeeper工作原理、安装配置、工具命令简介
转载自http://www.cnblogs.com/kunpengit/p/4045334.html 1 Zookeeper简介Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到 ...
- Zookeeper 3、Zookeeper工作原理(转)
1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...
- ZooKeeper的原理(转)
一.ZooKeeper的角色 领导者(Leader),负责进行投票的发起和决议,更新系统状态. 学习者(Learner),包括跟随者(Follower)和观察者(Observer),Follower用 ...
随机推荐
- CSS - 伪类和伪元素的区别
伪类和伪元素皆独立于文档结构.它们获取元素的途径也不是基于id.class.属性这些基础的元素特征,而是在处于特殊状态的元素(伪类),或者是元素中特别的内容(伪元素).区别总结如下: CSS伪类 (P ...
- TCP报文发送工具
该工具用于向Socket服务端发送XML报文,软件功能界面如下图所示: 配置好IP和端口后,单击"载入报文文件"按钮,在文件选择对话框中选择报文文件,如图: 报文文件打开后,可在右 ...
- Android 应用安装
DDMS下Files Explorer /data/app/xxx.apk 安装过程:1.拷贝文件xxx.apk到/data/app/xxx-1.apk 2.在/data/data目录下创建一个文件夹 ...
- android控件TextView之 分段显示不同颜色
代码如下: attrs.xml文件: 第二种方式: String newMessageInfo = "<font color='red'><b>" + 红色 ...
- 非J2EE部署解决方案
根据交银施罗德真实环境已测试通过,此过程可以作为非J2EE部署的典型案例,主要是针对某些对安全性要求较高的解决方案: 基本的实现原理和部分代码如下: 1.客户端访问交银.net系统,由该系统发送 ...
- url override implements session
url 重写实现会话概述 URL重写是对GET请求参数的应用,当服务器响应浏览器上一次请求时,将某些相关信息以超链接方式响应给浏览器,超链接中包括请求参数信息. 特点:URL必须以GET方式发送请求. ...
- linux 网络命令last、lastlog、traceroute、netstat
last /usr/bin/last语法:last功能:列出目前与过去登入系统的用户信息 reboot 是重启信息 lastlog lastlog -u 502(用户ID) traceroute /b ...
- Linux 环境下为VirtualBox安装增强功能
VirtualBox安装CentOS后,再安装增强功能就可以共享文件夹.粘贴板以及鼠标无缝移动,主要步骤如下: 1.yum -y update 2.yum -y install g++ gcc gcc ...
- ASP.NET中使用UpdatePanel时用Response输出出现错误的解决方法
asp.net中执行到Response.write("xx");之类语句或Microsoft JScript 运行时错误: Sys.WebForms.PageRequestMana ...
- [转载]敏感词过滤,PHP实现的Trie树
原文地址:http://blog.11034.org/2012-07/trie_in_php.html 项目需求,要做敏感词过滤,对于敏感词本身就是一个CRUD的模块很简单,比较麻烦的就是对各种输入的 ...