Skip to the content.

首页

分布式系统


分布式系统需要考虑的问题

  1. 安全:杜绝系统及业务上的漏洞是任何系统的基础;
  2. 监控、告警:随时监控系统状态,异常时能及时告警;
  3. 单点故障、系统弹性:尽可能的避免因为单点故障导致系统雪崩,保证系统的弹性;
  4. 优雅退出、灾难补偿:系统下线时能优雅退出,在灾难恢复后能做到补偿;
  5. 网络可靠性:不要忽视网络的可靠性问题,响应结果总会有丢失的可能;
  6. 网络带宽:网络带宽也是决定服务器处理能力的关键要素;
  7. 客户端适配:需要考虑与不同客户端的适配;
  8. 延时:特定情况下通信延时是决定系统可用性的最大影响因子;
  9. 传输成本:传输成本也是系统优化的一环,选择合适的传输协议。

接口幂等

幂等的产生来自重复的请求,一般有前端重复提交、接口超时重试、消息重复消费三种原因。


分布式ID生成


网络可靠性问题

如果数据库接收到事务提交请求后,服务器与数据库之间的网络断开,则会导致事务提交但服务器接受不到响应,服务器会响应客户端失败,此场景虽然存在,但理论上不需要处理,因为请求执行的结果都应该以数据库为准。


分布式理论

CAP

一个系统不可能同时满足一致性(C: Consistency)、可用性(A: Availability)和分区容错性(P: Partition tolerance),最多只能同时满足两项。

P是分布式系统最基本要求,即分布式系统不能因为出现网络分区而导致A和C无法保证,所以分布式系统应该选择侧重A或者C,ZooKeeper和Consul保证CP,Eruka保证AP,Nacos支持AP(默认)和CP

Base

Base Available、(基本可用)Sofe state(软状态)、Eventually consistent(最终一致性),核心思想是即使无法做到强一致性,也应该使系统做到最终一致性。

最终一致性的五种实现


分布式事务解决方案

刚性事务(强一致性)

柔性事务

分为两种思想TCC和Saga,柔性事务只能实现最终一致性,其关键就是保证操作的幂等


分布式一致性算法

Paxos

强一致性,属于共识算法,无法解决拜占庭将军问题,缺点是角色过多,不容易实现。

Raft

是对Paxos算法的简化和改进,算法分为Leader选举和状态复制。

ZAB

大部分和raft相同,但状态复制的过程中,心跳是由Follower向Leader发送。

Gossip

弱一致性算法,Redis集群使用Gossip协议传播节点的状态信息。没有角色之分,节点接受到数据变更,会随机传播给其他节点,收到变更后的节点再重复此过程,直到所有节点都被感染。


脑裂问题

Redis

指某个master突然脱离了集群网络导致出现了分区,则从节点会被升级为master,出现脑裂。

ZooKeeper

  1. 集群网络出现异常导致集群被分隔,多数派的子集群选举出了自己的leader,出现脑裂;
  2. leader假死后,集群选举出新的leader,出现脑裂。

Nacos

雪崩机制:即将注册信息保存到调用方本地。

CP:使用Raft协议解决脑裂问题,与ZAB协议基本相同。 AP:使用distro协议,基于临时数据的一致性协议,客户端注册后与一个Nacos节点建立会话,并维持心跳,服务器之间异步增量同步和定时全量同步来保证数据在集群内部的最终一致性,同时集群节点之间也会进行心跳探活。


分布式协调服务

ZooKeeper

使用场景

特点

组成

集群

Nacos

注册信息是保存在内存的map结构内(非文件系统),配置信息是基于数据库存储数据,支持内置数据库和MySQL等等。


分布式链路追踪

SkyWalking

结构


负载均衡算法

  1. 轮询法:顺序的分配到每一台服务器;
  2. 随机法:随机算法指定;
  3. 源地址哈希法:针对源地址特定的哈希算法,同一IP会被转发到同一台服务器;
  4. URL哈希:同一URL会被分配到同一台服务器;
  5. 一致性哈希:使用一致性哈希算法,相同的IP和URL都会被分配到同一机器;
  6. 加权轮询:将请求顺序按照权重进行分配;
  7. 加权随机:按照权重随机请求;
  8. 最小连接数:每次都把请求分配到当前积压连接数最小的服务器。