解读 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis) 的迁移
摘要:本期将详细介绍 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis)的迁移。
本文分享自华为云社区《华为云PB级数据库GaussDB(for Redis)揭秘第十一期:GaussDB(forRedis)迁移系列(下)》,原文作者:高斯 Redis 官方博客 。
GaussDB(for Redis)是一款基于计算存储分离架构,兼容 Redis 生态的云原生 NoSQL 数据库,基于共享存储池的多副本强一致机制,支持持久化存储。在保障数据库的高兼容、搞性价比、高可靠、无损扩容等特点的同时,GaussDB(forRedis)团队针对不同的数据库产品,为用户提供了多种数据迁移方案,本期将详细介绍 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis)的迁移。
1、SSDB 到 GaussDB(for Redis)的迁移
SSDB 是一款使用 C/C++语言开发的高性能 NoSQL 数据库,和 Redis 具有相似的 API,支持 KV,list,map(hash),zset(sorted set),qlist(队列)等数据结构,因此得到了广泛的应用。SSDB 是一个持久化的 KV 存储系统,底层使用 leveldb 作为存储引擎。其业务直接与 LevelDB 交互,Compaction 等操作会对业务读写造成直接的影响。 GaussDB(forRedis)是一款兼容 Redis 生态的云原生 NoSQL 数据库,基于共享存储池的多副本强一致机制,以保证数据的安全性和可靠性。GaussDB(forRedis)使用 RocksDB 作为存储引擎,其性能与 leveldb 相比有了很大的提升, 并解决了 leveldb 主动限制写的问题,同时实现了冷热分离,减小了存储层的操作对性能造成的影响。
1.1 迁移原理
ssdb-port 作为源端 SSDB 数据库的主节点的从节点(replica)运行,通过主从复制的方式进行数据迁移。将获取到的数据解析、转换为 Redis 支持的格式,并发送到配置文件中指定的 Redis 实例,迁移过程如下图所示。全量同步完成后,SSDB 中新增的数据也会同步到 Redis 实例中。

1.2 前提条件
- 部署迁移工具 ssdb-port。
- 保证迁移工具 ssdb-port、源端 SSDB 和目标端 GaussDB(for Redis)网络互通。
1.3 操作步骤
1. 正确修改 ssdb-port 的配置文件 conf。
2. 使用./ssdb-portssdb_port.conf 命令启动进程,进行数据迁移。
3. 跟踪迁移日志,评估迁移进度,迁移完成后,在高斯 Redis 实例上校验迁移数据的正确性和完备性。
4. 校验完成后将业务切到 GaussDB(for Redis)。
1.4 使用须知
- ssdb-port 作为 SSDB 主节点的从节点,只读取全量和增量数据,无数据受损风险。
- 由于在源端使用 ssdb-port 迁移工具,源端 SSDB 性能会受到一定的影响。
- 全量迁移和增量迁移可以不停服,数据全部迁入 GaussDB(forRedis)后需要短暂停服。
1.5 迁移性能参考
- 环境:源端 SSDB 和 ssdb-port 同时部署在华为云 4U16GB 的弹性云服务器上,目标端为 8U16GB,3 节点 GaussDB(for Redis)实例。
- 预置数据:使用 memtier_benchmark 工具预置 100GB 数据。
- 迁移性能:约 3000qps。
2、LevelDB 到 GaussDB(for Redis)的迁移
LevelDB 是一个开源的持久化 KV 单机数据库引擎,具有很高的随机写,顺序读/写性能,适合应用在写多读少的场景。其内部没有设计成 C/S 网络结构,使用时必须和服务部署在同一台服务器,对于服务的部署、使用有较大的限制。相比于在 LevelDB 基础上开发的 RocksDB, LevelDB 存在较多缺点,如无法很好的使用多核服务器的计算性能,无法支撑 TB 级数据存储,不支持从 HDFS 读取数据等。
GaussDB(for Redis)采用 RocksDB 作为存储引擎,兼容 Redis 协议,具有丰富的数据类型,可以满足 LevelDB 的使用需求。同时 GaussDB(for Redis)对 RocksDB 进行深度定制,实现秒级分裂弹性扩容,扩缩容无需搬迁数据,快速而平滑,为 LevelDB 业务转到 Redis 生态提供了便利。
2.1 迁移原理
使用自研迁移工具 leveldb-port,和 LevelDB 部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。全量迁移对 LevelDB 数据进行快照,然后扫描整个数据库,将数据打包成 GaussDB(forRedis)识别的格式,发送到 GaussDB(forRedis) ,具有很高的迁移效率。增量迁移解析 LevelDB 的 wal 文件,将 LevelDB 的操作解析出来,然后对其中的 key 进行分片,多线程进行发送。
2.2 操作步骤
将 leveldb-port 部署在 leveldb 所在服务器上,确保与高斯 Redis 网络打通。
确保目标端 GaussDB(for Redis) 实例已清空,从安全性考虑,对外不提供 flushall 命令,迁移之前应保证实例内数据已清除。
修改配置文件。
1. 准备工作:
- 将 leveldb-port 部署在 leveldb 所在服务器上,确保与高斯 Redis 网络打通。
- 确保目标端 GaussDB(for Redis) 实例已清空,从安全性考虑,对外不提供 flushall 命令,迁移之前应保证实例内数据已清除。
- 修改配置文件。
1. 执行命令./leveldb-port./leveldb-port.conf。
2. 跟踪日志,判断迁移状态:
- 全量迁移完成,会打印"Fullmigrate finished";
- 增量迁移定时打印尚未完成的 wal 文件数及尚未发送出去的 kv 数。
1. 数据验证:对 LevelDB 进行抽样验证,确保 GaussDB (forRedis) 加载数据正确。
2. 服务切换:当增量迁移进入尾声时,将服务切换到 GaussDB(for Redis)。
2.3 使用须知
- 迁移工具需要部署在源端,对性能有一定消耗,可通过修改配置文件进行一定的控制。
- 迁移过程读取 LevelDB 的源数据文件,只读操作,理论上不会有数据受损风险。
- 迁移过程不需要停服。
- 若迁移过程出现故障,需要清理 GaussDB(forRedis)实例,重新启动迁移。
3、RocksDB 到 GaussDB(for Redis)的迁移
RocksDB 是 FaceBook 基于 LevelDB 开发的一个持久化 KV 单机数据库引擎,具有强大的顺序读写及随机写性能。相对于 LevelDB,RocksDB 做了许多优化,性能有了很大提升, 而且解决了 LevelDB 主动限制写的问题。作为一个数据库引擎,RocksDB 没有设计成 C/S 网络结构,直接使用需要和服务部署在同一台服务器,对于服务的部署、使用有较大的限制。
GaussDB(for Redis)采用 RocksDB 作为存储引擎,兼容 Redis 协议具有丰富的数据类型,可以满足 RocksDB 的使用需求。同时 GaussDB(for Redis)对 RocksDB 进行深度定制,实现秒级分裂弹性扩容,扩缩容无需搬迁数据,快速而平滑,为 RocksDB 业务转到 Redis 生态提供了便利。
3.1 迁移原理
使用自研迁移工具 rocksdb-port,和 RocksDB 部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。全量迁移对 RocksDB 数据进行快照,然后扫描整个数据库,将数据打包成 GaussDB(forRedis)识别的格式,发送到 GaussDB(forRedis),具有很高的迁移效率。增量迁移解析 RocksDB 的 wal 文件,将 RocksDB 的操作解析出来,然后对其中的 key 进行分片,多线程进行发送。
3.2 前提条件
- 部署迁移工具 pika-port
- 确保源端 Pika 实例、pika-port 和目标端 GaussDB(for Redis)实例网络互通。
3.3 操作步骤
1. 准备工作:
- 将 rocksdb-port 部署在 rocksdb 同服务器上,确保与高斯 Redis 网络打通。
- 确保目标端 GaussDB(for Redis) 实例已清空,从安全性考虑,对外不提供 flushall 命令,迁移之前应保证实例内数据已清除。
- 修改配置文件。
1. 启动迁移:执行命令./rocksdb-port./rocksdb-port.conf
2. 跟踪日志,判断迁移状态:
- 全量迁移完成,会打印"Fullmigrate finished";
- 增量迁移定时打印尚未解析的 wal 文件数及尚未发送出去的 kv 数。
1. 数据验证:对 RocksDB 进行抽样验证,确保 GaussDB (forRedis) 加载数据正确。
2. 服务切换:当增量迁移进入尾声时,将服务切换到 GaussDB(for Redis) 。
3.4 使用须知
- 迁移工具需要部署在源端,对性能有一定消耗,可通过修改配置文件进行一定的控制。
- 迁移过程读取 RocksDB 的源数据文件,只读操作,理论上不会有数据受损风险。
- 迁移过程不需要停服。
- 若迁移过程出现故障,需要清理 GaussDB(forRedis)实例,重新启动迁移。
4、结语
高斯 Redis 在社区版 Redis 的基础上,结合华为自研强一致存储 DFV Pool,具有强一致、秒扩容、超可用、低成本等优势,保证了计数的准确性、可靠性。
本文作者:华为云高斯 Redis 团队。
杭州西安深圳简历投递:yuwenlong4@huawei.com
更多技术文章,关注高斯 Redis 官方博客:
https://bbs.huaweicloud.com/community/usersnew/id_1614151726110813
解读 SSDB、LevelDB 和 RocksDB 到 GaussDB(for Redis) 的迁移的更多相关文章
- 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致
摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...
- 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数
摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...
- 深度评测丨 GaussDB(for Redis) 大 Key 操作的影响
本文分享自华为云社区<墨天轮评测:GaussDB(for Redis)大Key操作的影响>,作者: 高斯 Redis 官方博客. 在前一篇文章<墨天轮评测:GaussDB(for R ...
- 揭秘GaussDB(for Redis):全面对比Codis
摘要:Codis集群在国内Redis生态圈很流行,社区已停止维护.本文从架构和特性两方面对比,带你感受华为云GaussDB(for Redis)的全新价值. 本文分享自华为云社区<华为云Gaus ...
- 即时通讯系统为什么选择GaussDB(for Redis)?
摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...
- 发布一个参考ssdb,使用go类似的实现redis高性能nosql:ledisdb
起因 ledisdb是一个參考ssdb.採用go实现,底层基于leveldb,相似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们如今的应用极大的依 ...
- 发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb
起因 ledisdb是一个参考ssdb,采用go实现,底层基于leveldb,类似redis的高性能nosql数据库,提供了kv,list,hash以及zset数据结构的支持. 我们现在的应用极大的依 ...
- openfire源码解读之将cache和session对象移入redis以提升性能
原文:http://blog.csdn.net/jinzhencs/article/details/50522322 前言: 目前我们的openfire服务器只能支撑单机2W 集群4W.(估测在线用户 ...
- rocksdb和leveldb性能比较——写性能
前面学习了一下rocksdb,这个db是对leveldb的一个改进,是基于leveldb1.5的版本上的改进,而且leveldb1.5以后也在不断的优化,下面从写入性能对两者进行对比. 前言 比较的l ...
- 把rocksdb配置成leveldb
将rocksdb配置成leveldb 1.配置方法 配置方式有三种: 第一种适合进行性能测试对比:是以参数形式在运行db_bench或ycsb-c的时候以参数形式将rocksdb将其配置成leveld ...
随机推荐
- 如何将Python程序打包并保护源代码
导言: 在某些情况下,我们可能希望将Python程序打包成可执行文件,以便用户无法查看程序的源代码.这种需求通常出现在商业软件.数据分析工具或其他需要保护知识产权的场景中.本文将介绍如何使用PyIns ...
- xxl-job安装部署文档
xxl-job安装部署文档 注意:替换yaml文件中的mysql地址 安装方式 kubectl apply -f xxl-job.yaml -n xxxx 安装配置文件 xxl-job.yaml ## ...
- spring---面向切面(AOP @Pointcut 表达式篇)
AOP(面向切面编程),可以说是OOP(面向对象编程)的补充和完善.OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. 当我们需要为分散的对象引入公共行为的时候,O ...
- 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个 key 中
/** * 把工单历史表中的数据,按照工单进行分类,每一批工单的数据放在同一个key中 * 将对象列表按名称分类成 Map(分类名必与对象的某 get 方法的后的名一致<如:get(name) ...
- @ApiImplicitParam dataType属性失效
最近在弄swagger,老是碰到注解属性失效问题.百度看了一大推,都是说什么版本问题.但是都不是我遇到的情况,下面直接上我遇到的问题及答案 可以看到,我直接用Integer,或者int,去到swa ...
- EhCache使用详细介绍
http://hi.baidu.com/yjl_zzh/item/18e6518397cdd1d9d1f8cdfb 2.EhCache的使用注意点 当用Hibernate的方式修改表数据(sav ...
- EdisonTalk.MongoProxy组件发布v0.0.6版本
大家好,我是Edison. 组件发布的背景 之前工作中需要用到MongoDB的事务操作,因此参考了一些资料封装了一个小的组件,提供基础的CRUD Repository基类 和 UnitOfWork工作 ...
- 《流畅的Python》 读书笔记 第8章_对象引用、可变性和垃圾回收
第8章_对象引用.可变性和垃圾回收 本章的主题是对象与对象名称之间的区别.名称不是对象,而是单独的东西 name = 'wuxianfeng' # name是对象名称 'wuxianfeng'是个st ...
- 普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- C语言求100以内的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义和调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0。
/* 开发者:慢蜗牛 开发时间:2020.5.28 程序功能:求100以内的素数 */ #include<stdio.h> int prime(int m); int prime(int ...