深入理解etcd(九)--- wal

WAL,全称为 Write-Ahead Logging(预写日志),是 etcd 中用于确保数据持久性和恢复能力的关键机制。WAL 的主要目的是在数据变更被应用到持久存储之前,先将这些变更记录到一个日志文件中。这样可以在系统崩溃或意外中断后,通过重放这些日志来恢复尚未持久化到数据库中的数据变更,从而保证数据的一致性和可靠性。

1. .wal文件

WAL 要么处于读取模式,要么处于追加模式,但不能同时处于两种模式。新创建的 WAL 处于追加模式,并准备好追加记录。刚打开的 WAL 处于读取模式,并准备好读取记录。在读取出所有之前的记录后,WAL 将准备好进行追加操作。

创建.wal文件时,先在临时目录中初始化文件并写入元数据,通过锁定和预分配空间准备就绪,再将临时目录重命名为目标目录,并同步父目录确保操作持久化。

文件都是先写再分割,切分文件的时候也一样,先在临时文件写入必要数据,再进行重命名。

为了提高效率,会预先创建文件,等到使用的时候可以直接使用。

什么时候会调用sync进行刷盘?

  • 旧文件被切分后
  • 临时文件重名名
  • 服务器关闭
  • raft任期发生变化,有新日志
  • 保存快照后

一个wal文件如下图所示

2. record 类型

record的data都是下述的结构protobuf序列化后得到

record根据type的类型可以分为以下5种:

go 复制代码
MetadataType int64 = iota + 1
EntryType
StateType
CrcType
SnapshotType

MetadataType记录的是集群元数据

ini 复制代码
message Metadata {
	optional uint64 NodeID    = 1 [(gogoproto.nullable) = false];
	optional uint64 ClusterID = 2 [(gogoproto.nullable) = false];
}

EntryType记录的是日志

arduino 复制代码
type Entry struct {
	Term  uint64    `protobuf:"varint,2,opt,name=Term" json:"Term"`
	Index uint64    `protobuf:"varint,3,opt,name=Index" json:"Index"`
	Type  EntryType `protobuf:"varint,1,opt,name=Type,enum=raftpb.EntryType" json:"Type"`
	Data  []byte    `protobuf:"bytes,4,opt,name=Data" json:"Data,omitempty"`
}

HardStateType记录的是集群持久化的状态

go 复制代码
type HardState struct {
	Term   uint64 `protobuf:"varint,1,opt,name=term" json:"term"`
	Vote   uint64 `protobuf:"varint,2,opt,name=vote" json:"vote"`
	Commit uint64 `protobuf:"varint,3,opt,name=commit" json:"commit"`
}

SnapshotType记录的快照的元数据

ini 复制代码
message Snapshot {
	optional uint64 index = 1 [(gogoproto.nullable) = false];
	optional uint64 term  = 2 [(gogoproto.nullable) = false];
	// Field populated since >=etcd-3.5.0.
	optional raftpb.ConfState conf_state = 3;
}

CrcType 记录上一个Record的Crc,只有.wal 文件的开头会使用

相关推荐
考虑考虑1 小时前
JFROG手动上传包
运维·后端·自动化运维
Java爱好狂.2 小时前
挑战一周速通Spring+SpringBoot+SpringCloud!
java·后端·spring·springboot·架构师·java面试·java程序员
柠檬味拥抱2 小时前
基于 YOLO11 的 18 类户外生活垃圾智能检测系统:从模型到 Streamlit 全流程实战
后端
得物技术2 小时前
动态规则的 Agent 实践:用确定性工程驾驭 LLM 的资产智能验收
人工智能·后端·llm
柠檬味拥抱2 小时前
基于 YOLO11 的低空空域反无人机预警系统:红外热成像 + Streamlit 全流程实战
后端
付威20232 小时前
rpi-acp 源码解读:以 Zed 为例,一个 ACP Client 如何启动并驱动 rpi Agent
后端
我的xiaodoujiao2 小时前
Django 基础知识详细图文教程 15-Django 内置Admin系统
后端·python·django
柠檬味拥抱2 小时前
皮肤病变检测数据集 | 2500张YOLO皮肤科数据集
后端
我的xiaodoujiao3 小时前
Django 基础知识详细图文教程 16-Django 内置Admin认证系统
后端·python·django
程序员鱼皮3 小时前
Personal Agent 是什么?为什么大厂都抢着做?连 DeepSeek Bot 都来了。。
前端·后端·ai编程