tendis存储版集群模式下,对于搬迁有一些需要特殊处理的点。
搬迁的时序:
- 获取
HighestBinlogId
作为起始binlogid - txn获取快照
- 用txn快照创建游标,遍历发送到从。
- 追binlogid
- lockchunk
- 获取
MaxBinlogId
作为结束binlogid,并且不能用之前的快照txn获取。 - 最后一次追binlog
unlockchunk
注意:
- 步骤1需要在步骤2之前获取
kvstore->getHighestBinlogId()
,或者直接用步骤2的txn快照获取getMaxBinLog(txn)
。 - 步骤6需要在
lockchunk
之后获取,并且不能用快照getMaxBinLog(txn)
获取,要用kvstore->getHighestBinlogId()
获取。
TTL
- 对于
list
,hash
,set
,zset
的ttl,因为TTLIndex
不在同一个chunk,无法发送到目标节点,需要在目标节点按RecordValue
中的ttl恢复TTLIndex。 - 对于追加binlog过程中的expire,会随着binlog发送到目标节点,并被添加到rocksdb里面去。要注意chunkid设置为MULTI的逻辑。
- 对于kv的ttl,不用恢复.
- 对于混存版本,redis层会对expire转化为delete操作,所以
Tendis存储版
这一层通常是关闭expire功能的。 - 在ttlindex恢复之后,二级key还在搬迁的过程中,此时扫描线程来删数据,可能有问题。因此,搬迁过程中,停止主动过期。
主从同步
目标节点的主和从
- 主节点接受快照的
keyvalue
,通过可以生成binlog的接口设置,这样可以同步给从。 - 主节点追加的
<ReplLogKeyV2,ReplLogValueV2>
需要重新设置binlogid,并能够实时同步到从 - 从节点收到结束搬迁的binlog,需要设置cluster模块中slots的归属。
源节点的主和从:
- 主节点在搬迁结束进行
deleteChunk
的时候,需要调用可以生成binlog的删除接口,这样删除操作才能同步到从节点。 - 从节点收到结束搬迁的binlog,需要设置cluster模块中slots的归属。
- 数据清理统一交给GC模块处理
slaveof no one
- 源节点的主在
delteChunk
阶段挂掉,那么源节点的从就含有多余的没来得及删掉的key。目标节点在搬迁过程中挂掉,那么目标节点的从就含有未生效的key。 - 为了解决这两种情况,统一交给GC模块处理
deleteChunk保护
importing
命令需要判断该slot不能正在执行deletChunk
操作。(wayenchen)
versionEP
versionEp
在搬迁的最后,都需要同步到目标节点
FLUSH
flush
操作以store
为单位,但是搬迁却以chunkid
为单位。但在搬迁过程中,会一致持有store的IS锁,所以flush操作是会被阻塞。也就是说,搬迁过程中,无法执行flushdb/flusall
.