zookeeper核心原理

一、zookeeper设计猜想

问题的引出(缺少分布式协调机制)


zookeeper核心原理_第1张图片


zookeeper核心原理_第2张图片

利用zookeeper特性,三个服务都在zookeeper上注册节点,最小的节点具有优先权,让它执行其他两个不让他执行

假如zookeeper成我们项目中的核心,那么zookeeper势必会带来高可用高性能的一些挑战

设计猜想

1.防止单点故障

    集群方案(leader,follower),还能分担请求

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

    leader ,master

3.leader挂了怎么办?数据如何恢复

    选举机制?数据恢复?

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

   2PC协议(二阶提交)


zookeeper核心原理_第3张图片

结论

1.zab来实现选举

2.为什么要做集群

3.2pc做数据一致性




二、zookeeper集群角色


改进版2pc不需要全部角色同意



zookeeper核心原理_第4张图片

所以集群中必须存在2n+1各节点保证投票正常进行

三、深入分析zab协议

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

崩溃恢复

1.当leader失去国办的follower节点的联系

2.leader挂掉

集群就会进入崩溃恢复的阶段

对于数据恢复来说

1.已经处理的数据不能丢失

当leader收到合法数量follower的ack以后,就会向哥哥follower广播消息(commit命令),同时自己也会commit这条事务的消息。如果follower节点收到commit命令之前leader挂了,会导致部分节点收到commit消息,部分节点没有收到。那么zab协议需要保证已经处理的消息不能丢失


zookeeper核心原理_第5张图片

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

当leader收到事务请求,并且还未发起投票请求之前,leader挂了。

zab的设计思想

1.zxid是最大的,保证消息是最新的(64位数据)

2.epoch的概念

每产生一个新的leader新的leader的epoch会在原来的基础上加1


zookeeper核心原理_第6张图片

现在我们把leader停掉,会选出新的leader查看epoch会再上一个leader基础上加1


事务日志的查看


消息广播

改进版本的2pc

leader收到事务请求后,会给这个消息赋予一个zxid(64位自增id)

leader将带有zxid的消息作为一个propose(提案)分发给集群中的每一个follower节点

follower节点把propose这个事务写入磁盘

写入成功后返回一个ack给leader

当leader受到合法数量(过半数)的ack后发起commit请求


广播过程投票不需要observer的参与


leader选举

fast leader

zxid最大会设置成leader(事务id)事务id最大表示数据最新

epoch(每一轮投票都会递增)

myid(服务器id,sid)

myid越大,在leader选举中权重最大

选举状态(looking)


leading

following

observing

启动时初始化

每个节点会将myid zxid epoch发布给集群中的每一个节点,每个节点收到信息后会进行投票比较这些数据

1.检查zxid如果zxid比较大就会投给这个节点

2.如果zxid一样(刚启动时)就会比较myid,myid比较大的会作为leader

3.更新epoch








两种情况下回选取leader

第一种启动时

第二种leader崩溃时

四、从源码分析leader选举实现过程



五、关于zookeeper数据存储

你可能感兴趣的:(zookeeper核心原理)