面试题答案
一键面试整体架构设计思路
- 数据分片策略:
- 哈希分片:使用一致性哈希算法对用户请求的标识(如用户ID)进行哈希计算,将数据均匀分布到不同的Redis节点和MySQL分片中。这样能保证数据相对均衡分布,减少数据倾斜。例如,对用户ID取模后映射到不同的Redis实例和MySQL库/表上。
- 范围分片:根据时间范围(如按天、月划分数据)或业务逻辑范围(如用户等级范围)进行分片。在Redis中,每个范围对应不同的存储区域;在MySQL中,不同范围的数据存储在不同的表或库中。例如,对于按时间范围分片,每天的数据存放在不同的MySQL表中,在Redis中也按天的时间维度进行缓存。
- Redis集群模式选择:
- Redis Cluster:采用Redis Cluster模式,它是Redis官方提供的分布式解决方案。节点之间通过Gossip协议交换状态信息,自动进行故障检测和故障转移。它支持动态扩展节点,能够水平扩展系统的存储和处理能力。每个节点负责一部分哈希槽,客户端可以直接与任何节点通信,通过哈希槽定位数据所在节点。例如,当系统需要增加存储容量时,可以直接添加Redis节点,Redis Cluster会自动重新分配哈希槽。
- 主从复制:在Redis Cluster内部,每个主节点可以有多个从节点,从节点复制主节点的数据,用于数据备份和读操作分担。当主节点出现故障时,从节点可以自动晋升为主节点,保证系统的高可用性。
- MySQL主从复制及读写分离的应用:
- 主从复制:设置MySQL主从架构,主库负责写操作,从库通过主从复制机制同步主库的数据。主库将写操作记录到二进制日志(Binlog)中,从库通过I/O线程读取主库的Binlog并写入中继日志(Relay Log),然后通过SQL线程将中继日志中的操作应用到从库。这样可以保证主从库数据的一致性。例如,在电商系统中,用户下单等写操作在主库执行,商品查询等读操作可以在从库执行。
- 读写分离:应用程序根据操作类型(读或写)来选择连接到主库或从库。读操作连接到从库,利用多个从库分担读压力,提高系统的读性能;写操作连接到主库,保证数据的一致性。可以使用中间件(如MyCAT、Sharding - JDBC等)来实现读写分离的自动化路由。例如,在一个新闻网站中,文章的发布(写操作)连接到主库,文章的浏览(读操作)连接到从库。
- 高并发下的数据一致性处理:
- 读写顺序控制:在写操作完成后,立即更新Redis缓存,保证缓存与数据库数据的一致性。对于读操作,先从Redis中读取数据,如果缓存中没有,则从MySQL中读取并更新到Redis缓存中。例如,在用户信息修改场景下,先更新MySQL中的用户信息,然后更新Redis中的用户缓存。
- 缓存过期策略:设置合理的缓存过期时间,对于经常变化的数据,设置较短的过期时间;对于不经常变化的数据,设置较长的过期时间。当缓存过期时,再次从数据库读取数据并更新缓存,从而保证数据的最终一致性。例如,对于实时性要求高的股票价格数据,缓存过期时间可以设置为几分钟;对于用户基本信息,缓存过期时间可以设置为一天。
- 分布式锁:在涉及对共享数据的写操作时,使用Redis的分布式锁来保证同一时间只有一个写操作执行。例如,在电商的库存扣减场景下,使用分布式锁防止超卖现象。
- 故障恢复问题处理:
- Redis故障恢复:Redis Cluster通过Gossip协议自动检测节点故障,当主节点故障时,从节点会自动晋升为主节点。应用程序可以通过Redis客户端的重试机制,在连接失败时自动尝试连接其他可用节点。例如,Jedis客户端可以配置重试次数和重试间隔,当连接某个Redis节点失败时,自动尝试连接其他节点。
- MySQL故障恢复:如果MySQL主库故障,需要手动或通过工具(如MHA等)将一个从库晋升为主库,并修改应用程序的配置,使其连接到新的主库。同时,要确保新主库与其他从库之间重新建立主从复制关系。例如,在MHA架构中,当主库故障时,MHA Manager会自动检测并将一个从库提升为主库,同时通知应用程序连接新的主库。