410 字 | 2 分钟

Tendis的binlog保存在rocksdb中

Tendis存储版的binlog使用类似于MySQL row模式的binlog实现,记录了一个操作在rocksdb具体变化。

例如,执行hset myhash key value,这个操作会写两条记录,DATA_META元数据以及HASH_ELE哈希元素,详见记录格式

因此,其binlog内容包含两个信息,DATA_META_Changed以及HASH_ELE_Changed,详见binlog格式

另外,为了保证数据和日志的一致性,避免类似MySQLbinloginnodb内部redo log的内部XA事务控制,Tendis的binlog保存在rocksdb中,并且与数据修改操作保证在同一个事务中。

通过BinlogId保证binlog有序

既然binlog保存在rocksdb中,那么就需要通过一定方式来保证binlog在rocksdb中的有序性。

Tendis使用BinlogId作为binlog的在rocksdb中的key。BinlogIdTendis中是一个全局递增ID。

BinlogId高低水位

当在一个操作需要执行rocksdb事务commit之前,Tendis就会生成BinlogId

所以BinlogId的有序性基本上能表达事务提交的顺序。

但是,由于生成BinlogId和事务提交并不是一个原子操作,也会存在BinlogId更小的事务更晚提交。

因此,引入BinlogId高低水位的概念。

  • BinlogId低水位,BLWM(Binlog Low WaterMark), 表示所有已提交事务的连续最大BinlogId
  • BinlogId高水位,BHWM(Binlog High WaterMark),表示下一个待分配的BinlogId,总是等于Max(BinlogId) + 1
  1. if (x <= BLWH)
  2. x must be commited.
  3. if (x > BLWH && x < BHWH)
  4. x maybe commited or not.