1.前言
SSDB是一个高性能的KV存储数据库,个人开发作品,已开源。凭借其兼容redis协议、支持数据硬盘存储、简单易用等特性在业界有一定知名度。SSDB主要解决场景是Redis的存储问题,底层基于LevelDB作存储,可以大幅降低数据存储成本,具体产品介绍可查看其官网介绍。
Tendis是腾讯云推出一款Redis混合存储版产品,100%兼容原生的redis cluster协议,满足海量数据低成本存储同时兼顾Redis使用习惯。对于大部分中小客户来说,redis使用很频繁,同时缓存数据量也与日俱增,面临的数据成本也在不断增加。Tendis的推出正是为解决此类客户痛点的产品。具体产品介绍可以参考官网文档。
SSDB与Tendis的主要区别如下:
对比项 | Tendis | SSDB |
---|---|---|
产品类型 | 云服务 | 开源 |
产品团队 | 腾讯云数据库产品专家团队 | 个人 |
产品迭代 | 业务方无需关注 | 个人精力有限,问题无法及时解决,需要业务方熟悉源码 |
redis兼容 | redis-cluster协议兼容 | redis协议兼容 |
存储类型 | 基于RocksDB打造 | 基于LevelDB打造 |
大数据量存储 | PB级别,性能稳定 | GB级别,当主从单实例数据规格达到100 GB时性能下降严重 |
存储层对性能损耗 | 小,架构决定,缓存层(redis)和存储层(rocksdb)分离,业务直接与缓存层交互 | 大,业务直接与LevelDB交互,存储层的一些机制如Compaction等对资源消耗比较严重,会阻塞业务读写,其它像数据同步及备份等也对结点影响比较大 |
上面只列举了部分对比项,实际在测试ssdb过程中发现最大的问题是有很多地方实现不太严谨,一旦数据量比较大后,对业务影响比较大,如LevelDB层的Compaction、内存OOM问题等是社区常见的问题 。需要业务方对SSDB源码很熟悉并作相应的改造才能满足一定的业务需求,这就对业务方提出更高要求,无法更好聚焦业务本身。这也是为何要设计SSDB数据迁移方案的原因。
2. 迁移说明
SSDB是基于LevelDB开发的一个兼容Redis协议的KV存储产品,产品架构模型和Redis标准单实例一样,即支持单主,也支持主从同步架构。Tendis属于集群模式,类似Redis Cluster架构。单实例版Redis和集群版Redis有些方面还是有区别的,如原来所有Key都分布在单master实例上,现在slot被分拆到集群中的多个节点实例,key被进一步打散,像原来的一些涉及事务及管道这块的逻辑可能会受一些影响。如果业务侧涉及事务和管道的代码逻辑比较多的话,需要考虑怎么适配到集群版实例上,这里涉及具体业务具体分析,暂不在本文展开介绍。其它一些非标准版redis支持命令,如keys和scan,在集群版上实现逻辑也是和单实例版不一样的,也需要特殊对待。
3.迁移准备
3.1 迁移工具
在迁移过程中,会依赖第三方开源同步工具ssdb-port。在开源工具基础上作了一些源码改造,以适配大Key及亿级别Key的同步效率,内部改造版下载地址Siphon-V2。 工具说明:
- 基于Golang开发,本持原理是伪造成SSDB的Slave进行数据订阅并同步到其它平台
- 工具启动时会自动连接到SSDB server, 然后进行key寻址,从起始位置开始同步,直至存量的数据全部同步完成后再同步增量数据,即工具启动后会建立一个长连接通道保持运行
- 改造后的工具解决了原生版本存在同步效率低下问题,尤其是大Key同步,像hash数据和zset这类数据,大概提升12倍的同步效率
3.2 Redis工具
用于连接登录Tendis实例,目前兼容Redis-4.x
版本的协议。直接从官网下载redis源码包进行编译即可,参考官方编译安装教程。
3.2 环境准备
3.2.1 腾讯云账号
验证迁移方案依赖于腾讯云环境,需要提前申请一个腾讯云账号,用于申请相关腾讯云资源。账号申请方式请参考腾讯云官网教程
3.2.2 腾讯云CVM环境申请
迁移方案需要安装SSDB环境及相关迁移工具,需要申请一台CVM资源,作为数据源验证使用,规格: 2C4G, Centos 7.X或CentOS 8.X。
3.2.3 申请一个tendis实例
迁移方案需要依赖Tendis作为目的数据源,申请一个最低配规格Tendis实例(4分片/64GB内存/200GB磁盘),按流量计费。目前Tendis部署地域在北上广、香港。
3.2.4 redis安装
测试连接tendis实例依赖原生redis-cli, 需要下载redis源码包进行编译或直接下载redis-cli即可。目前Tendis兼容的Redis版本是: 4.x
。
3.2.5 SSDB安装
官网下载源码包,版本:1.9.8
, 下载地址。下载完后将源码包ssdb-master.zip
上传至CVM机器,解压编译安装。如下所示:
unzip ssdb-master.zip
cd ssdb-master
make
make install
#默认安装在/usr/local/ssdb目录
cd /usr/local/ssdb
#启动ssdb-server
./ssdb-server -d ./ssdb.conf -s start
#进入ssdb命令行
./ssdb-cli
SSDB-Server配置文件内容如下:
代码语言:txt复制work_dir = ./var
pidfile = ./var/ssdb.pid
server:
ip: 127.0.0.1
#默认启动8888端口
port: 8888
replication:
binlog: yes
sync_speed: -1
slaveof:
logger:
level: debug
output: log.txt
rotate:
size: 1000000000
leveldb:
cache_size: 500
write_buffer_size: 64
compaction_speed: 1000
compression: yes
从上面步骤来看,SSDB编译启动方式和redis类似,上手简单。关于配置参数的设置,可以参考SSDB官网关于这块的说明,上面用的是默认参数。
3.2.5 迁移工具安装
下载迁移工具iphon-v2。把工具拷贝到CVM机器对应目录。工具使用方式如下:
代码语言:txt复制Usage:
siphon sync [--pprof=0.0.0.0:6060] [--ncpu=N] [--parallel=M] --from=MASTER --target=TARGET [--frompassword=MASTERPASSWORD] [--targetpassword=SLAVEPASSWORD] [--hashlen=len] [--dry=isdry]
Options:
--pprof Set pprof addr and port,like 0.0.0.0:6060 .
-p M, --parallel=M Set the number of parallel, connection to redis. default is 10.
-f MASTER, --from=MASTER Set host:port of master .
-t TARGET, --target=TARGET Set host:port of target .
-F MASTERPASSWORD, --frompassword Set password of master .
-T SLAVEPASSWORD, --targetpassword Set password of target .
-H LEN, --hashlen=len Set Hash field append length .
-d isdry, --dry=isdry Just read from ssdb, not write target.
和原生的比,多了两个参数: -H
和 -d
。
- -H: 用于解决hash数据过大传效率问题, ssdb只支持hset命令不支持hmset命令,tendis支持hmset命令,此参数主要控制多少个hset聚合成一个hmset,如果ssdb中hash的field很多,通过这种聚合控制有利于提升数据传输效率,避免一次传输过多的hash field。
- -d: 主要用于调试不写到目的端。
具体使用siphon-v2的命令如下:
代码语言:txt复制#-p:并发线程数控制,-f:指定ssdb-server地址,-t:指定目的端tendis地址, -T:指定tendis实例密码
./siphon_v2 sync -p 1 -f 127.0.0.1:8888 -t 172.16.16.47:6379 -T tendis@pwd
4. 迁移测试
4.1 SSDB数据模拟
登录ssdb-server, 用命令先写几条数据。如下所示:
代码语言:txt复制[root@VM-16-44-centos]# cd /usr/local/ssdb
[root@VM-16-44-centos ssdb]# ./ssdb-cli
ssdb (cli) - ssdb command line tool.
Copyright (c) 2012-2016 ssdb.io
'h' or 'help' for help, 'q' to quit.
ssdb-server 1.9.8
ssdb 127.0.0.1:8888> hset myhash k1 v1
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hset myhash k2 v2
ok
(0.000 sec)
ssdb 127.0.0.1:8888> hset myhash k3 v3
ok
(0.000 sec)
4.2 启动迁移工具
新开启一个新的终端登录CVM, 并执行如下命令启动迁移工具。
代码语言:txt复制./siphon_v2 sync -p 1 -f 127.0.0.1:8888 -t 172.16.16.47:6379 -T tendis@pwd
启动后,可以看到一些控制台输出,如下所示:
图中红框部分标识的是全量数据同步过程:
- Copy Start: 表示开始启动全量数据同步
- Copy Stop: 表示全量数据同步结束
4.3 Tendis数据查看
再开启一个新的终端登录CVM,登录Tendis实例查看刚全量数据同步结果。
代码语言:txt复制[root@VM-16-44-centos ~]# redis-cli -h 172.16.16.47 -p 6379 -a tendis@pwd
Warning: Using a password with '-a' option on the command line interface may not be safe.
172.16.16.47:6379> hget myhash k1
"v1"
172.16.16.47:6379> hget myhash k2
"v2"
172.16.16.47:6379> hget myhash k3
"v3"
172.16.16.47:6379>
从上面结果来看,Tendis已经把ssdb-server中刚插入的数据同步完成。
4.4 增量数据同步
对于增量数据,迁移工具是先进行全量数据同步,然后进程不退出,等待新数据的生成并进行增量同步到Tendis。
5. 迁移总结
本文只模拟了少量数据的同步过程,实际在业务迁移过程中,还有很多问题需要考虑,如下:
- 业务数据特性,如hash、zset等value大小问题,生产迁移时需要考虑当一个hash有几万甚至几十万的field时的迁移流程
- 业务逻辑开发,原有的ssdb如果是单实例模式的话,需要考虑迁移到redis-cluster时有些逻辑兼容性问题,如跨slot事务、pipeline管道等
- 业务迁移问题,具体涉及生产迁移时,还需要考虑业务暂停、用户公告、数据迁移、数据校验等一系列问题
腾讯云在业务数据生产迁移方面已积累了大量的经验,同时也有很多工具已开放给客户使用,如DTS服务。如您需要数据迁移方面的咨询与帮助,可随时咨询腾讯云客服获得对应服务。
undefined