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格式
另外,为了保证数据和日志的一致性,避免类似MySQL
中binlog
和innodb
内部redo log
的内部XA事务控制,Tendis的binlog
保存在rocksdb中,并且与数据修改操作保证在同一个事务中。
通过BinlogId保证binlog有序
既然binlog保存在rocksdb中,那么就需要通过一定方式来保证binlog在rocksdb中的有序性。
Tendis
使用BinlogId
作为binlog的在rocksdb中的key。BinlogId
在Tendis
中是一个全局递增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
。
if (x <= BLWH)
x must be commited.
if (x > BLWH && x < BHWH)
x maybe commited or not.