redis因为其开源协议的问题,现在也有很多人迁移到完全开源的Valkey上了,两者基本上差异很小,可以做到不停机迁移。
本文描述整个迁移方案,包括redis实例和sentinel哨兵。
1:准备阶段
redis集群和哨兵共有6个端口,先检查有没有占用:
sudo ss -tunlp | grep -E '6000|6001|6002|26000|26001|26002'
先创建master redis配置文件和目录:
mkdir -p $HOME/node-{0..2}/{config,data,logs}
cat <<EOF > $HOME/node-0/config/redis.conf
port 6000 #6001 6002
bind 0.0.0.0
logfile /logs/redis.log
dir /data
aclfile /config/users.acl
masteruser replica-user
masterauth somepassword
EOF
接下去配置slave redis配置文件和目录,增加replicaof指令:
cat <<EOF > $HOME/node-1{2}/config/redis.conf
port 6001 #6002
bind 0.0.0.0
logfile /logs/redis.log
dir /data
aclfile /config/users.acl
masteruser replica-user
masterauth somepassword
replicaof 127.0.0.1 6000
EOF
接下去创建sentinel,除了端口不一样,其它均相同:
cat <<EOF > $HOME/node-0/config/sentinel.conf
port 26000 #26001 26002
logfile /logs/sentinel.log
dir /data
sentinel monitor mymaster 127.0.0.1 6000 2
sentinel auth-user mymaster sentinel-user
sentinel auth-pass mymaster somepassword
EOF
然后依次启动redis:
docker run -d
--restart always
--name redis-0
--net host
-v $HOME/node-0/data:/data
-v $HOME/node-0/logs:/logs
-v $HOME/node-0/config:/config
redis:7.2 redis-server /config/redis.conf
再启动sentinel:
docker run -d
--restart always
--name redis-sentinel-0
--net host
-v $HOME/node-0/data:/data
-v $HOME/node-0/logs:/logs
-v $HOME/node-0/config:/config
redis:7.2 redis-sentinel /config/sentinel.conf
检查redis和sentinel是否都启动了:
docker ps --format '{{.Image}} {{.Status}} {{.Names}}'
redis:7.2 Up 2 minutes redis-sentinel-2
redis:7.2 Up 2 minutes redis-sentinel-1
redis:7.2 Up 2 minutes redis-sentinel-0
redis:7.2 Up 2 minutes redis-2
redis:7.2 Up 2 minutes redis-1
redis:7.2 Up 2 minutes redis-0
接下去给redis插入一些数据:
for i in {1..10000};do
echo "SET key${i} '$(openssl rand -base64 48 | xargs echo)'" >> /tmp/set_keys
done
cat /tmp/set_keys | docker exec -i redis-0 redis-cli -p 6000 –-pass password –-pipe
All data transferred. Waiting for the last reply...
Last reply received from server.
errors: 0, replies: 10000
2:迁移哨兵
迁移过程包括一次迁移一个节点,首先迁移哨兵节点,在迁移完每个容器后,检查一下节点的日志和状态,以便在出现任何问题时进行回滚。
对于valkey的配置文件和redis没有什么差异,主要将redis
前缀改为valkey
。
停止一个redis sentinel和启动valkey sentinel:
docker stop redis-sentinel-2
docker run -d --restart always
--name valkey-sentinel-2
--net host
-v $HOME/node-2/data:/data
-v $HOME/node-2/logs:/logs
-v $HOME/node-2/config:/config
valkey/valkey:7.2 valkey-sentinel /config/sentinel.conf
接下去两个sentinel也是相同操作,也不会影响服务。
3:迁移redis
先看看目前那个redis是slave:
docker exec -it redis-0 redis-cli -p 6000 --user default --pass password INFO replication | grep slave
connected_slaves:2
slave0:ip=127.0.0.1,port=6001,state=online,offset=664355,lag=0
slave1:ip=127.0.0.1,port=6002,state=online,offset=664355,lag=1
那就先迁移slave:
docker stop redis-2
docker run -d --restart always
--name valkey-2
--net host
-v $HOME/node-2/data:/data
-v $HOME/node-2/logs:/logs
-v $HOME/node-2/config:/config
valkey/valkey:7.2 valkey-server /config/redis.conf
最后一步就是要迁移master redis了,先把它变为slave:
docker exec -it valkey-sentinel-0 redis-cli -p 26000 --user default --pass password
127.0.0.1:26000> SENTINEL FAILOVER mymaster
OK
127.0.0.1:26000> SENTINEL GET-MASTER-ADDR-BY-NAME mymaster
1) "127.0.0.1"
2) "6002"
接下去迁移最后一个redis即可。
文章转载自虞大胆的叽叽喳喳,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




