希音面试:Redis脑裂,如何预防?你能解决吗?(看这篇就够了)

尼恩说在前面

在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题:

什么 Redis的脑裂问题?

什么Redis的脑裂, 后果是什么? 如何解决?

Redis脑裂,如何预防?你能解决吗?

最近有小伙伴在面试 希音,又遇到了相关的面试题。小伙伴懵了,因为没有遇到过,所以支支吾吾的说了几句,面试官不满意,面试挂了。

所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。

当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典PDF》V171版本,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。

最新《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请关注本公众号【技术自由圈】获取,回复:领电子书

1:什么是脑裂问题?

脑裂(Split-Brain)是一个形象的比喻,好比“大脑分裂”,也就是本来一个“大脑”被拆分了两个或多个“大脑”。

在分布式系统中,因为网络分区或节点故障导致节点之间的通信断开,进而导致数据一致性问题。

在一个高可用集群中,当多个服务器在指定的时间内,由于网络的原因无法互相检测到对方,而各自形成一个新的小规模集群,并且各小集群当中,会选举新的master节点,都对外提供独立的服务。

由于网络断裂的原因,一个高可用集群中,实际上分裂为多个小的集群,这种情况就称为裂脑。

也有的人称之为分区集群,或者大脑垂直分隔,互相接管对方的资源,出现多个Master的情况,都可以称为脑裂。

裂脑之后的后果是,可能会导致服务器端的数据不一致,或造成数据的丢失

借助一个简单的 6个节点的 Zookeeper 集群为例,介绍一下脑裂。

这个要求,与ZooKeeper 的默认解决脑裂的策略有关系。

现在,为了高可用,将一个由 6 个节点的 zkServer 集群,部署在了两个机房,具体如下图:

在这里插入图片描述

正常情况下,此集群只会有一个 Leader,并且 集群的Leader节点通过投票选举的。就是集群通过选举的规则所有节点中选出来的,简称为选主。

如果意外的情况发生: 两个机房之间, 发生断网,结果如何呢?

这里有两个子网络,一个子网是3个节点,

发生断网后,一个大的集群, 其实被分割为 2个小的集群,每个小的集群各自3个节点,

2个小的集群 选举出各自的leader,对外提供服务, 发生脑裂。

在这里插入图片描述

1.1:脑裂严重后果:

发生脑裂后,系统被分割成两个或多个独立的子系统,每个子系统可能会独立选举出自己的领导节点(Leader)。

由于不同的子系统可能会对相同的数据进行修改, 这种情况可能导致数据不一致和操作冲突。

所以: 脑裂的严重后果是:数据一致性的丧失,这对于依赖精确数据进行操作的系统来说是致命的。

例如,在银行系统中,如果账户余额记录因为脑裂而不一致,可能导致用户资金被错误处理。

为了避免脑裂问题,Zookeeper采用了过半机制(Quorums),即只有集群中超过半数节点投票才能选举出Leader。

Redis 脑裂,在原理上和 Zookeeper 脑裂,ES 脑裂 ,本质上都是类似的:

具体请参见尼恩的文章:

聊聊:什么脑裂? 照此文作答,面试官献上膝盖,秒发offer

Redis 脑裂,和Redis 集群的模式有关。

所以,在介绍脑裂之前,尼恩先给大家梳理一下Redis的四大集群模式,以及它们各自的应用场景,然后基于不同的模式,介绍脑裂问题。

2:Redis的四大集群模式

Redis的部署模式主要包括以下几种:

一、单机

二、主从复制

三、哨兵

四、集群

2.1: 单机部署

单机部署只有一台Redis实例,如果这台服务器宕机,服务也将随之中止,而且,由于数据没有进行备份,安全性也将大打折扣。

在这里插入图片描述

单机部署 应用场景

单机部署的复杂性较低,对于学习或者测试的目的,这种部署模式还是比较合适的,

而且,单机部署也是其它复杂部署模式的起点。

2.2:主从复制

主从复制将一个Redis服务器上的数据复制到其他服务器上,前者称为Master也就是master,后者为Slave也就是从节点,Master主要负责数据的写操作,Slave主要进行数据的读操作。

通过主从复制可以实现数据备份、读写分离、故障恢复等功能。

在这里插入图片描述

主从复制可以有多个从节点,在数据同步的过程中,它会存在一定的延迟,同时,异步的数据复制也不保证强一致性。如果master宕机,需要手动把从节点切换为master。

主从复制 应用场景

  • 数据备份和容灾恢复:通过从节点备份master的数据,实现数据冗余。
  • 读写分离:将读操作分发到从节点,减轻master压力,提高系统性能。
  • 在线升级和扩展:在不影响master的情况下,通过增加从节点来扩展系统的读取能力。

总结:主从复制模式适合数据备份、读写分离和在线升级等场景,但在master故障时需要手动切换,不能自动实现故障转移。如果对高可用性要求较高,可以考虑使用哨兵模式或Cluster模式。

2.3:哨兵模式

哨兵模式是在主从复制基础上加入了哨兵节点,实现了自动故障转移。哨兵节点是一种特殊的Redis节点,它会监控master和从节点的运行状态。

当master发生故障时,哨兵节点会自动从从节点中选举出一个新的master,并通知其他从节点和客户端,实现故障转移。

主从复制有一个较为明显的缺点,就是master宕机后,系统不会自动切换,还需要人工介入,针对这样的情况,哨兵模式就应运而生了,它非常重要的一个优点就是能够实现自动故障转移。

在这里插入图片描述

当然,哨兵模式也并非完美的解决方案,除了实际存储数据的服务器,它还需要额外的哨兵服务,这样就增加了运维成本,同时,所有的数据都存放在一台机器(没有进行分片),使得存储的容量也有了限制。

哨兵模式场景应用
哨兵模式适用于以下场景:

  • 高可用性要求较高的场景:通过自动故障转移,确保服务的持续可用。
  • 数据备份和容灾恢复:在主从复制的基础上,提供自动故障转移功能。

哨兵模式在主从复制模式的基础上实现了自动故障转移,提高了系统的高可用性。

然而,它仍然无法实现数据分片。如果需要实现数据分片和负载均衡,可以考虑使用Cluster模式。

2.4: 集群模式

Redis集群使用哈希槽的方式将数据进行分片,分开存放在不同的机器上,这样就大大

### Shein SQL 笔试相关题目与准备经验 #### 一、SQL笔试常见考察点 SQL笔试通常会围绕以下几个核心知识点展开,结合Shein的实际业务场景,可能会涉及更复杂的查询和数据分析能力。 1. **基础查询与过滤** - 使用`SELECT`语句进行数据检索,并结合`WHERE`子句实现条件过滤。例如,筛选特定时间范围内的订单记录[^3]。 - 示例代码: ```sql SELECT user_id, pay_time, sku FROM dw_order_detail_df WHERE pay_time >= '2025-10-15 00:00:00' AND cate_nm IN ('C++', 'Java', 'Python'); ``` 2. **连接操作** - 使用`JOIN`语句将多个表的数据进行关联。例如,将订单信息表与用户信息表通过`LEFT JOIN`连接起来[^3]。 - 示例代码: ```sql SELECT o.user_id, c.source FROM dw_order_detail_df AS o LEFT JOIN client_info AS c ON o.user_id = c.user_id; ``` 3. **聚合函数与分组** - 使用`COUNT`、`SUM`等聚合函数对数据进行统计分析,并结合`GROUP BY`实现分组计算。例如,统计每个月不同品类的用户数量[^4]。 - 示例代码: ```sql SELECT DATE_FORMAT(pay_time, '%Y-%m') AS month, cate_nm, COUNT(DISTINCT user_id) AS user_count FROM dw_order_detail_df GROUP BY month, cate_nm; ``` 4. **窗口函数** - 使用窗口函数(如`ROW_NUMBER()`、`RANK()`、`COUNT() OVER()`)实现更复杂的排序或统计需求。例如,计算每个用户的订单数量并按来源排序[^3]。 - 示例代码: ```sql SELECT user_id, source, COUNT(*) OVER (PARTITION BY user_id) AS order_count FROM dw_order_detail_df; ``` 5. **索引优化** - 确保查询性能时,合理设计索引。主键字段、外键字段以及`WHERE`子句中频繁使用的字段通常是索引的最佳候选[^2]。 --- #### 二、Shein SQL笔试经验分享 根据过往的经验总结,以下是一些针对Shein SQL笔试的有效准备策略: 1. **熟悉实际业务场景** - Shein作为一家电商平台,其SQL笔试题可能与订单管理、用户行为分析、商品分类统计等相关。因此,需要了解电商行业的常见数据模型和分析需求。 2. **练习复杂查询** - 多练习涉及多表连接、窗口函数、子查询等复杂查询的题目。例如,计算某个时间段内用户的复购率或新老用户分布。 3. **注重性能优化** - 在编写SQL时,考虑查询效率问题。例如,合理使用索引减少扫描范围,避免不必要的全表扫描[^2]。 4. **模拟真实环境** - 使用工具(如MySQL、PostgreSQL)搭建本地数据库,导入样例数据进行实战演练。这样可以更好地理解SQL语句在实际场景中的运行效果。 --- #### 三、推荐学习资源 以下是几类有助于Shein SQL笔试准备的学习资源: 1. **在线题库** - 牛客网、LeetCode、HackerRank等平台提供了大量SQL相关的练习题,涵盖从基础到高级的各种难度级别[^3]。 2. **官方文档** - 阅读数据库系统的官方文档(如MySQL、PostgreSQL),深入理解SQL语法及性能调优技巧。 3. **案例分析** - 学习其他公司(如阿里巴巴、字节跳动)的SQL笔试真题解析,积累解题思路和方法。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值