TOC
每一个Segment表示一个数据片段。里面包含多条Log Entry等数据和信息。每一个存在过得Segment都对应一个Wal文件。Segment同时只会存在一个。
数据写入时候,每一个Entry都Append到Segment中。
当Segment大小已经超过阈值时,sync落盘。同时ID自增,清空Segment数据并创建新的对应的Wal文件。
Entry是最小wal数据单元。对于Wal来说,不关心Entry内部的数据结构,由用户自己定义。
每一次EntryAppend的时候,都会先做crc32计算,并一起Append到Segment中。这样,读取的时候,只需要检查crc32是否一致就可以保证数据一致。
//Segment 日志段,包含多条Log Entry
type Segment struct {
id uint64 // Segment的ID
currentSize uint64 // 当前文件大小
path string // Segment的对应文件的路径
index uint64 // Segment中最小数据块的index
position []pos // data中的索引
data []byte // 保存Entry数据,格式:checksum|entry_size|entry
}
//索引位置信息
type pos struct {
start int //开始索引位置
end int //结束索引位置
}
每一个ID的Segment对应一个Wal文件,每当Segment写满后,自动销毁并创建新的Segment,同时新建一个wal文件对应。
{SegmentID}-{Index}.wal
fmt.Sprintf("%016x-%016x.wal", SegmentID, Index);
//Wal日志
type Wal struct {
mutex sync.RWMutex
path string //日志路径
opts Options //选项
segment Segment //当前日志对应的Segment
firstIndex uint64 //当前日志中的第一条Entry的Index
lastIndex uint64 //当前日志中的最后一条Entry的Index
MarshalFunc MarshalFunc //Marshal函数支持自定义
}
//定义序列化方法
type MarshalFunc func(data interface{}) []byte
//配置选项
type Options struct {
Async bool //是否开启异步模式,默认同步
SegmentSize int //每一个Segment大小,默认64m
CustomMarshalFunc bool //自定义MarshalFunc,默认false,使用Default
AutoPurgeFile bool //自动清理wal文件
SyncPurgeFile bool //是否同步清理文件,默认异步:false
}
var DefaultOption = &Options{
Async: false, //默认同步
SegmentSize: 64 * 1024 * 1024, //默认64M
CustomMarshalFunc: false, //使用默认的MarshalFunc
AutoPurgeFile: false, //默认关闭自动清理wal文件
SyncPurgeFile: false, //默认异步清理文件
}
AutoPurgeFile:true
也支持自动清理回放,适用于首次启动共识,从Wal中回放共识的重要数据。
通常情况下,首次启动,当前Segment中数没有数据的。因此,需要将最后一个落盘的Wal文件,恢复到Segment中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。