---
title: Redis集群重建
description: "由于Redis集群Cluster模式在创建时自动维护了集群信息，迁移完成后需要重建集群。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/portingadvisor/systemmigration/DevKit_Porting_0054.html
sourcePath: /source/zh/kunpengdevps/portingadvisor/systemmigration/DevKit_Porting_0054.html
indexId: 877ca52a4119d5d31a4e7ccf4cbb0d4d230f97ca20b25fa390c96446256548b279
---
# Redis集群重建

由于Redis集群Cluster模式在创建时自动维护了集群信息，迁移完成后需要重建集群。

#### 前提条件

若操作系统环境不可以联网，需先配置操作系统Yum/APT/Zypper源(https://www.hikunpeng.com/document/detail/zh/kunpengdevps/install/installguide/KunpengDevKit_0050.html)。


#### 操作步骤

1. 在所有目标服务器上安装Redis。

  - 方案一：源码编译安装
可参考Redis官方安装部署教程(https://redis.io/docs/latest/operate/oss_and_stack/install/build-stack/)，请根据自身需求选择具体的操作系统版本。

    a. 下载目标版本      源码包(https://download.redis.io/releases/)
。
    b. 解压Redis压缩包。
      1 tar -zxvf redis-{version}.tar.gz

    c. 进入Redis解压目录。
      1 cd redis-{version}

    d. 执行编译make操作。
      1 make

      Redis 5.0之后版本编译支持systemd，6.0版本之后编译支持TLS，编译时选择需要的编译选项。

      1 make USE_SYSTEMD=yes BUILD_TLS=yes

      (1). 若执行TLS显示缺少OpenSSL，则需要安装OpenSSL开发库：

      1 sudo yum install openssl openssl-devel

      (2). 若执行systemd显示缺少开发库，则需要安装systemd开发库：

      1 sudo yum install systemd-devel

    e. 执行make install安装操作，可选择默认安装地址，也可使用PREFIX来指定安装地址。
      1 2 make install make PREFIX={install_path} install

  - 方案二：软件包管理工具安装
    执行install指令，但采取该方法安装不支持TLS。 1 sudo yum install redis

2. 可选：安装完成之后，可配置systemd。

  a. 将Redis默认service拷贝至/usr/lib/systemd/system。可通过如下命令查找redis.service所在路径。
    1 find / -name redis.service

  b. 打开redis.service文件，修改"ExecStart="内容，格式为：
    1 ExecStart={install_path}/bin/redis-server {conf_path}

  c. 修改完成后加载redis.service。
    1 systemctl daemon-reload

  d. 启动Redis服务。
    1 systemctl start redis.service

  e. 检查服务是否启动。
    1 systemctl status redis.service

    当“Active”字段显示包含“active（running）”表示成功。

3. 启动Redis服务。

  - 方式一：使用Redis自带脚本启动
    1 ${redis-server目录} ${redis.conf目录}

  - 方式二：使用systemd启动

    a. 启动Redis服务。
      1 systemctl start redis.service

    b. 检查服务是否启动。
      1 systemctl status redis.service

      当“Active”字段显示包含“active（running）”表示成功。

确保所有参与集群的Redis实例均已启动，并且运行在集群模式下，即redis.conf文件中设置cluster-enabled yes和相应的cluster-config-file配置。


4. 根据版本选择合适的命令构建集群。

  - 对于Redis 4.1.14及之前版本
如果迁移目标是Redis 4.1.14或更早的版本，请进入redis-trib.rb脚本所在路径，执行以下命令构建集群。```
./redis-trib.rb create --replicas 1 \
<节点1_IP地址>:<端口1> <节点2_IP地址>:<端口2> <节点3_IP地址>:<端口3> \
<节点4_IP地址>:<端口4> <节点5_IP地址>:<端口5> <节点6_IP地址>:<端口6>
```


- 请替换<节点_IP地址>和<端口>为实际节点的IP地址和端口号。
- 建议在集群中的任意一个节点或一个专门的管理节点上执行该脚本。


如果构建失败，检查redis-trib.rb依赖：

    a. 执行以下命令检查Ruby是否已安装：
      1 ruby -v

      如果未安装Ruby，系统将返回“command not found”或类似的错误。

    b. 使用以下命令安装Ruby。
      1 sudo yum install ruby -y

    c. 下载所需版本的      Redis gem(https://rubygems.org/gems/redis/versions/)
，或者使用以下命令直接安装指定版本（以4.1.0版本为例）：
      1 gem install redis -v 4.1.0

    d. 安装Ruby和Redis gem成功后，请进入redis-trib.rb脚本所在路径，重新执行集群构建命令。
      1 2 3 ./redis-trib.rb create --replicas 1 \ <节点1_IP地址>:<端口1> <节点2_IP地址>:<端口2> <节点3_IP地址>:<端口3> \ <节点4_IP地址>:<端口4> <节点5_IP地址>:<端口5> <节点6_IP地址>:<端口6>

  - 对于Redis 6.2.14版本
    如果迁移目标是Redis 6.2.14，请使用redis-cli命令来构建集群。执行以下模板命令： 1 2 3 4 redis-cli --cluster create \ <节点1_IP地址>:<端口1> <节点2_IP地址>:<端口2> <节点3_IP地址>:<端口3> \ <节点4_IP地址>:<端口4> <节点5_IP地址>:<端口5> <节点6_IP地址>:<端口6> \ --cluster-replicas 1 请替换<节点_IP地址>和<端口>为实际的节点的IP地址和端口号。 建议在集群中的任意一个节点或一个专门的管理节点上执行此命令。

5. 在目标集群任意节点，通过以下查询Redis集群Master节点。
  进入Redis的src目录下，通过redis-cli连接Redis实例，默认端口号为6379。

  1 2 ./redis-cli -c -p 6379 cluster nodes

6. 安装RedisShake工具，并使用工具分别在每个节点上迁移对应的Redis数据文件。该工具各版本配置存在差异，本指导以v4.1.1为例。

  a. 下载    RedisShake工具(https://github.com/tair-opensource/RedisShake/releases?page=1)
，并将下载的安装包上传至每个目标节点，示例安装目录：/home/redisShake/。
    1 mkdir -p /home/redisShake/

  b. 解压安装包。
    1 tar xzvf redis-shake-linux-arm64.tar.gz -C /home/redisShake/

  c. 进入解压后目录，修改配置文件“shake.toml”。

    - 需注释的reader配置：[sync_reader]、[scan_reader]
    - 需使用的reader配置：[rdb_reader]、[aof_reader]、[redis_writer]
      根据源数据文件路径修改[rdb_reader]和[aof_reader]的“filepath”字段，若同时配置[rdb_reader]和[aof_reader]，则[rdb_reader]优先级较高。 将[redis_writer]的“cluster”字段设置为“true”。 将[redis_writer]的“address”字段设置为<节点_IP地址>:<端口>，配置任意Master节点的IP地址和端口号即可。

      如下为示例，其余配置保持默认或按需修改即可：

      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [rdb_reader] filepath = "/devkit_sysmig_disk/path/to/your/redis/data/dump.rdb" [aof_reader] filepath = "/devkit_sysmig_disk/path/to/your/redis/data/appendonly.aof" timestamp = 0 # subsecond [redis_writer] cluster = true # set to true if target is a redis cluster sentinel = false # set to true if target is a redis sentinel master = "" # set to master name if target is a redis sentinel address = "ip:port" # 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 off_reply = false # turn off the server reply

  d. 使用如下命令进行迁移。
    1 ./redis-shake shake.toml

    回显或日志中出现“all done”，代表同步完成。

7. 在目标集群任意节点，通过get key方式确认数据是否已迁移。key为源Redis存储的键值，请根据实际键值进行替换。
  进入Redis的src目录下，通过redis-cli连接Redis实例，默认端口号为6379。

  1 2 ./redis-cli -c -p 6379 get key

  当key存在时，会返回相应的值。
