LSM主从同步

Influx主从同步原理

文件格式

wal文件

来源

“预写日志”文件,写入数据时,InfluxDB 先写 WAL,再写内存缓存(cache),如果数据库宕机,InfluxDB 启动时会用 WAL 文件重新构建 cache,防止数据丢失

清理

正常情况下Cache的flush到tsm会同时删除wal,或者文件大小超过阈值或者恢复的时候,会读到Cache,然后在从Cache久化到tsm文件

seg文件

来源

主节点的 wal 文件副本,从节点接收后改名.seg, 用于同步主节点的数据

清理

与wal清理逻辑一致

tsm文件

InfluxDB 真正的持久化数据文件,它是经过压缩、去重、排序后生成的,每个 shard 目录中通常会有多个

来源

  1. crash 恢复时,WAL replay 到内存 Cache,再 flush 成 TSM
  2. Cache 定时flush到TSM
  3. Wal超过阈值,WAL replay 到内存 Cache,再 flush 成 TSM
  4. 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文件:由复制服务在处理完成后删除