Redis集群版本升级

Redis集群版本由3.0.7升级到3.2.10。


1、版本升级问题及对应解决方案

1.1、代码是否支持redis 3.2.10,是否需要升级对应jar包?

             a) 先在测试环境部署对应新版集群3.2.10,使用代码进行连接,测试是否存在问题(具体过程参见2);

1.2、怎么保证redis平滑升级,对外服务透明?

           a) 利用redis集群的特性,每个卡槽包含master和对应实时同步的slave,slave节点异常,对外服务无影响,当master节点异常时,slave就会取代master,对外提供服务;

           b) 此次升级版本跨度不大,redis支持集群中包含3.0.7版本的redis节点和3.2.10版本的redis节点,因此可以每次在集群中卸除一个节点,然后在使用3.2.10版本的redis节点补充;

1.3、怎么保证数据不丢失?

            a) redis集群中,master节点和slave节点实时同步,当slave节点异常时,master节点有数据变动,然后slave重新启动后,数据依然会同步到slave节点;

            b) 当master节点异常时,slave会提升为master节点,对外提供服务,当异常master节点重新启动后,会成为现在的master节点(原本slave节点)的slave节点;

            c) 升级时间为晚上,用户操作量少,减少redis主从切换间隙受影响的服务,升级完成后,进行缓存数据检查,或者直接再刷入一遍缓存数据,确保数据正常;

2、使代码支持Redis 3.2.10

       先在测试环境安装对应新版集群3.2.10,然后修改代码对应redis配置,运行代码,测试jedis.jar是否支持新版本,如果不支持,则更新jar版本,并检测相关联的spring-data-redis和spring-session是否也需要进行更新操作,先确保程序可以使用对应3.2.10版本的redis集群。

2.1、 测试过程异常:JedisDataException

         具体异常信息: Caused by: redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was    specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface.

        保护模式是新版增加的功能,对我们没有意义,因为我们的redis都是内网同网段访问,而redis集群模式,不支持密码访问。

        解决方式:配置文件增加对应配置protected-mode no(3.0.7版本不支持),或者配置 bind <IP>...

2.2、结论

       运行并测试后发现,系统当前jar版本支持新版的redis集群,因此无需更新jar。

 

3、redis集群升级到3.2.10

      因为redis里面存储了大量数据,而且种类较多,有的是运行时数据,有的是数据库缓存,因此不能重新部署,切换并刷一遍数据。

    根据redis集群的特性,对应的key通过hash方式,分别存储在多个卡槽中,每个卡槽都包含master节点和对应的slave节点,在slave节点会实时同步master节点数据,当master节点异常时,slave节点就会取代master节点,对外提供服务。

    因为版本跨度并不是特别大,我们可以只修改redis-server,因此我们可以先在集群中去除一个子节点,然后使用 3.2.10版本的redis-server 来启动对应的节点,等到其同步完成后,再在集群中去除对应的master节点,然后也同样使用 3.2.10版本的redis-server 来启动对应的节点,这样一来,一个卡槽的一主一从都更新完成。其他卡槽同此操作方式,最终,整个集群都更新为3.2.10版本。

3.1、更新slave节点

3.1.1、查看集群的节点信息

使用命令 redis-cli -c -p 7004 -h 192.168.251.5连接到redis集群,然后 cluster nodes查看集群状态,

可以看到集群节信息如下:有6个节点,3个master和3个slave,选择一个要更新的salve节点:192.168.251.5:7005

主节点

对应子节点

192.168.251.5:7001

192.168.251.51:7004

192.168.251.5:7002

192.168.251.51:7005

192.168.251.5:7003

192.168.251.51:7000

3.1.2、查看对应节点下的信息是否符合要求

如果对应文件没在指定位置,则使用命令将对应文件更改到对应位置,如果对应配置没有指定绝对路径,则会存储在 dir配置的对应路径下。

文件名

备注

修改对应路径命令

dump.rdb

对应节点持久化信息

config set dir <path>

save

nodes-7005.conf

对应节点的集群信息

config set cluster-config-file <path>

cluster saveconfig

redis.conf

对应节点的配置文件

redis.log

对应节点的日志

config set logfile <path>


示例如下:

在redis-cli中通过命令config get cluster-config-file 查看对应集群配置文件路径,如果没有,再根据config get dir 查看默认配置文件路径。

在目录下找到对应配置文件后,根据redis.conf查看对应文件名为nodes-16379.conf,复制一份,根据redis3.2.10版本对应的redis.conf的配置进行保存并重明名。 

3.1.3、通过命令redis-cli -c -h 192.168.251.5 -p 7005 shutdown进行关闭旧版slave节点



3.1.4、启动对应redis3.2.10版本的redis-server,并指定更新过的配置文件,配置文件内容如下
bind 192.168.251.5 127.0.0.1
protected-mode yes
port 7005
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_7005.pid
loglevel notice
logfile "/opt/redis/cluster-test/7005/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression no
rdbchecksum no
dbfilename dump.rdb
dir /opt/redis/cluster-test/7005/
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 0
 repl-ping-slave-period 3
repl-timeout 30
repl-disable-tcp-nodelay no
slave-priority 100
maxclients 10000
 maxmemory 536870912
maxmemory-policy noeviction
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
 cluster-enabled yes
 cluster-config-file nodes-7005.conf
cluster-node-timeout 5000
cluster-slave-validity-factor 10
 cluster-migration-barrier 2
cluster-require-full-coverage no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
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
3.1.5、查看对应master和slave节点日志,待其同步完成,检测slave节点数据是否正常;

Master日志

slave日志

可以看到集群状态正常。

3.2、升级master节点

3.2.1、确保对应slave节点已更新
3.2.2、同slave一样,查看对应配置文件路径是否正确


3.2.3、通过命令redis-cli -c -h 192.168.251.5 -p 7002 shutdown进行关闭master节点;

Slave日志

3.2.4、备份对应dump文件

3.2.5、待其slave节点成为master节点时,查看数据是否正常

可以看到,数据正常。

如果数据不正常,需要快速杀掉master节点(原slave节点),然后替换原本master节点的dump文件到现在的master的dump文件,再重启现在的master。

3.2.6、然后再启动对应redis3.2.10版本的redis-server,并指定对应配置文件,配置内容基本同slave节点配置,对应端口和文件路径有改动


3.2.7、成功启动后,会作为现在的master的子节点,查看对应master和slave节点日志,待其同步完成,检测数据是否正常。

Salve(7002)日志

Master(7005)日志

Slave节点数据,可以看到,数据量为5761,和原本数据量一致,更新对应master和slave节点成功。

 

 





  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风化作秋雨

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值