腾讯音乐:说说Redis脑裂问题?

腾讯,音乐,redis,问题 · 浏览次数 : 39

小编点评

**Redis 脑裂问题的解决方法:** 1. **设置 `min-slaves-to-write` 和 `min-slaves-max-lag` 配置项。** - `min-slaves-to-write` 指定从节点数量,必须大于等于主节点才能进行写入。 - `min-slaves-max-lag` 指定主节点与从节点通信的 ACK 消息延迟不能超过该值。 2. **假故障期间,确保 `min-slaves-to-write` 和 `min-slaves-max-lag` 条件同时满足。** - 这确保主节点被禁止写入,并因此无法执行脑裂操作。 **为什么 `min-slaves-to-write` 和 `min-slaves-max-lag` 是解决脑裂问题的关键?** - `min-slaves-to-write` 确保从节点仅向主节点发送数据量足够来进行一次完整的数据写入。 - `min-slaves-max-lag` 确保主节点在写入数据之前等待从节点发送确认信息。 - 当 `min-slaves-to-write` 和 `min-slaves-max-lag` 条件同时满足时,主节点不会被允许写入,避免脑裂问题。 **与 Zookeeper 的脑裂问题区别:** - Zookeeper 通常在数据写入过程中会向所有从节点发送数据,而不是只向主节点发送。 - Zookeeper 的脑裂问题通常是由于网络延迟导致的,而 Redis 的脑裂问题是由于主节点网络连接中断导致的。 **其他建议:** - 适当设置 `max-clients` 和 `write-timeout` 等配置项,以限制连接数和写入超时时间。 - 使用 `sentinel-configuration` 和 `cluster-config` 等配置项设置哨兵节点和从节点数量。 - 在生产环境中,定期监控 Redis 的性能,并根据需要调整配置项。

正文

Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会在从节点中选举出一个新的主节点,此时 Redis 的集群中就出现了两个主节点的问题,就是 Redis 脑裂问题。

脑裂问题影响

Redis 脑裂问题会导致数据丢失,为什么呢?来看脑裂问题产生的过程:
Redis脑裂问题.drawio.png
而最后一步,当旧的 Master 变为 Slave 之后,它的执行流程如下:

  1. Slave(旧 Master)会向 Master(新)申请全量数据。
  2. Master 会通过 bgsave 的方式生成当前 RDB 快照,并将 RDB 发送给 Slave。
  3. Slave 拿到 RDB 之后,先进行 flush 清空当前数据(此时第四步旧客户端给他的发送的数据就丢失了)。
  4. 之后再加载 RDB 数据,初始化自己当前的数据。

从以上过程中可以看出,在执行到第三步的时候,原客户端在旧 Master 写入的数据就丢失了,这就是数据丢失的问题。

如何解决脑裂问题?

脑裂问题只需要在旧 Master 恢复网络之后,切换身份为 Slave 期间,不接收客户端的数据写入即可,那怎么解决这个问题呢?

Redis 为我们提供了以下两个配置,通过以下两个配置可以尽可能的避免数据丢失的问题:

  • min-slaves-to-write:与主节点通信的从节点数量必须大于等于该值主节点,否则主节点拒绝写入。
  • min-slaves-max-lag:主节点与从节点通信的 ACK 消息延迟必须小于该值,否则主节点拒绝写入。

这两个配置项必须同时满足,不然主节点拒绝写入。

在假故障期间满足 min-slaves-to-write 和 min-slaves-max-lag 的要求,那么主节点就会被禁止写入,脑裂造成的数据丢失情况自然也就解决了。

课后思考

设置了参数之后,Redis 脑裂问题能完全被解决吗?为什么?Zookeeper 有脑裂问题吗?它是如何解决脑裂问题的?

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

与腾讯音乐:说说Redis脑裂问题?相似的内容:

腾讯音乐:说说Redis脑裂问题?

Redis 脑裂问题是指,在 Redis 哨兵模式或集群模式中,由于网络原因,导致主节点(Master)与哨兵(Sentinel)和从节点(Slave)的通讯中断,此时哨兵就会误以为主节点已宕机,就会在从节点中选举出一个新的主节点,此时 Redis 的集群中就出现了两个主节点的问题,就是 Redis

腾讯、阿里、B站最新面经汇总,有的妥妥的凉经。

除了BAT(没错我说的B是B站的B),还有网易、希音科技、美柚等中小厂的最新面经。 这次投稿的同学行文幽默风趣,处处透漏着不成功便搞笑的骚气。 祝他早日上岸,也欢迎大家在评论区讨论这些面试题,有哪些面试题不知道怎么回答好,可以在评论区讨论留言,我会及时回复的。

FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流

​RTMP Streamer是一个安卓手机端的开源RTMP直播推流框架,可用于RTMP直播和RTSP直播,其升级版还支持SRT直播(腾讯视频云就采用SRT协议)。RTMP Streamer支持的视频编码包括H264、H265、AV1等等,支持的音频编码包括AAC、G711、OPUS等等,可谓功能强大

腾讯云 BI 数据分析与可视化的快速入门指南

通过本文的介绍,我们了解了腾讯云 BI 这款商业智能解决方案的基本功能和应用场景。从创建项目、连接数据源、数据表建模到页面搭建和推送功能的设置,我们通过一个互联网运营看板的案例,展示了如何快速入门并利用腾讯云 BI 进行数据分析和可视化。通过简单的数据编辑,我们可以轻松地设计报表,并实现数据的可视化...

腾讯面试:如何提升Kafka吞吐量?

Kafka 是一个分布式流处理平台和消息系统,用于构建实时数据管道和流应用。它最初由 LinkedIn 开发,后来成为 Apache 软件基金会的顶级项目。 Kafka 特点是高吞吐量、分布式架构、支持持久化、集群水平扩展和消费组消息消费,具体来说: 高吞吐量:Kafka 具有高性能和低延迟的特性,

腾讯面试:什么锁比读写锁性能更高?

在并发编程中,读写锁 ReentrantReadWriteLock 的性能已经算是比较高的了,因为它将悲观锁的粒度分的更细,在它里面有读锁和写锁,当所有操作为读操作时,并发线程是可以共享读锁同时运行的,这样就无需排队执行了,所以执行效率也就更高。 那么问题来了,有没有比读写锁 ReentrantRe

腾讯互娱面经,希望别凉

默认参数是指在函数调用时,如果没有提供某个参数的值,那么使用函数定义中指定的默认值。这种语言特性可以减少代码量,简化函数的使用。在Go语言中,函数不支持默认参数。这意味着如果我们想要设置默认值,那么就需要手动在函数内部进行处理。b = 0上面的代码中,如果b参数没有提供值,那么默认为0。通过这种方式...

腾讯开源的 Femas ,开源协议有毒

腾讯开源的号称云原生标准的一站式微服务管理框架 Femas,具体参看 腾讯云开源业界首个云原生标准的一站式微服务管理框架 Femas ,从Femas 的开源协议来看,商业应用是需要获得商业许可的。 https://github.com/polarismesh/femas/blob/develop/L

[转帖]腾讯服务注册中心演进及性能优化实践

https://my.oschina.net/u/4587289/blog/5577840 导语 注册中心作为微服务架构的核心,承担服务调用过程中的服务注册与寻址的职责。注册中心的演进是随着业务架构和需求的发展而进行演进的。腾讯当前内部服务数超百万级,日调用量超过万亿次,使用着统一的注册中心 ——

[转帖]腾讯北极星 Polaris 试用

https://www.cnblogs.com/QIAOXINGXING001/p/15482012.html 了解、试用 昨天稀土开发者大会2021提到了腾讯开源的北极星, 试用一下; 官网: 北极星 源码: Polarismesh2021年7月21日开源, 目前(2021-10)700多star