博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis-shake数据迁移工具
阅读量:7055 次
发布时间:2019-06-28

本文共 4852 字,大约阅读时间需要 16 分钟。

  redis-shake是阿里云Redis&MongoDB团队开源的用于redis数据同步的工具。

基本功能

  redis-shake是我们基于基础上进行改进的一款产品。它支持解析恢复备份同步四个功能。以下主要介绍同步sync。

  • 恢复restore:将RDB文件恢复到目的redis数据库。
  • 备份dump:将源redis的全量数据通过RDB文件备份起来。
  • 解析decode:对RDB文件进行读取,并以json格式解析存储。
  • 同步sync:支持源redis和目的redis的数据同步,支持全量和增量数据的迁移,支持从云下到阿里云云上的同步,也支持云下到云下不同环境的同步,支持单节点、主从版、集群版之间的互相同步。需要注意的是,如果源端是集群版,需要搭建多条链路从不同的db结点进行拉取,同时源端不能开启move slot功能;对于目的端,如果是集群版,写入可以是1个或者多个db结点。
  • 同步rump:支持源redis和目的redis的数据同步,仅支持全量的迁移。采用scan和restore命令进行迁移,支持不同云厂商不同redis版本的迁移。

基本原理

  redis-shake的基本原理就是模拟一个从节点加入源redis集群,首先进行全量拉取并回放,然后进行增量的拉取(通过psync命令)。如下图所示:

Screen_Shot_2019_03_29_at_6_23_58_PM

  如果源端是集群模式,每个节点都需要搭建一个redis-shake进行拉取,同时不能开启源端的move slot操作。如果目的端是集群模式,可以写入到一个结点,然后再进行slot的迁移,当然也可以多对多写入。

  目前,redis-shake到目的端采用单链路实现,对于正常情况下,这不会成为瓶颈,但对于极端情况,qps比较大的时候,此部分性能可能成为瓶颈,后续我们可能会计划对此进行优化。另外,redis-shake到目的端的数据同步采用异步的方式,读写分离在2个线程操作,降低因为网络时延带来的同步性能下降。

高效性

   全量同步阶段并发执行,增量同步阶段异步执行,能够达到毫秒级别延迟(取决于网络延迟)。同时,我们还对大key同步进行分批拉取,优化同步性能。

监控

   用户可以通过我们提供的restful拉取metric来对redis-shake进行实时监控:curl 127.0.0.1:9320/metric

校验

   如何校验同步的正确性?可以采用我们开源的,具体原理可以参考。

支持

  • 支持2.8-5.0版本的同步。
  • 支持codis。
  • 支持云下到云上,云上到云上,云上到云下(阿里云目前支持主从版),其他云到阿里云等链路,帮助用户灵活构建混合云场景。

开发中的功能

  1. 断点续传。支持断开后按offset恢复,降低因主备切换、网络抖动造成链路断开重新同步拉取全量的性能影响。
  2. 多活支持。支持双向实时同步,搭建异地灾备多活。

参数解释:

启动示例(以sync举例):

vinllen@ ~/redis-shake/bin$ ./redis-shake -type=sync -conf=../conf/redis-shake.conf
conf路径下的redis-shake.conf存放的是配置文件,其内容及部分中文注释如下

# this is the configuration of redis-shake.# idid = redis-shake# log file,日志文件,不配置将打印到stdoutlog_file =# pprof portsystem_profile = 9310# restful port,查看metric端口http_profile = 9320# runtime.GOMAXPROCS, 0 means use cpu core number: runtime.NumCPU()ncpu = 0# parallel routines number used in RDB file syncing.parallel = 4# input RDB file. read from stdin, default is stdin ('/dev/stdin').# used in `decode` and `restore`.# 如果是decode或者restore,这个参数表示读取的rdb文件input_rdb = local_dump# output RDB file. default is stdout ('/dev/stdout').# used in `decode` and `dump`.# 如果是decode或者dump,这个参数表示输出的rdboutput_rdb = local_dump# source redis configuration.# used in `dump` and `sync`.# ip:port# 源redis地址source.address = 127.0.0.1:20441# password.source.password_raw = kLNIl691OZctWST# auth type, don't modify itsource.auth_type = auth# version number, default is 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)source.version = 6# target redis configuration. used in `restore` and `sync`.# used in `restore` and `sync`.# ip:port# 目的redis地址target.address = 10.101.72.137:20551# password.target.password_raw = kLNIl691OZctWST# auth type, don't modify ittarget.auth_type = auth# version number, default is 6 (6 for Redis Version <= 3.0.7, 7 for >=3.2.0)target.version = 6# all the data will come into this db. < 0 means disable.# used in `restore` and `sync`.target.db = -1# use for expire key, set the time gap when source and target timestamp are not the same.# 用于处理过期的键值,当迁移两端不一致的时候,目的端需要加上这个值fake_time =# force rewrite when destination restore has the key# used in `restore` and `sync`.# 当源目的有重复key,是否进行覆写rewrite = true# filter db or key or slot# choose these db, e.g., 5, only choose db5. defalut is all.# used in `restore` and `sync`.# 支持过滤db,只让指定的db通过filter.db =# filter key with prefix string. multiple keys are separated by ';'.# e.g., a;b;c# default is all.# used in `restore` and `sync`.# 支持过滤key,只让指定的key通过,分号分隔filter.key =# filter given slot, multiple slots are separated by ';'.# e.g., 1;2;3# used in `sync`.# 指定过滤slot,只让指定的slot通过filter.slot =# big key threshold, the default is 500 * 1024 * 1024. The field of the big key will be split in processing.# 我们对大key有特殊的处理,此处需要指定大key的阈值big_key_threshold = 524288000# use psync command.# used in `sync`.# 默认使用sync命令,启用将会使用psync命令psync = false# enable metric# used in `sync`.# 是否启用metricmetric = true# print in log# 是否将metric打印到log中metric.print_log = true# heartbeat# send heartbeat to this url# used in `sync`.# 心跳的url地址,redis-shake将会发送到这个地址heartbeat.url = http://127.0.0.1:8000# interval by seconds# 心跳保活周期heartbeat.interval = 3# external info which will be included in heartbeat data.# 在心跳报文中添加额外的信息heartbeat.external = test external# local network card to get ip address, e.g., "lo", "eth0", "en0"# 获取ip的网卡heartbeat.network_interface =# sender information.# sender flush buffer size of byte.# used in `sync`.# 发送缓存的字节长度,超过这个阈值将会强行刷缓存发送sender.size = 104857600# sender flush buffer size of oplog number.# used in `sync`.# 发送缓存的报文个数,超过这个阈值将会强行刷缓存发送sender.count = 5000# delay channel size. once one oplog is sent to target redis, the oplog id and timestamp will also stored in this delay queue. this timestamp will be used to calculate the time delay when receiving ack from target redis.# used in `sync`.# 用于metric统计时延的队列sender.delay_channel_size = 65535# ----------------splitter----------------# below variables are useless for current opensource version so don't set.# replace hash tag.# used in `sync`.replace_hash_tag = false# used in `restore` and `dump`.extra = false

开原地址

:

转载地址:http://swmol.baihongyu.com/

你可能感兴趣的文章
关于laravel5的excel包maatwebsite/excel的使用笔记_v1.0_byKL
查看>>
Codeweavers的丰田模式
查看>>
Google I/O 2015开发者观赏指南
查看>>
编转码、CDN和AI是如何撑起短视频数百亿市场规模的
查看>>
〔译〕C# 7 的新特性
查看>>
到底谁应该对软件开发的质量负责?
查看>>
专访尤雨溪:先别管4.0了,Vue CLI重构了解一下
查看>>
Scrum指南更新:Ken Schwaber、Jeff Sutherland访谈
查看>>
jQuery 3.3.1已经发布,开发团队正在准备4.0版本
查看>>
高效使用微软Azure服务总线的消息功能
查看>>
使用C#来面向GPU编程
查看>>
自定义类加载器-从.class和.jar中读取
查看>>
资深专家都知道的Docker常用命令
查看>>
Windows 10或成为最后一个Windows版本
查看>>
携程App for Apple Watch探索
查看>>
Spotify希望自己擅于失败
查看>>
敏捷宣言和企业Scrum作者Mike Beedle去世
查看>>
5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
查看>>
调研对敏捷宣言2.0的需求
查看>>
微软在C# 8中引入预览版可空引用类型
查看>>