redis集群高可用

对于redis集群,我们不可能保证数据完全不丢失,只能做到使得尽量少的数据丢失

一. 主从同步、读写分离

在从库读,主库写,Redis cluster 可以支撑 N 个Redis master node,每个master node 可以挂载多个 slave node,这样整个redis cluster 就可以横向扩容了。

1. 主从原理:

启动一台slave的时候,它会向master发送一个sync命令,如果slave是第一次连接到master,会触发一个全量复制(RDB),master会fork一个子进程,生成RDB快照,并将生成快照期间接收到的写命令缓存起来(AOF),RDB快照完成后,master会将快照文件和缓存的写命令一起发送给从redis,slave接收后,载入快照文件,并执行收到的缓存中的写命令,之后每当master收到写命令后都会发送给slave,来保证数据的一致性

RDB快照的数据生成的时候,缓存区也必须同时开始接受新请求,避免同步期间的数据丢失。

参考博客:https://www.cnblogs.com/daofaziran/p/10978628.html

2. 主从宕机怎么办?

(1). 从redis宕机

这种情况相对来说比较简单,只需将从redis重启,重启后从redis会自动加入到主从架构中,完成数据的同步。而且从redis2.8开始还实现了主从断线后恢复的情况下实现增量更新的功能。

(2). 主redis宕机

需要完成两步,第一步是在从redis中执行SLAVEOF NO ONE 命令,断开主从关系并且提升为主库继续提供服务;第二步是将主库重新启动,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就会更新回来。这个过程一般使用哨兵来监听。

二. 哨兵模式集群(sentinel):

哨兵至少需要三个实例保证自己的健壮性,哨兵+主从不能保证数据不丢失,但是可以保证集群的高可用。

通过sentinel模式启动Redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决。

每个sentinel会向其它sentinal、master、slave定时发送消息,以确认对方是否活着,如果发现对方在指定时间内未回应,则暂时认为对方宕机。

若哨兵群中的多数sentinel都报告某一master没响应,系统才认为该master真正宕机,通过Raft投票算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。

三. Redis主从架构数据会丢失么?

会,两种情况

1. 异步复制导致数据丢失:master -> slave的复制是异步的,当master还没有把数据复制到slave的时候宕机了,此时这部分数据就丢失了。

2. 脑裂导致数据丢失:由于某种原因(网络故障或者其他),master与slave节点之间断开了联系,sentinel(哨兵)监控到一段时间没有联系认为master故障,重新选举,将slave切换为新的master。但是原master可能并没有发生故障,只是网络产生分区,此时client仍然在旧的master上写数据,而新的master中没有数据,如果不及时发现问题进行处理会导致旧的master中堆积大量数据。在发现问题之后,旧的master降为slave同步新的master数据,那么之前的数据被刷新掉,造成数据丢失。

4. 如何保证尽量少的数据丢失?

修改redis配置文件:min-slaves-to-write 1

                                 min-slaves-max-lag 10

min-slaves-to-write默认情况下是0,min-slaves-max-lag默认情况下是10。
以上面配置为例,这两个参数表示至少有1个salve的与master的同步复制延迟不能超过10s,一旦所有的slave复制和同步的延迟达到了10s,那么此时master就不会接受任何请求

我们可以减小min-slaves-max-lag参数的值,这样就可以避免在发生故障时大量的数据丢失,一旦发现延迟超过了该值就不会往master中写入数据。

对于client,我们可以采取降级措施,将数据暂时写入本地缓存和磁盘中,在一段时间后重新写入master来保证数据不丢失;也可以将数据写入kafka消息队列,隔一段时间去消费kafka中的数据。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值