状态是什么
状态保存着程序一些数据或者上下文
无状态Stateless
无状态表示服务本身不存储任何数据和信息,但是可以借助外部存储数据(redis,mysql,session),但是会增加网络开销。在分布式架构上可以随意增加或删除节点,对系统不会造成影响。
有状态Stateful
和无状态的特点截然相反,数据本地化把数据和状态本地存储,减少延时,对数据密集型程序来说,速度更快。高可用和强一致符合CAP机制的A和C。
CAP机制
Consistency一致性:多个节点访问的数据是一致的 Availability可用性:即使节点挂掉了,系统仍然能对请求作出响应,不会返回错误或超时 Partition Tolerance分区容忍性:即使部分节点出现网络连接失败,系统依然能正常运行
这三个特性只能满足两个,无法同时满足三个
- CP(牺牲可用性)
- AP(牺牲一致性)
- CA(牺牲分区容忍)
CP保证节点数据一致,即使部分节点不可用,常用金融系统 AP保证系统可用,数据存在短时间不一致,常用社交网络 CA分布式系统中不现实
Sticky Session
有状态服务对于客户端的请求,必须保证落在同一个实例。
实现Sticy Session
-
长连接会带来节点负载和数据不均问题,连接上了就不会断开。反向压力(当一个节点压力过大时,它会通过限流、排队、降级或拒绝部分请求的方式来减少负载,让请求流向其他负载较小的节点,而不是直接断开连接。)的做法会带来一些问题。 如果要变的均匀,用一个元数据索引映射后端服务实例和请求关系,用一个路由节点会根据元数据索引路由,元数据索引表会根据服务的压力重新映射。
-
Gossop协议通过 Gossip 协议在各个节点之间同步元数据,可以使得节点的增加和减少变得更加容易,且能够帮助集群内部进行负载均衡和资源重新分配。
服务容错设计
在分布式系统下,我们已经在运行时进行多节点复制,避免挂掉,把数据持久化到硬盘,这个硬盘可以是挂载到本地硬盘的一个外部分布式的文件卷。当一个节点挂掉了以后,另外一台机器可以启动一个新的实例,把之前的文件系统挂载过来。在启动的过程中就装载好了大多数数据,那么从其他节点上同步少量的数据就可以快速恢复和提供服务。