Redis集群重建

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

操作步骤

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

    • 方案一:源码编译安装

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

      1. 下载目标版本源码包(https://download.redis.io/releases/ )。
      2. 解压Redis压缩包。
        1
        tar -zxvf redis-{version}.tar.gz
        
      3. 进入Redis解压目录。
        1
        cd redis-{version}
        
      4. 执行编译make操作。
        1
        make
        

        Redis5.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
        
      5. 执行make install安装操作,可选择默认安装地址,也可使用PREFIX来指定安装地址。
        1
        2
        make install
        make PREFIX={install_path} install
        
    • 方案二:软件包管理工具安装
      执行install指令,但采取该方法安装不支持TLS。
      1
      sudo yum install redis
      

  2. 可选:安装完成之后,可配置systemd。

    1. 将Redis默认service拷贝至/usr/lib/systemd/system。可通过如下命令查找redis.service所在路径。
      1
      find / -name redis.service
      
    2. 打开redis.service文件,修改"ExecStart="内容,格式为:
      1
      ExecStart={install_path}/bin/redis-server {conf_path}
      
    3. 修改完成后加载redis.service。
      1
      systemctl daemon-reload
      
    4. 启动Redis服务。
      1
      systemctl start redis.service
      
    5. 检查服务是否启动。
      1
      systemctl status redis.service
      

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

  3. 启动Redis服务。

    • 方式一:使用Redis自带脚本启动
      1
      ${redis-server目录} ${redis.conf目录}
      
    • 方式二:使用systemd启动
      1. 启动Redis服务。
        1
        systemctl start redis.service
        
      2. 检查服务是否启动。
        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脚本所在路径,执行以下命令构建集群。
      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>
      
      • 请替换<节点_IP地址>和<端口>为实际节点的IP地址和端口号。
      • 建议在集群中的任意一个节点或一个专门的管理节点上执行该脚本。

      如果构建失败,检查redis-trib.rb依赖:

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

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

      2. 使用以下命令安装Ruby。
        1
        sudo yum install ruby -y
        
      3. https://rubygems.org/gems/redis/versions/下载所需版本的Redis gem,或者使用以下命令直接安装指定版本(以4.1.0版本为例):
        1
        gem install redis -v 4.1.0
        
      4. 安装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为例。

    1. 下载RedisShake工具,并将下载的安装包上传至每个目标节点,示例安装目录:/home/redisShake/。

      下载地址:https://github.com/tair-opensource/RedisShake/releases?page=1

      1
      mkdir -p /home/redisShake/
      
    2. 解压安装包。
      1
      tar xzvf redis-shake-linux-arm64.tar.gz -C /home/redisShake/
      
    3. 进入解压后目录,修改配置文件“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
        
    4. 使用如下命令进行迁移。
      1
      ./redis-shake shake.toml
      

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

  7. 在目标集群任意节点,通过get key方式确认数据是否已迁移。

    进入Redis的src目录下,通过redis-cli连接Redis实例,默认端口号为6379。

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

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