在 ETCD 源码学习过程,不会讲解太多的源码知识,只讲解相关的实现机制,需要关注源码细节的朋友可以自行根据文章中的提示,找到相关源码进行学习。
预写式日志(Write Ahead Log, WAL),其核心思想是,所有的修改在提交之前都要先写入 log,通过日志记录描述好数据的改变后,再写入缓存,等缓存区写满后,再往持久层修改数据。目的在于,在系统崩溃后,能够在日志指导下恢复到崩溃前的状态,避免数据丢失。
WAL 详细介绍:https://segmentfault.com/a/1190000018058484
主要文件
代码位置:etcd/wal
1.wal.go
wal 日志的具体实现文件,包括写入日志、切换日志文件、读取 wal 日志、释放文件等操作。wal 文件名命名方式为 seq-index.log,seq 为递增序列号,在每次切换日志是时 seq+1。index 是第一条日志的索引值(物理偏移量)。
2.file_pipline.go
实现文件的预生成,在 wal 运行过程中,run() 函数会生成一个 x.tmp 文件并且预分配好空间(64M),等待 wal log 被写满之后(64M)后,会用这个 x.tmp 作为新的 wal log。
tmp 文件的命名方式为 (count%2).tmp, count 是生成文件的次数。即文件名只可能是 0.tmp 或 1.t