ETCD介绍 (三)
数据存储
ETCD的存储分为内存存储和持久化(硬盘)存储两部分
- 内存中的存储除了顺序化的记录下所有用户对节点数据变更的记录外,还会对用户数据进行索引、建堆等方便查询的操作。
- 持久化则使用预写式日志(WAL:Write Ahead Log)进行记录存储。
日志记录
在etcd的持久化存储目录中有两个子目录,通过WAL和snapshot相结合的方式,etcd可以有效的进行数据存储和节点故障恢复等操作。
- WAL:存储着所有事务的变化记录
- snapshot:存储某一个时刻etcd所有目录的数据
日志复制流程
1.客户端请求
2.leader写日志,将事务通知给follower
3.follower本地进行校验
4.校验通过后进行写日志
5.写成功,返回leader,leader执行commit命令,将数据写入磁盘
6.leader数据写入磁盘成功后同时告知client,并告知follower进行commit将数据写入follower磁盘
日志同步原理
一般情况下,Leader和Follower的日志都是保存一致的
如果Leader节点在故障之前没有向其它节点完全复制日志文件之前的所有条目,会导致日志不一致问题。在Raft算法中,Leader会强制Follower和自己的日志保存一致,因此Follower上与Leader的冲突日志会被领导者的日志强制覆写。
同步过程:
leader 向第二个follower同步(8,3), 发现没有,则继续发前一条(7,3) ....直到(5,3)后,将(5,3)之前的保留,之后的日志全删,并将Leader的(5,3)之后的日志全部追加过来。
日志镜像
随着系统的持续运行,操作日志不断膨胀,导致日志重放时间增长,最终将导致系统可用性的下降。快照(Snapshot)应该是用于“日志压缩”最常见的手段,Raft也不例外。具体做法如下图所示:
学习文档:
http://thesecretlivesofdata.com/raft/
https://www.bilibili.com/video/BV1ny4y1G7o7/
https://zhuanlan.zhihu.com/p/369777462
https://www.kubernetes.org.cn/6226.html
https://www.topgoer.cn/docs/etcd/etcd-1d9er87sb9smv
http://www.xuyasong.com/?p=1706