如何迁移SSDB数据到Tendis解决方案

2020-09-29 20:44:00 浏览数 (1)

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机器,解压编译安装。如下所示:

代码语言:txt复制
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

启动后,可以看到一些控制台输出,如下所示:

siphon_start.pngsiphon_start.png

图中红框部分标识的是全量数据同步过程:

  • 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

0 人点赞