系统架构面试题(5)分布式

系统架构面试题(5)分布式

1.说说分布式事务怎么实现?
https://zhuanlan.zhihu.com/p/183753774

2.说说负载均衡的原理?

当单服务器的性能无法满足业务需求时,就需要把多台服务器组成集群系统提高整体的处理性能。我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户请求流量均衡地分发到集群中不同的服务器上。

广义上的负载均衡器大概可以分为 3 类,包括:DNS 方式实现负载均衡、硬件负载均衡、软件负载均衡。

  • DNS 实现负载均衡:DNS 实现负载均衡是最基础简单的方式。一个域名通过 DNS 解析到多个 IP,每个 IP 对应不同的服务器实例,这样就完成了流量的调度,虽然没有使用常规的负载均衡器,但实现了简单的负载均衡功能。

  • 硬件负载均衡:硬件负载均衡是通过专门的硬件设备来实现负载均衡功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有两款:F5和A10。这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。

  • 软件负载均衡

软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有Nginx、HAproxy、LVS。其中的区别:

  1. Nginx:七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡;
  2. HAproxy:支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy;
  3. LVS:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。
  • 负载均衡算法
    1. 轮询(round robin):默认按照轮询(Round Robin)的方式进行负载均衡,每个请求按照IP顺序分配到不同的后端服务器,会维护一个服务器列表,如果后端服务器down掉,可以将down掉的服务器剔除。
    2. 加权轮询(Weighted Round Robin):针对每台后端服务器性能不一致的情况,可以对性能较好的服务器进行侧重分配用户请求,对性能不高的服务器分配少一些用户请求。
    3. IP_Hash:根据请求来源的IP地址进行Hash计算,得到后端服务器,这样来自同一个IP的请求总是会落到同一台服务器上处理,以致于可以将请求上下文信息存储在这个服务器上。
    4. url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器。适用业务场景:适用于后端服务器为缓存服务器时比较有效。
    5. fair:采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。,也就是根据后端服务器时间来分配用户请求,响应时间短的优先分配。
    6. 最少连接数least_conn:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

3.谈谈分布式Session的存储方案

  • Session sticky(粘性)

基于nginx实现。做负载均衡的时候,根据ip做hash处理。比如IP尾号为1、3、5、7、9的请求到服务A上,IP尾号为2、4、6、8、0的请求到服务B上。就可以解决session问题,固定的ip会分配到固定服务器上。

缺点:存在单点故障问题。

  1. 某个服务挂了,会造成分配到这个服务器上的客户全部异常,没有解决高可用性。
  2. 某个ip段的客户数量就是很大,超过这个服务器承受范围了,也会引起服务器故障和客户的请求超时,甚至请求异常。
  • Session Relication(拷贝、复制)

基于tomcat广播机制实现。多个tomcat之间,互相拷贝,复制彼此的session(session广播)。不管请求到哪个服务器上,都有session。

缺点:消耗内存,消耗宽带。

  1. 同步Session数据会造成额外的网络带宽的开销,只要Session数据有变化,就需要将新产生的Session数据同步到其他服务器上,服务器数量越多,同步带来的网络带宽开销也就越大。
  2. 每台Web服务器都需要保存全部的Session数据,如果整个集群的Session数量太多的话,则对于每台机器用于保存Session数据的占用会很严重。
  • Session Center

将集群中的所有Session集中存储起来,Web服务器本身则并不存储Session数据,不同的Web服务器从同样的地方来获取Session,通常基于redis等工具实现。需要对redis进行高可用性维护,增加了系统复杂度。

  1. 读写Session数据都是网络操作,相对本机的数据读取来说,存在时延和不稳定性,但是通信发生在内网,问题不大。
  2. 集中存储Session的机器或集群出现问题,会影响应用。

参考(摘抄的文字版权属于原作者)
https://zhuanlan.zhihu.com/p/183753774
https://blog.csdn.net/fishmai/article/details/52079766
https://blog.csdn.net/weixin_45139605/article/details/90796758
https://www.zhihu.com/question/20275578?sort=created
https://www.jianshu.com/p/57ad2e96d697

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注