面试题答案
一键面试算法层面
- 分布式一致性算法:
- raft算法:常用于分布式系统选主,通过心跳检测、选举超时等机制,在集群节点中选出主节点。主节点负责处理写操作,然后将数据同步给从节点。例如在一些基于raft算法实现的分布式文件系统中,主节点接收文件写入请求,通过raft日志同步机制保证各个副本数据一致。
- paxos算法:通过多轮提案表决,让集群节点对某个值达成一致。虽然实现复杂,但能保证在大多数节点正常工作时数据一致性。比如在分布式数据库的共识模块中,使用paxos算法决定数据的更新版本等。
- 缓存更新算法:
- Write - Through策略:在更新数据库的同时更新缓存。优点是数据一致性强,但可能因缓存和数据库同时更新失败导致数据不一致。例如在电商系统商品信息更新时,同时修改MySQL商品表和Redis缓存中的商品数据。
- Write - Behind策略:先更新缓存,异步更新数据库。优点是写入性能高,但缓存和数据库可能长时间不一致。例如某些实时性要求不高的日志记录场景,先更新缓存,后台异步将数据持久化到数据库。
- Read - Through策略:读操作时,如果缓存中没有数据,从数据库读取并写入缓存。能保证缓存数据可用性,但可能因缓存未及时更新导致读到旧数据。如新闻阅读系统,用户读取新闻时,若缓存无该新闻,从MySQL读取并放入Redis。
技术手段
- 缓存失效机制:
- 设置合理的缓存过期时间:对数据一致性要求不高的场景,设置较短过期时间,让缓存定期失效重新从数据库加载。如一些活动页面信息,活动期间缓存时间可设置短些,活动结束后缓存自动过期重新获取最新数据。
- 主动失效:在数据库数据更新时,主动删除或更新相关缓存。如在论坛系统中,用户发表新帖子后,删除对应板块主题列表的缓存,下次访问时重新从数据库加载最新列表。
- 事务控制:
- 数据库事务:在MySQL中使用事务保证一组操作要么全部成功,要么全部失败。如电商订单系统,下单操作涉及更新商品库存(数据库)和记录订单(数据库),用事务确保数据一致性。
- 分布式事务:当操作涉及多个节点(如Redis和MySQL跨节点操作),可使用XA协议、TCC(Try - Confirm - Cancel)等分布式事务方案。如在分布式微服务架构下,订单服务调用库存服务(可能更新Redis缓存库存和MySQL数据库库存),用分布式事务保证操作一致性。
- 数据校验与修复:
- 定期数据比对:通过定时任务,对比Redis缓存和MySQL数据库数据,发现不一致及时修复。如每晚凌晨对用户积分缓存和数据库积分记录进行比对,若不一致按数据库为准修复缓存。
- 版本控制:为数据添加版本号,每次更新版本号递增。读取数据时,根据版本号判断数据是否为最新。如在文件管理系统,文件每次修改版本号增加,缓存和数据库中都记录版本号,读取时对比。
系统架构设计
- 读写分离架构:
- 主从复制:MySQL采用主从复制架构,主库处理写操作,从库负责读操作。Redis也可采用类似主从结构,主Redis写数据,从Redis读数据。如在大型网站用户登录系统,主MySQL记录登录日志,从MySQL和从Redis提供登录信息查询。
- 读写路由:通过中间件(如MyCat等)根据操作类型(读或写)路由到相应节点。读操作优先从缓存读取,若缓存无数据再从从库读取;写操作先写主库,成功后更新缓存。如在电商商品浏览和修改场景,读请求路由到从库或缓存,写请求路由到主库。
- 冗余与备份:
- 多副本机制:对关键数据在Redis和MySQL中都保存多份副本。如在金融系统用户账户信息,在Redis和MySQL多节点保存副本,节点故障时可从其他副本获取数据,保证数据可用性和一致性。
- 异地灾备:在不同地理位置建立数据中心,Redis和MySQL数据同步到异地灾备中心。如大型互联网公司在国内不同城市建立数据中心,当一个地区出现网络分区等故障时,可切换到其他地区数据中心,通过数据同步机制保证数据一致性。