说明

  • redis cluster 各个节点从 6.2.6 升级至 6.2.16

环境说明

  • 三台机器交叉部署三主三从的 redis cluster 节点
  • 当前 cluster nodes 信息如下
1
2
3
4
5
6
7
192.168.212.81:6378> cluster nodes
c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 192.168.212.82:6379@16379 slave 13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 0 1733365788644 1 connected
70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 192.168.212.83:6379@16379 slave 53388db16d90b538220c382f1f256d79ccf1ab16 0 1733365785000 3 connected
13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 192.168.212.81:6378@16378 myself,master - 0 1733365786000 1 connected 0-5460
53388db16d90b538220c382f1f256d79ccf1ab16 192.168.212.82:6378@16378 master - 0 1733365786633 3 connected 5461-10922
bafdc40989a63d071aba5efa755641db1c7f5eb8 192.168.212.83:6378@16378 master - 0 1733365787000 5 connected 10923-16383
bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 192.168.212.81:6379@16379 slave bafdc40989a63d071aba5efa755641db1c7f5eb8 0 1733365787639 5 connected
  • 部署信息
访问地址 部署服务器 主机名 部署路径 部署用户 角色
192.168.212.81:6378 192.168.212.81 c1 /data/redis/redis_6378 redis master
192.168.212.81:6379 192.168.212.81 c1 /data/redis/redis_6379 redis slave
192.168.212.82:6378 192.168.212.82 c2 /data/redis/redis_6378 redis master
192.168.212.82:6379 192.168.212.82 c2 /data/redis/redis_6379 redis slave
192.168.212.83:6378 192.168.212.83 c3 /data/redis/redis_6378 redis master
192.168.212.83:6379 192.168.212.83 c3 /data/redis/redis_6379 redis slave
  • redis 部署目录说明
    • bin:存储 redis 编译后二进制
    • data:存储 aof 和 rdb 日志
    • etc:存储 redis 配置文件
    • logs:存储 redis 日志
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ tree /data/redis/redis_6378/
/data/redis/redis_6378/
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof -> redis-server
│   ├── redis-check-rdb -> redis-server
│   ├── redis-cli
│   ├── redis-sentinel -> redis-server
│   └── redis-server
├── data
│   └── 6378
│       ├── appendonly.aof
│       ├── dump.rdb
│       └── nodes-6379.conf
├── etc
│   └── 6378.conf
└── log
    ├── redis_6378.log
    └── redis_6378.pid
  • 当前 redis 版本
1
2
3
4
192.168.212.81:6378> info
# Server
redis_version:6.2.6
…………

操作说明

  • 重新编译生成 6.2.16 的 redis 二进制文件
  • 替换当前正在运行的 redis 的 bin 目录
  • 重启 redis 节点

redis cluster 写入测试数据

  • 执行如下 shell 命令写入 10w 测试数据
1
2
3
for ((i = 0; i < 100000; i++)); do
	/data/redis/redis_6378/bin/redis-cli -c -h 192.168.212.81 -p 6378 -a 密码 set "$i" "$i"
done

滚动升级

  • 针对连续性要求比较高的情况,可以先升级从节点,然后主节点触发切主,然后继续升级剩余节点,参照plan1
  • 针对能接受闪断的场景,可替换 bin 目录下二进制文件后,可直接重启redis服务,参照 plan2

Plan1

  • 说明
    • 先升级三个 slave 节点
    • slave 节点升级后,将 slave 节点提升为 master
    • 更新剩余未更新节点

升级 slave 节点

  • 三个 slave 节点依次操作,具体端口及服务名,根据实际情况进行更改
  • 上传新版本 redis 安装包
    • 下载地址:https://download.redis.io/releases/
1
wget https://download.redis.io/releases/redis-6.2.16.tar.gz
  • 解压
1
tar -zxvf redis-6.2.16.tar.gz
  • 编译
1
2
cd redis-6.2.16
make
  • 备份 redis bin 目录
1
2
cd /data/redis/redis_6379
cp -rp bin/ bin_6.2.6
  • 关闭 redis_6379,替换 bin 目录下文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 关闭 redis
systemctl stop redis_6379
# 进入 redis_6379 bin 目录
cd /data/redis/redis_6379/bin
rm -rf *
# 复制 6.2.16 构建的新二进制文件至 bin 目录
cp ~/redis-6.2.16/src/redis-cli .
cp ~/redis-6.2.16/src/redis-server  .
cp ~/redis-6.2.16/src/redis-benchmark .
ln -sfn  redis-server redis-check-aof
ln -sfn  redis-server redis-check-rdb
ln -sfn  redis-server redis-sentinel
# 更改权限
chown redis:redis -R .
  • 启动 redis_6379
1
systemctl start redis_6379
  • 检查,连接 redis 的命令根据自己升级的节点进行更改
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看 cluster 状态
192.168.212.81:6379> cluster nodes
c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 192.168.212.82:6379@16379 slave 13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 0 1733367341931 1 connected
53388db16d90b538220c382f1f256d79ccf1ab16 192.168.212.82:6378@16378 master - 0 1733367343000 3 connected 5461-10922
bafdc40989a63d071aba5efa755641db1c7f5eb8 192.168.212.83:6378@16378 master - 0 1733367342939 5 connected 10923-16383
bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 192.168.212.81:6379@16379 myself,slave bafdc40989a63d071aba5efa755641db1c7f5eb8 0 1733367342000 5 connected
13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 192.168.212.81:6378@16378 master - 0 1733367341000 1 connected 0-5460
70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 192.168.212.83:6379@16379 slave 53388db16d90b538220c382f1f256d79ccf1ab16 0 1733367343944 3 connected
# 查看节点 redis 版本
192.168.212.81:6379> info
# Server
redis_version:6.2.16

master 节点切主

  • 依次对从节点执行 CLUSTER FAILOVER,进行切主
1
2
3
/data/redis/redis_6378/bin/redis-cli -c -h  192.168.212.81 -p 6379 -a 密码  CLUSTER FAILOVER
/data/redis/redis_6378/bin/redis-cli -c -h  192.168.212.82 -p 6379 -a 密码  CLUSTER FAILOVER
/data/redis/redis_6378/bin/redis-cli -c -h  192.168.212.83 -p 6379 -a 密码  CLUSTER FAILOVER
  • 查看当前集群状态,可知之前为 slave 角色的节点,现在已经变成了 master
1
2
3
4
5
6
7
8
$ /data/redis/redis_6378/bin/redis-cli -c -h  192.168.212.81 -p 6379 -a 密码  cluster nodes
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 192.168.212.82:6379@16379 master - 0 1733368800640 8 connected 0-5460
53388db16d90b538220c382f1f256d79ccf1ab16 192.168.212.82:6378@16378 slave 70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 0 1733368796606 9 connected
bafdc40989a63d071aba5efa755641db1c7f5eb8 192.168.212.83:6378@16378 slave bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 0 1733368799000 7 connected
bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 192.168.212.81:6379@16379 myself,master - 0 1733368797000 7 connected 10923-16383
13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 192.168.212.81:6378@16378 slave c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 0 1733368799630 8 connected
70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 192.168.212.83:6379@16379 master - 0 1733368797613 9 connected 5461-10922

继续升级剩余节点

  • 由于slave/master交叉部署,一天机器上同时有主/从节点,之前升级节点时已编译过 redis,无需重新编译
  • 备份 redis bin 目录
1
2
cd /data/redis/redis_6378
cp -rp bin/ bin_6.2.6
  • 关闭 redis_6379,替换 bin 目录下文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 关闭 redis
systemctl stop redis_6378
# 进入 redis_6378 bin 目录
cd /data/redis/redis_6378/bin
rm -rf *
# 复制 6.2.16 构建的新二进制文件至 bin 目录
cp ~/redis-6.2.16/src/redis-cli .
cp ~/redis-6.2.16/src/redis-server  .
cp ~/redis-6.2.16/src/redis-benchmark .
ln -sfn  redis-server redis-check-aof
ln -sfn  redis-server redis-check-rdb
ln -sfn  redis-server redis-sentinel
# 更改权限
chown redis:redis -R .
  • 启动 redis_6378
1
systemctl start redis_6378
  • 检查,连接 redis 的命令根据自己升级的节点进行更改
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看 cluster 状态
192.168.212.81:6378> cluster nodes
bafdc40989a63d071aba5efa755641db1c7f5eb8 192.168.212.83:6378@16378 myself,slave bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 0 1733369694000 7 connected
13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 192.168.212.81:6378@16378 slave c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 0 1733369696000 8 connected
53388db16d90b538220c382f1f256d79ccf1ab16 192.168.212.82:6378@16378 slave 70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 0 1733369698528 9 connected
70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 192.168.212.83:6379@16379 master - 0 1733369697000 9 connected 5461-10922
bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 192.168.212.81:6379@16379 master - 0 1733369696510 7 connected 10923-16383
c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 192.168.212.82:6379@16379 master - 0 1733369697520 8 connected 0-5460
# 查看节点 redis 版本
192.168.212.81:6378> info
# Server
redis_version:6.2.16
  • 至此,升级完成

Plan2

  • 不关闭redis,依次替换 reids 下 bin 目录二进制文件后重启 redis

依次升级

  • 三台实例均需执行,以 c1 实例为
  • 上传新版本 redis 安装包
    • 下载地址:https://download.redis.io/releases/
1
wget https://download.redis.io/releases/redis-6.2.16.tar.gz
  • 解压
1
tar -zxvf redis-6.2.16.tar.gz
  • 编译
1
2
cd redis-6.2.16
make
  • 备份 redis_6379 bin 目录
1
2
cd /data/redis/redis_6379
cp -rp bin/ bin_6.2.6
  • redis_6379 替换 bin 目录下文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 进入 redis_6379 bin 目录
cd /data/redis/redis_6379/bin
rm -rf *
# 复制 6.2.16 构建的新二进制文件至 bin 目录
cp ~/redis-6.2.16/src/redis-cli .
cp ~/redis-6.2.16/src/redis-server  .
cp ~/redis-6.2.16/src/redis-benchmark .
ln -sfn  redis-server redis-check-aof
ln -sfn  redis-server redis-check-rdb
ln -sfn  redis-server redis-sentinel
# 更改权限
chown redis:redis -R .
  • 重启 redis_6379
1
systemctl restart redis_6379
  • 备份 redis_6378 bin 目录
1
2
cd /data/redis/redis_6378
cp -rp bin/ bin_6.2.6
  • redis_6378 替换 bin 目录下文件
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 进入 redis_6378 bin 目录
cd /data/redis/redis_6378/bin
rm -rf *
# 复制 6.2.16 构建的新二进制文件至 bin 目录
cp ~/redis-6.2.16/src/redis-cli .
cp ~/redis-6.2.16/src/redis-server  .
cp ~/redis-6.2.16/src/redis-benchmark .
ln -sfn  redis-server redis-check-aof
ln -sfn  redis-server redis-check-rdb
ln -sfn  redis-server redis-sentinel
# 更改权限
chown redis:redis -R .
  • 重启 redis_6378
1
systemctl restart redis_6378
  • 检查 redis cluster 状态
    • 主节点在重启时发生闪断,但并没有触发切主
1
2
3
4
5
6
7
192.168.212.81:6378> cluster nodes
13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 192.168.212.81:6378@16378 myself,master - 0 1733449742000 1 connected 0-5460
bafdc40989a63d071aba5efa755641db1c7f5eb8 192.168.212.83:6378@16378 master - 0 1733449742905 5 connected 10923-16383
bafc03bdca1e4dfbb53f6ec097221e7b29bf976c 192.168.212.81:6379@16379 slave bafdc40989a63d071aba5efa755641db1c7f5eb8 0 1733449743914 5 connected
53388db16d90b538220c382f1f256d79ccf1ab16 192.168.212.82:6378@16378 master - 0 1733449745000 3 connected 5461-10922
70b0ee3e75d017b8c19175bd50ff8dcb3e5450ed 192.168.212.83:6379@16379 slave 53388db16d90b538220c382f1f256d79ccf1ab16 0 1733449745928 3 connected
c44c3e5dcfcb43d4607cf44e286f3b52ddb5484e 192.168.212.82:6379@16379 slave 13fc3e85e06d415db0bc4f88f7b29b67f12d95d1 0 1733449743000 1 connected
  • 查看 redis 版本
1
2
3
4
192.168.212.81:6378> info
# Server
redis_version:6.2.16
…………
  • 至此,该节点上 redis 升级完成