RedisShake配置详情

图片[1]- RedisShake配置详情- 如烟笔记

1、简介

RedisShake 是一个用于处理和迁移 Redis 数据的工具,它提供以下特性:

Redis 兼容性:RedisShake 兼容从 2.8 到 7.2 的 Redis 版本,并支持各种部署方式,包括单机、主从、哨兵和集群。

云服务兼容性:RedisShake 与主流云服务提供商提供的流行 Redis-like 数据库无缝工作,包括但不限于:

阿里云-云数据库 Redis 版
阿里云-云原生内存数据库Tair
AWS – ElastiCache
AWS – MemoryDB

Module 兼容:RedisShake 与 TairString,TairZSet 和 TairHash 模块兼容。

多种导出模式:RedisShake 支持 PSync,RDB 和 Scan 导出模式。

数据处理:RedisShake 通过自定义脚本实现数据过滤和转换。

2、迁移模式介绍

目前, RedisShake 有三种迁移模式:PSync、RDB 和 SCAN,分别对应 sync_reader、rdb_reader 和 scan_reader。

对于从备份中恢复数据的场景,可以使用 rdb_reader。

对于数据迁移场景,优先选择 sync_reader。一些云厂商没有提供 PSync 协议支持,可以选择scan_reader。

对于长期的数据同步场景,RedisShake 目前没有能力承接,因为 PSync 协议并不可靠,当复制连接断开时,RedisShake 将无法重新连接至源端数据库。如果对于可用性要求不高,可以使用 scan_reader。如果写入量不大,且不存在大 key,也可以考虑 scan_reader。不同模式各有优缺点,需要查看各 Reader 章节了解更多信息。

2.1、Redis Cluster 架构

当源端 Redis 以 cluster 架构部署时,可以使用 sync_reader 或者 scan_reader。两者配置项中均有开关支持开启 cluster 模式,会通过 cluster nodes 命令自动获取集群中的所有节点,并建立连接。

2.2、Redis Sentinel 架构

当源端 Redis 以 sentinel 架构部署且 RedisShake 使用 sync_reader 连接主库时,会被主库当做 slave,从而有可能被 sentinel 选举为新的 master。

为了避免这种情况,应选择备库作为源端。

2.3云 Redis 服务

主流云厂商都提供了 Redis 服务,不过有几个原因导致在这些服务上使用 RedisShake 较为复杂:

引擎限制。存在一些自研的 Redis-like 数据库没有兼容 PSync 协议。

架构限制。较多云厂商支持代理模式,即在用户与 Redis 服务之间增加 Proxy 组件。因为 Proxy 组件的存在,所以 PSync 协议无法支持。

安全限制。在原生 Redis 中 PSync 协议基本会触发 fork(2),会导致内存膨胀与用户请求延迟增加,较坏情况下甚至会发生 out of memory。尽管这些都有方案缓解,但并不是所有云厂商都有这方面的投入。

商业策略。较多用户使用 RedisShake 是为了下云或者换云,所以部分云厂商并不希望用户使用 RedisShake,从而屏蔽了 PSync 协议。

下文会结合实践经验,介绍一些特殊场景下的 RedisShake 使用方案。

2.4、阿里云「云数据库 Redis」与「云原生内存数据库Tair」

「云数据库 Redis」与「云原生内存数据库Tair」都支持 PSync 协议,推荐使用 sync_reader。用户需要创建一个具有复制权限的账号(可以执行 PSync 命令),RedisShake 使用该账号进行数据同步,具体创建步骤见 创建与管理账号。

例外情况:

2.8 版本的 Redis 实例不支持创建复制权限的账号,需要 升级大版本。

集群架构的 Reids 与 Tair 实例在 代理模式 下不支持 PSync 协议。

读写分离架构不支持 PSync 协议。

在不支持 PSync 协议的场景下,可以使用 scan_reader。需要注意的是,scan_reader 会对源库造成较大的压力。

2.5、AWS ElastiCache and MemoryDB

优选 sync_reader, AWS ElastiCache and MemoryDB 默认情况下没有开启 PSync 协议,但是可以通过提交工单的方式请求开启 PSync 协议。AWS 会在工单中给出一份重命名的 PSync 命令,比如 xhma21yfkssync 和 nmfu2bl5osync。此命令效果等同于 psync 命令,只是名字不一样。 用户修改 RedisShake 配置文件中的 aws_psync 配置项即可。对于单实例只写一对 ip:port@cmd 即可,对于集群实例,需要写上所有的 ip:port@cmd,以逗号分隔。

不方便提交工单时,可以使用 scan_reader。需要注意的是,scan_reader 会对源库造成较大的压力。

3、安装

3.1、在线安装

3.1.1从源码编译

要从源码编译的情况下,要确保已安装Golang的环境,并且能连通外网

git clone https://github.com/alibaba/RedisShake

cd RedisShake

sh build.sh

3.1.2直接使用官方提供的二进制包

直接从 Release 下载二进制包。

https://github.com/tair-opensource/RedisShake/releases

下载完成后上传到任意目录,解压即可

 

4、迁移配置

4.1、在线迁移SYNC模式

4.1.1、介绍

当源端数据库兼容 PSync 协议时,推荐使用 sync_reader。兼容 PSync 协议的数据库有:

  • Redis
  • Tair
  • ElastiCache 部分兼容
  • MemoryDB 部分兼容

优势:数据一致性最佳,对源库影响小,可以实现不停机的切换

原理:RedisShake 模拟 Slave 连接到 Master 节点,Master 会向 RedisShake 发送数据,数据包含全量与增量两部分。全量是一个 RDB 文件,增量是 AOF 数据流,RedisShake 会接受全量与增量将其暂存到硬盘上。全量同步阶段:RedisShake 首先会将 RDB 文件解析为一条条的 Redis 命令,然后将这些命令发送至目的端。增量同步阶段:RedisShake 会持续将 AOF 数据流同步至目的端。

配置介绍

  • cluster:源端是否为集群
  • address:源端地址, 当源端为集群时,address 为集群中的任意一个节点即可
  • 鉴权:
  • 当源端使用 ACL 账号时,配置username 和 password
  • 当源端使用传统账号时,仅配置password
  • 当源端无鉴权时,不配置username 和 password
  • tls:源端是否开启 TLS/SSL,不需要配置证书因为 RedisShake 没有校验服务器证书
  • sync_rdb:是否同步 RDB,设置为 false 时,RedisShake 会跳过全量同步阶段
  • sync_aof:是否同步 AOF,设置为 false 时,RedisShake 会跳过增量同步阶段,此时 RedisShake 会在全量同步阶段结束后退出

4.1.2、单点模式迁移

[sync_reader]:

cluster配置为false

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster、sentinel配置为false

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

4.1.3、集群模式迁移

[sync_reader]:

cluster配置为true

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster配置为true

sentinel配置为false

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

4.1.4、哨兵模式

[sync_reader]:

cluster配置为false

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster配置为false

sentinel配置为true

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

4.2、在线迁移SCAN模式

4.2.1、介绍

TIP

scan_reader 的性能与数据一致性均不如 sync_reader,应尽可能选择 sync_reader。

Scan Reader 有 SCAN 和 KSN 两个阶段,SCAN 阶段是全量同步,KSN 阶段是增量同步。

全量数据

SCAN 阶段:默认开启,可通过 scan 配置关闭。scan_reader 通过 SCAN 命令遍历源端数据库中的所有 Key,之后使用 DUMP 获取 Key 对应的 Value,并通过 RESTORE 命令写入目标端,完成数据的全量同步。

Redis 的 SCAN 命令只保证 SCAN 操作开始至结束期间均存在的 Key 一定会被返回,但是新写入的 Key 有可能会被遗漏,期间删除的 Key 也可能已经被写入目的端。

SCAN 阶段期间 RedisShake 会通过 SCAN 命令 返回的游标来计算出当前同步进度。该进度有较大误差,仅供参考。对于非 Redis 数据库游标计算方式与 Redis 不同,所以可能会看到进度显示错误的情况,忽略即可。

增量数据

KSN 阶段:默认关闭,可通过 ksn 开启,可以解决 SCAN` 阶段期间遗漏 Key 问题。增量数据同步并不是在 SCAN 阶段结束后才开始,而是与其一同进行,并在 SCAN 阶段结束后持续进行,直到退出 RedisShake。

ksn 使用 Redis keyspace notifications 能力来订阅 Key 的变化。具体来说,RedisShake 会使用 psubscribe 命令订阅 __keyevent@*__:*,当 Key 发生变化时,RedisShake 会收到发生修改的 Key,之后使用 DUMP 与 RESTORE 命令来从源端读取 Key 的内容,并写入目标端。

Redis 在默认情况下不会开启 notify-keyspace-events 配置,需要手动开启,保证值中含有 AE。

如果在 KSN 阶段出现源端将连接断开,考虑适当调高 client-output-buffer-limit pubsub 的值。802

Redis keyspace notifications 不会感知到 FLUSHALL 与 FLUSHDB 命令,因此在使用 ksn 参数时,需要确保源端数据库不会执行这两个命令。

性能影响

SCAN 与 KSN 阶段均使用 DUMP 命令来获取数据,DUMP 命令是 CPU 密集命令,会对源端造成较高压力。需要小心使用,避免影响源端实例的可用性。

对于 SCAN 阶段,可以通过调整 count 参数来减轻源端压力,建议从 1 开始,逐步增加。

对于 KSN 阶段,暂无参数可调整,需要根据源端写请求量来评估是否开启。

性能影响参考数据:源端实例写 QPS 为 15 万左右时,源端 CPU 使用率为 47%,开启 RedisShake 后,源端 CPU 使用率为 91%。

配置

 

  • cluster:源端是否为集群
  • address:源端地址, 当源端为集群时,address为集群中的任意一个节点即可
  • 鉴权:
    • 当源端使用 ACL 账号时,配置 username和 password
    • 当源端使用传统账号时,仅配置password
    • 当源端无鉴权时,不配置username 和 password
  • tls:源端是否开启 TLS/SSL,不需要配置证书因为 RedisShake 没有校验服务器证书
  • dbs:源端为非集群模式时,支持仅同步指定 DB 库。
  • scan:是否开启 SCAN 阶段,设置为 false 时,RedisShake 会跳过全量同步阶段
  • ksn:开启ksn 参数后,RedisShake 会订阅源端的 Key 变化,实现增量同步
  • count:全量同步时每次从源端拉取的 key 的个数,默认为 1,改为较大值可以显著提升同步效率,同时也会提升源端压力。

 

4.2.2、单点模式迁移

[scan_reader]:

cluster配置为false

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster、sentinel配置为false

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

 

scan_reader 通过 SCAN 命令遍历源端数据库中的所有 Key,并使用 DUMP 与 RESTORE 命令来读取与写入 Key 的内容。

注意:

Redis 的 SCAN 命令只保证 SCAN 的开始与结束之前均存在的 Key 一定会被返回,但是新写入的 Key 有可能会被遗漏,期间删除的 Key 也可能已经被写入目的端。这可以通过 ksn 配置解决。

SCAN 命令与 DUMP 命令会占用源端数据库较多的 CPU 资源。

配置:

[scan_reader]

cluster = false # set to true if source is a redis cluster

address = “127.0.0.1:6379” # when cluster is true, set address to one of the cluster node

username = “” # keep empty if not using ACL

password = “” # keep empty if no authentication is required

tls = false

ksn = false # set to true to enabled Redis keyspace notifications (KSN) subscription

dbs = [] # set you want to scan dbs, if you don’t want to scan all

 

4.2.2、集群模式迁移

[scan_reader]:

cluster配置为true

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster配置为true

sentinel配置为false

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

4.2.4、集群模式迁移

[sync_reader]:

cluster配置为true

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster配置为true

sentinel配置为false

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

4.2.3、哨兵模式

[scan_reader]:

cluster配置为false

address配置为源实例地址

username、password没有就留空

tls安全连接未开启就配置为false

sync_rdb、sync_aof、prefer_replica默认为true

try_diskless默认为false

[redis_writer]:

cluster配置为false

sentinel配置为true

master为空

address为目标实例

username、password没有就留空

tls安全连接未开启就配置为false

off_reply服务器回复默认配置为false

其他配置可保持不动

 

配置好以后,启动命令,在解压好的文件夹中

./redis-shake shake.toml

 

4.3、RDB文件导入模式

4.3.1、单点、集群、哨兵通用

[sync_reader]注释

[rdb_reader]配置,filepath为源实例rdb文件的绝对路径

[redis_writer] 配置:

单点模式:cluster为false、sentinel为false

集群模式:cluster为true、sentinel为true

哨兵模式:cluster为false、sentinel为true,master为指定主节点名称,address为哨兵地址。

注:如果有多个rdb文件,要创建多个shake.toml文件,分别执行

1、不要在同一个目录运行两个 RedisShake 进程,因为运行时产生的临时文件可能会被覆盖,导致异常行为。

2、不要降低 Redis 版本,比如从 6.0 降到 5.0,因为 RedisShake 每个大版本都会引入一些新的命令和新的编码方式,如果降低版本,可能会导致不兼容。

 

 

4.4、AOF文件导入模式

4.4.1、单点、集群、哨兵通用

将[sync_reader]

放开 [rdb_reader] 配置,filepath为源实例aof文件的绝对路径

[redis_writer] 配置:

单点模式:cluster为false、sentinel为false

集群模式:cluster为true、sentinel为true

哨兵模式:cluster为false、sentinel为true,master为指定主节点名称,address为哨兵地址。

 

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容