暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

不当机将redis迁移到valkey

330

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论