zk中所有数据都是放在内存中的,当然也有snapshot、事务日志。
snapshot
用于记录zk服务器上某一时刻的全量内存数据内容。snapshot.2c021384ce,后缀也是一个zxid,表示本次数据快照开始时刻的服务器最新zxid。没有预分配机制,所有内容都是有效的。
事务日志:
每次事务操作都会有一条记录保存在事务日志文件中,文件大小都是64M(包含填充,也就是预分配,主要为了提高事务日志的写入效率,不需要重新分配磁盘空间),日志后缀是一条zxid,也就是写入该事务文件的第一条事务记录的zxid
数据同步
一、已提交的数据不能丢失
节点1为leader,节点2、3、4、5为follower
节点1发起新的事物投票通过后,将事物保持在本地,然后同步给follower们,当节点2、3收到commit指令后,提交事物,4、5尚未收到commit指令,节点1宕机;此时需要重新选主,因为2、3的txid事物ID比4、5的事物ID大,并且节点3的myid比节点2的大,所以最终节点3成为主节点,4、5向2发送心跳,然后从2处开始同步新的数据,4、5找到3中与自己相同的txid,并且比较此txid下数据是否和3中的一致,如果不一致,删除4、5中此txid下的数据,再递归比较再早的一个txid,直到txid在3中存在,并且该事物下的数据与3中相同,则开始同步3中该txid往后的数据。
二、已丢弃的事物不能再现
节点1为leader,节点2、3、4、5为follower
节点1发起新的事物投票通过后,将事物保持在本地,节点1宕机;其他所有follower节点都没有收到commit指令。此时5成为leader节点,节点1重起后,成为follower节点,但是数据比5多,数据不一致。此时节点1取出当前最新的txid,去leader上查找,没有此txid,则丢弃本地的txid,再递归查找上一个txid,不一致就一直丢弃,直到找到与leader上txid一致,并且数据一致;从该txid往后开始同步数据。
原文
https://www.jianshu.com/p/5151f6ec5238
https://blog.csdn.net/shaolong1013/article/details/100087048
网友评论