背景
现有的Redis
集群是由Redis
4.x部署的,现在根据需要,要将Redis
4.x升级到Redis
5.0.10版本,且现有的Redis
集群不能停机。下面以本地的机器为例进行操作演示。
操作步骤
下载&安装Redis 5.0.10
目前的Redis集群部署在 /usr/local/redis
目录下, /usr/local
下执行命令下载Redis
5.0.10
cd /usr/local
wget http://download.redis.io/releases/redis-5.0.10.tar.gz
然后进行解压安装
tar -zxvf redis-5.0.10.tar.gz
cd redis-5.0.10
make & make install
从节点替换
先进入Redis
4集群的安装目录,执行命令查看目前的集群节点以及主从结构
# 进入目录
cd /usr/local/redis/bin/
# 其中 xxx 是Redis集群的密码
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' cluster nodes
注意,xxx是集群密码,密码必须加上英文输入法下的单括号,不然会报错
我们以 7001(主)和7002(从)这一对为例进行演示
Redis5版本的7002节点替换
然后回到 /usr/local
目录,执行命令,创建redis5-cluster
、bin
、data
、log
和cfg
等文件夹。
mkdir -p /usr/local/redis5-cluster
mkdir -p /usr/local/redis5-cluster/bin
mkdir -p /usr/local/redis5-cluster/data
mkdir -p /usr/local/redis5-cluster/log
mkdir -p /usr/local/redis5-cluster/cfg
如下所示:
执行命令,将redis-5.0.10/src
目录下的所有命令全部复制到 redis5-cluster/bin
目录下
cp -r /usr/local/redis-5.0.10/src/* /usr/local/redis5-cluster/bin/
进入到redis5-cluster/cfg
目录下,执行 vim redis-7002.conf
命令,然后将下面的内容复制进去
# Redis configuration file
# 后台运行 设置 yes
daemonize yes
pidfile /usr/local/redis5-cluster/data/redis-7002.pid
protected-mode no
# 端口
port 7002
tcp-backlog 511
# 绑定当前机器 ip
bind 172.30.32.114
unixsocket /usr/local/redis5-cluster/data/redis-7002.sock
unixsocketperm 700
# 超时时间
timeout 300
tcp-keepalive 60
supervised no
loglevel warning
# 日志文件
logfile /usr/local/redis5-cluster/log/redis-7002.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump-7002.rdb
dir /usr/local/redis5-cluster/data
# 设置集群密码
masterauth xxx
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
# 设置密码
requirepass xxx
maxclients 10000
maxmemory 10737418240
maxmemory-policy allkeys-lru
maxmemory-samples 5
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly-7002.aof"
appendfsync no
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
cluster-enabled yes
cluster-config-file /usr/local/redis5-cluster/data/nodes-7002.conf
cluster-node-timeout 15000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
lfu-log-factor 10
lfu-decay-time 1
activedefrag no
然后进入到旧的Redis
集群的安装目录中,将原先的Redis
4版本的的7002节点关闭,再启动Redis
5版本的7002节点,之后再将7002节点加入到集群中,并将其设置为7001的从节点。
命令如下:
# 进入Redis4版本的集群的命令目录
cd /usr/local/redis/bin/
# 停止 Redis4版本的7002节点
./redis-cli -h 172.30.32.114 -p 7002 -a 'xxx' shutdown
# 进入到`redis5-cluster`的`bin`
cd /usr/local/redis5-cluster/bin/
# 启动 redis5版本的7002节点
./redis-server ../cfg/redis-7002.conf &
# 进入Redis4版本的集群的命令目录
cd /usr/local/redis/bin/
# 将redis5版本的7002节点加入到集群中
./redis-cli -h 172.30.32.114 -p 7002 -a 'xxx' cluster meet 172.30.32.114 7001
查看7001主节点的node_id
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' cluster nodes
此时将 7002 节点设置为 7001 节点的从节点:
./redis-cli -h 172.30.32.114 -p 7002 -a 'xxx' cluster replicate 0caba7e5cd031abd24eb6ac8897fd3841a5c98c3
执行命令,查看7002是否已变成7001的从节点
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' cluster nodes
剩余从节点的替换
其他从节点的替换参照上面即可,以7003(主)7004(从)替换为例,用的命令如下:
# 创建配置文件:
cd /usr/local/redis5-cluster/cfg
# redis-7004.conf参考redis-7002.conf即可,将所有的7002替换为7004即可
touch redis-7004.conf
vim redis-7004.conf
# 关闭旧的7003节点:
cd /usr/local/redis/bin/
./redis-cli -h 172.30.32.114 -p 7004 -a 'xxx' shutdown
# 启动新版本的7004节点:
cd /usr/local/redis5-cluster/bin
./redis-server ../cfg/redis-7004.conf &
# 将7004节点加入到集群中:
cd /usr/local/redis/bin/
./redis-cli -h 172.30.32.114 -p 7004 -a 'xxx' cluster meet 172.30.32.114 7003
# 查看 7003主节点的node_id:
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' cluster nodes
# 将 7004 节点设置为 7003 节点的从节点:
./redis-cli -h 172.30.32.114 -p 7004 -a 'xxx' cluster replicate 7003_node_id
# 查看是否7004是否成为7003的从节点:
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' cluster nodes
这样就完成了一个从节点的替换。
主节点替换
7001主节点替换
先查看7001主节点信息
cd /usr/local/redis/bin/
./redis-cli -c -h 172.30.32.114 -p 7001 -a 'xxx' cluster nodes | grep master
比如现在想升级7001主节点,则需要先将其master
地位转移到他的从节点7002上,执行命令:
# 7002 是7001的从节点
./redis-cli -c -h 172.30.32.114 -p 7002 -a 'xxx' cluster failover
注意,这里的7002是7001主节点对应的其中一个从节点的端口,这里不能是7001端口,不然会报错,ERR You should send CLUSTER FAILOVER to a replica。
再次查看主节点,发现7002已经变成了主节点,7001变成了7002的从节点。
此时7001就是7002的从节点,此时将7001节点升级到Redis
5.0.10即可,其步骤可以参考从节点升级即可。命令如下:
# 创建配置文件:
cd /usr/local/redis5-cluster/cfg
# redis-7001.conf参考redis-7002.conf即可,将所有的7002替换为7001即可
touch redis-7001.conf
vim redis-7001.conf
# 关闭旧的7001节点:
cd /usr/local/redis/bin/
# 停止7001节点
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' shutdown
# 启动新版本的7001节点:
cd /usr/local/redis5-cluster/bin
./redis-server ../cfg/redis-7001.conf &
# 将7001节点加入到集群中:
cd /usr/local/redis/bin/
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' cluster meet 172.30.32.114 7002
# 查看 7001主节点的node_id:
./redis-cli -h 172.30.32.114 -p 7002 -a 'xxx' cluster nodes | grep 7002
# 将 7001 节点设置为 7002 节点的从节点:
./redis-cli -h 172.30.32.114 -p 700` -a 'xxx' cluster replicate 7002_node_id
# 查看是否7001是否成为7002的从节点:
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' cluster nodes
这样就完成了一个从节点的替换。
执行命令,验证主从是否进行了同步:
./redis-cli -h 172.30.32.114 -p 7001 -a 'xxx' info replication
确认master_link_status
显示为up
,并且 master_last_io_seconds_ago
显示为较小的值。
执行命令,验证主从一致性:
# 主节点设置值:
./redis-cli -c -h 172.30.32.114 -p 7002 -a 'xxx' set test_m_s_7001_7002 test
从节点获取值:
# 连接客户端
./redis-cli -c -h 172.30.32.114 -p 7001 -a 'xxx' get test_m_s_7001_7002
其他主节点的替换
剩余主节点参考上诉操作即可,以7003主节点替换为例,使用到的命令如下:
# 进入到旧的集群的安装目录:
cd /usr/local/redis/bin
# 查看7003主节点信息,找到他的从节点的端口,假设7004是7003的一个从节点
./redis-cli -c -h 172.30.32.114 -p 7003 -a 'xxx' cluster nodes
# 7003主节点故障转移,这里假设7004是7003的一个从节点
./redis-cli -c -h 172.30.32.114 -p 7004 -a 'xxx' cluster failover
# 关闭旧的7003主节点:
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' shutdown
# 启动新的7003节点
# 进入到新版本Redis的命令目录
cd /usr/local/redis5-cluster/bin
# 启动7003节点
./redis-server ../cfg/redis-7003.conf &
# 将7003节点加入到集群中
# 进入到旧的集群的安装目录:
cd /usr/local/redis/bin
# 将Redis5版本的7003节点加入到集群中
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' cluster meet 172.30.32.114 7004
# 查看7004主节点的node_id:
./redis-cli -h 172.30.32.114 -p 7004 -a 'xxx' cluster nodes | grep 7004
# 将7003节点设置为7004节点的从节点:
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' cluster replicate 7004_node_id
# 验证主从是否进行了同步:
#确认 master_link_status 显示为 up,并且master_last_io_seconds_ago 显示为较小的值
./redis-cli -h 172.30.32.114 -p 7003 -a 'xxx' info replication
# 执行命令,验证主从一致性:
# 主节点设置值:
./redis-cli -c -h 172.30.32.114 -p 7004 -a 'xxx' set test_m_s_7003_7004 test
# 从节点获取值:
./redis-cli -c -h 172.30.32.114 -p 7003 -a 'xxx' get test_m_s_7003_7004
标签:redis,停机,32.114,cluster,集群,7001,Redis,7002,节点
From: https://www.cnblogs.com/reecelin/p/18398543