如何迁移SSDB数据到Tendis解决方案
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配置文件内容如下:
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机器对应目录。工具使用方式如下:
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的命令如下:
#-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, 用命令先写几条数据。如下所示:
[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, 并执行如下命令启动迁移工具。
./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实例查看刚全量数据同步结果。
[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
- 利用代码实现自定义圆角+阴影按钮 android-flat-button
- 周末阅读:程序员的《权利法案》
- 对利用Adobe 0day – CVE-2014-0502进行攻击的行为分析
- Android系统更改状态栏字体颜色
- Android实现竖着的滑动刻度尺效果,选择身高(竖向的)
- DedeCMS全版本通杀SQL注入漏洞利用代码及工具
- Android实现滑动刻度尺效果,选择身高体重和生日
- 浅谈开源web程序后台的安全性
- Web漏洞演练平台 – ZVulDrill
- Android内存泄漏终极解决篇(上)
- 走近科学:我是如何入侵Instagram查看你的私人片片的
- 在线手写识别的多卷积神经网络方法
- 苹果发布OS X 10.9.2更新,修复SSL漏洞
- Android内存泄漏终极解决篇(下)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- VUE-001-在表格单元格(el-table-column)中添加超链接访问
- 关于vue的title标签中出现的htmlWebpackPlugin.options.title
- dotnet tool 工具安装提示 Could not find a part of the path 安装失败
- dotnet core 进行 XML 序列化抛出 XmlSerializers dll 文件找不到
- C# dotnet 高性能多线程工具 ExecuteOnceAwaiter 只执行一次的任务
- 一道Postgresql递归树题
- 突击并发编程JUC系列-JDK1.8 扩展类型 LongAdder
- 利用tensorflow训练简单的生成对抗网络GAN
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.7):运算符(基本算数运算符、原码、反码、补码)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(字符编码和char型)
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.6):基本数据类型及字符集编码(整型、浮点型、布尔型)
- 多图详解Spring框架的设计理念与设计模式
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
- 《Java从入门到失业》第三章:基础语法及基本程序结构(3.1):一个简单的例子
- 详解Java解析XML的四种方法