zk原理笔记

本文探讨了ZooKeeper的两种运行模式:独立模式和复制模式,特别是其在复制模式下如何保证数据一致性和恢复机制。此外,文章还介绍了Zookeeper的广播协议、ZXID以及Observer角色的作用。同时,提到了Redis的事务处理,包括MULTI、EXEC、DISCARD和WATCH命令在事务中的角色和功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://dongqilin.wx.sczhou.com/static/html/admin/shop/manage.html?_d=v2.1.0
http://dongqilin.wx.sczhou.com/static/html/buy/trade/index.html?_d=v2.1.0
Ctrl+Alt+T代码围绕
Ctrl+Shift+Enter。语句自动完成 会自动地添加缺失的 括号、中括号和必须的格式。
Alt-Q 可以不需要移动代码就能查看当前方法地声明。连续按两次会显示当前所编辑的类名。
Alt+R移除环绕代码。
Ctrl+[ OR ],可以跑到大括号的开头与结尾。
Ctrl+Shift+Insert,可以选择剪贴板内容并插入。
Alt+Shift+L,可以引入变量。例如:new String(); 自动导入变量定义
Ctrl+F4,关闭。
Ctrl+Shift+I快速定义
Ctrl+E最近文件
Ctrl+F3/O显示类的所有方法列表
完成当前语句:Ctrl+Shift+Enter


ZooKeeper服务有两种不同的运行模式。一种是"独立模式",在生产环境中的ZooKeeper通常以"复制模式"(replicated mode)。
通过以下两条基本保证来实现数据的一致性:

① 全局串行化所有的写操作

② 保证同一客户端的指令被FIFO执行(以及消息通知的FIFO)

所有的读请求由Zk Server 本地响应,所有的更新请求将转发给Leader,由Leader实施。
ReplicatedDatabase是一个内存数据库,它包含了整个Data Tree。为了恢复,更新会被记录到磁盘,并且写在被应用到内存数据库之前,先被序列化到磁盘。
(1) 恢复模式

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和server具有相同的系统状态。
(2) 广播模式

一旦Leader已经和多数的Follower进行了状态同步后,他就可以开始广播消息了,即进入广播状态。这时候当一个Server加入ZooKeeper服务中,它会在恢复模式下启动,发现Leader,并和Leader进行状态同步。待到同步结束,它也参与消息广播。ZooKeeper服务一直维持在Broadcast状态,直到Leader崩溃了或者Leader失去了大部分的Followers支持。
Broadcast模式极其类似于分布式事务中的2pc

所有的写请求都被转发给领导者,再由领导者将更新广播给跟随者。当半数以上的跟随者已经将修改持久化之后,领导者才会提交这个更新,然后客户端才会收到一个更新成功的响应。
广播协议在所有的通讯过程中使用TCP的FIFO信道,通过使用该信道,使保持有序性变得非常的容易。

Leader会广播已经被deliver的Proposal消息。在发出一个Proposal消息前,Leader会分配给Proposal一个单调递增的唯一id,称之为zxid。因为Zab保证了因果有序, 所以递交的消息也会按照zxid进行排序。广播是把Proposal封装到消息当中,并添加到指向Follower的输出队列中,通过FIFO信道发送到 Follower。当Follower收到一个Proposal时,会将其写入到磁盘,可以的话进行批量写入。一旦被写入到磁盘媒介当 中,Follower就会发送一个ACK给Leader。 当Leader收到了指定数量的ACK时,Leader将广播commit消息并在本地deliver该消息。当收到Leader发来commit消息 时,Follower也会递交该消息。
若一条消息在一台机器上被deliver,那么该消息必须将在每台机器上deliver,即使那台机器故障了。
Zxid是由64位数字组成的,低32位用作简单计数器。高32位是一个epoch。每当新Leader接管它时,将获取日志中Zxid最大的epoch,新Leader Zxid的epoch位设置为epoch+1,counter位设置0。
在ZooKeeper的3.3.3版本以后,ZooKeeper中又添加了一种新角色Observer。Observer的作用同Follower类似,唯一区别就是它不参与选主过程。
在ZooKeeper中引入Observer,主要是为了使 ZooKeeper具有更好的可伸缩性。增加读吞吐量,且不影响写吞吐量。

【聊聊redis的事务处理】

众所周知,事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。

在聊redis事务处理之前,要先和大家介绍四个redis指令,即MULTI、EXEC、DISCARD、WATCH。这四个指令构成了redis事务处理的基础。

1.MULTI用来组装一个事务;
2.EXEC用来执行一个事务;
3.DISCARD用来取消一个事务;
4.WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
使用功能”.class”来创建Class对象的引用时,不会自动初始化该Class对象,使用forName()会自动初始化该Class对象。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值