本文为笔者2019年秋招面试经验总结和牛客网面经总结。大部分资源来源于网络,公众号的总结。
1.CAP原则
答:分布式系统有三大特性,一致性,分区容忍性和可用性。
2.分布式一致性协议raft
答:
raft一致性协议有两大核心:选主和复制日志。
raft协议中,
选主:节点有追随者,候选者,领导者三种角色,领导者从候选者中选出,只要有一半以上的节点投票(所谓投票就是节点返回响应)便可以选出领导者,三者角色可以转换。
复制日志:用于维护数据一致性。领导者更新数据后,向追随者发送响应,只有追随者把信息写入本地,才会向领导者反馈响应,超过半数追随者反馈响应,即更新成功。此时,领导者将成功写入反馈给客户端。
在网络因故障分区后,未超过半数的分区更新的数据无效,当网络故障修复,同步超过半数分区更新的数据
参考网址:https://www.jianshu.com/p/8e4bbe7e276c
3.一致性哈希算法
答:在分布式系统中,为了保证负载均衡,可以对发送的信息进行hash映射,然而,如果节点增加或减少,将会使得系统所有的数据节点映射改变,给系统带来不稳定性。一致性哈希对2的32次方取模,节点增加或减少对系统的影响很小。若增加或减少节点,造成不命中,只需在哈希环上顺时针找到最近的一个节点即可。
由于哈希环节点可能稠密不同,为了保证负载均衡,可以对称增加虚拟节点。
4.大型网站系统架构
答:用户-负载均衡器-N台服务器-redis缓存集群-mysql集群
前端限流(例如一个用户10秒内只能点击一次,异步处理,消息队列);
负载均衡一般采用NGINX反向代理;
mysql读写分离,主库写,从库读,分库分表。
5.准点秒杀系统设计
答:
对于秒杀活动,需要承受高并发的压力,如果全部落在数据库中,将会给服务器带来巨大压力,甚至崩溃。可以采用前端限流,削峰(异步处理,消息队列)的方法。
参考https://blog.csdn.net/x5fnncxzq4/article/details/82879250
6.分布式锁ZooKeeper
答:分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。
Zookeeper原理:
参考:https://blog.csdn.net/cyywxy/article/details/81740730
7.分布式缓存
答:分布式缓存由一个服务端实现管理和控制,有多个客户端节点存储数据,可以进一步提高数据的读取速率。那么我们要读取某个数据的时候,应该选择哪个节点呢?通过一致性哈希算法计算出数据D对应的哈希值(相当于门牌号),根据这个哈希值就可以找到对应的节点了。一致哈希算法的好处在于节点个数发生变化(减少或增加)时无需重新计算哈希值,保证数据储存或读取时可以正确、快速地找到对应的节点。
分布式缓存能够高性能地读取数据、能够动态地扩展缓存节点、能够自动发现和切换故障节点、能够自动均衡数据分区,而且能够为使用者提供图形化的管理界面,部署和维护都十分方便。
8.微服务的优点和缺点
答:优点:松耦合,开发容易,职责单一,可以技术异构;缺点:可能会重复开发,各个微服务之间维护复杂,通讯耗时长。
9.消息队列
答:
10.数据库缓存一致性
答:需要保证redis和mysql的一致性
有两种做法:
先删缓存,再更新数据库;一般采用延时双删策略,即先删缓存,更新数据库,休眠1秒,再删缓存。第二次删除缓存为异步。为什么要双删呢,因为更新数据库的时候,其他线程还在读缓存,此时缓存和数据库不一致。问题在于,如果第二次删缓存失败,还会有缓存和数据库不一致的问题。可以引入保障机制,删除失败重新删除,直到成功。
先更新数据库,再删缓存;
参考:https://www.cnblogs.com/rjzheng/p/9041659.html
11.数据库主从一致性
答:本回答总结于公众号“架构师之路”。
出于性能考虑,数据库读写分离,
12.缓存雪崩,缓存穿透
答: