LSM主从同步
Influx主从同步原理
文件格式
wal文件
来源
“预写日志”文件,写入数据时,InfluxDB 先写 WAL,再写内存缓存(cache),如果数据库宕机,InfluxDB 启动时会用 WAL 文件重新构建 cache,防止数据丢失
清理
正常情况下Cache的flush到tsm会同时删除wal,或者文件大小超过阈值或者恢复的时候,会读到Cache,然后在从Cache久化到tsm文件
seg文件
来源
主节点的 wal 文件副本,从节点接收后改名.seg, 用于同步主节点的数据
清理
与wal清理逻辑一致
tsm文件
InfluxDB 真正的持久化数据文件,它是经过压缩、去重、排序后生成的,每个 shard 目录中通常会有多个
来源
- crash 恢复时,WAL replay 到内存 Cache,再 flush 成 TSM
- Cache 定时flush到TSM
- Wal超过阈值,WAL replay 到内存 Cache,再 flush 成 TSM
- Cache超过阈值, flush 成 TSM
持久化流程
[Client Write]
│
▼
Local WAL (主节点) ────────┐
│ │ replication
▼ ▼
Cache → Flush → TSM 从节点接收 .seg → Cache → Flush → TSM
命名规范
同步是基于WAL文件进行的,会在WAL目录下通过生成.seg的硬链接指向.wal,下图是一个日志的目录,以它为例解释命令规则
/data/wal/mydb/autogen/1/
├── 0000000001.wal # 原始WAL文件
├── 0000000002.wal
├── 0000000003.wal
├── 0_000001_0000000001.seg # 服务0的复制文件
├── 0_000002_0000000002.seg
├── 0_000003_0000000003.seg
├── 1_000001_0000000001.seg # 服务1的复制文件
├── 1_000002_0000000002.seg
├── 1_000003_0000000003.seg
├── repl_00.json # 服务0的进度文件
└── repl_01.json # 服务1的进度文件
目录命名规范
/data/wal/ # WAL 目录,来源于配置参数 [wal-dir]
└── mydb/ # 数据库名称 (Database)
└── autogen/ # 保留策略 (Retention Policy, 默认是 autogen), 数据库 + 保留策略 = 逻辑 bucket
└── 1/ # 分片 ID (Shard ID),InfluxDB 会按时间范围切分数据,每个时间段一个 shard
如果有保留策略,那么目录名不是autogen,而是ttl_30d(保留30天)
seg 文件命名规范
0_000001_0000000001.seg
│ │ │
│ │ └── 0000000001 : WAL 文件号 (对应 0000000001.wal)
│ │
│ └──────── 000001 : 序列号 (Sequence ID,每生成一个 seg 就递增 1)
│
└────────── 0 : 从库 ID (Replication service ID)
-
.wal文件:由TSM引擎在缓存快照时删除
-
.seg文件:由复制服务在处理完成后删除