Tendis-SSD
是现网环境运行的KV存储.在Tendis存储版
上线后,需要将现网数据迁移至Tendis存储版
.本篇提供进行数据迁移的方案设计.
背景介绍
Tendis存储版
是Tendis-SSD
的全面升级版本,在命令支持, 性能提升, 运维监控, 集群管理, 节点数据搬迁等方面具有明显的改进和优势.在对现网数据进行搬迁之前,需要了解这两版KV存储之间的区别与共性, 相较于Tendis-SSD
, Tendis存储版
提供了更加丰富的功能和可观的性能.主要体现在以下方面:
- Redis兼容性: 完全兼容redis协议,支持绝大多数redis的指令
- 持久化存: 使用rocksdb作为存储引擎,所有数据以特定格式存储在rocksdb中,最大支持PB级存储
- 去中心化架构: 类似于redis cluster的分布式实现, 使用和运维成本很低。
- 水平扩展: 集群支持增删节点,并且数据可以按照slot在任意两节点之间迁移.
- 故障高可用: 自动检测故障节点,当故障发生,slave会提升为master继续对外服务。
- redis冷热混合存储关键组件
数据迁移目标是将Tendis-SSD
中的数据完整迁移到Tendis存储版
中,其中包括了, Tendis-SSD
支持的所有数据结构:String
, Hash
, List
, Set
, ZSet
. 另外还需要考虑相关的命令支持: CAS
, HMCAS
, HMCASV2
等在Tendis-SSD
上实现的CAS
-family命令.必要情况下需要Tendis存储版
提供相关的命令支持.
数据迁移方案
考虑到Tendis-SSD
的特殊情况是: 正在现网环境下运行中的机器, 即迁移的是动态数据. 并非一成不变的静态数据.需要进行迁移方案的预研选型:
暂时Block业务写请求, 将所有
Tendis-SSD
数据全量迁移至Tendis存储版
属于较为朴实的设计, 在节点数据有限的情况下, 此方案效率较高, 直接进行落盘文件的搬移, 完成数据迁移工作.但同样存在问题:
- 需要
Tendis存储版
支持直接load来自Tendis-SSD
的db文件能力, 需要开发测试支持 - 在QPS较低的情况下,此方案勉强可行. 但如果业务QPS较高, 且全量数据容量较大的情况下,服务不可用时间较长
此方案属于将动态数据暂时转化为静态数据的方案, 有诸多的限制, 在业务量众多,且场景不同的情况下,不具有普适性, 不适合作为当前的迁移方案
- 需要
通过备份产生
Tendis-SSD
全量快照的binlog, 导入Tendis存储版
后, 使用Redis-Sync
进行增量数据同步 此方案主要分为三个步骤:
Export(导出)
->import(导入)
->Append(增量)
三个阶段. 其中不会将业务请求阻塞, 不会造成业务使用瓶颈, 同时也能获得不错的迁移效率, 具体的迁移步骤操作如下:- Export(导出): 对
Tendis-SSD
使用tredisdump
工具将备份好的数据进行dump, 会将全量数据转换为AOF形式, 此工具支持多线程 - Import(导入): 使用多开
Redis-cli
进行批量并发导入, 凭借Tendis存储版
支持多线程操作的特性完成高效导入 - Append(增量): 在完成数据导入之后, 使用同步组件
Redis-Sync
进行增量数据的同步追加.
此方案更为完善和普适, 一方面并不会阻塞也请求访问, 可以做到业务无感知搬迁. 另一方面通过机器资源的扩展提升数据迁移效率.选定此方案进行数据迁移.
- Export(导出): 对
数据搬迁操作
在确定数据迁移方案后,下面介绍具体的数据迁移操作:
导出阶段:
使用
tredisdump
进行数据导出. 命令如下:tredisdump --db_path $DBPATH --sst_path $SST_PATH --threads $THREADS
导入阶段: 使用
Redis-cli
多开进行并行导入, 操作不再赘述.增量阶段:
增量同步类似于
Redis-PSYNC
操作, 不同的是, 需要处理Tendis-SSD
主备复制的binlog. 在Redis-Sync
支持Tendis-SSD
的binlog同步后可以进行相关的增量数据同步.redis-sync> cnys $syncState $lastSeq $lastKey $runId # 进行相关参数设置
redis-sync> syncadmin start # 开始进行增量同步
redis-sync> info [Tendis-SSD/Server/Queue] # 查看相关运行时监控数据
按照上述操作即可完成数据搬迁工作
Redis-Sync
可以后期常驻,在数据增量同步完成后, 可以阻塞对源DB的业务请求, 将其重定向到新的DB节点,以此来完成数据搬迁工作.
Redis-Sync相关配置
Redis-Sync
作为同步组件,需要进行一定程度上的配置, 推荐配置如下:
[server]
threads=4
port=21213
sync-tick=10
skip-start=yes
loglevel=notice
[source]
127.0.0.1:21212|
[remote]
127.0.0.1:20121|
127.0.0.1:20122|
127.0.0.1:20123|
127.0.0.1:20121|