分布式系统的一致性原理
对于分布式系统,我们必须要深刻理解和牢记一点:分布式系统的不可靠性。
可靠性指系统可以无故障地持续运行,如果一个系统在运行中意外宕机或者无法正常使用,它就是一个不可靠的系统,即使宕机和无法使用的时间很短。我们知道,分布式系统通常是由独立的服务器通过网络松散耦合组成的,网络在本质上是一个复杂的IO系统,在通常情况下,I/O发生故障的概率和不可靠性要远远高于主机的CPU和内存,加之网络设备的引入,也增加了系统发生大面积“瘫痪”的可能性。总之,分布式系统中重要的理论和设计都是建立在分布式系统不可靠这一基础上的,因为系统不可靠,所以我们需要增加一些额外的复杂设计和功能,来确保由于分布式系统的不可靠导致系统不可用性的概率降到最低。可用性是一个计算指标,如果系统在每小时崩溃lms,它的可用性就超过99.999 9%;如果一个系统从来不崩溃,但是每年要停机两周,那么它是高度可靠的,但是可用性只有96%。
在理解了分布式系统的可靠性原理后,接下来我们开始接触分布式系统中影响深远的一个重要原理——一致性原理。分布式集群的一致性是在分布式系统里“无法绕开的一块巨石”,很多重要的分布式系统都涉及一致性问题,而目前解决此问题的几个一致性算法都非常复杂。
分布式集群中一致性问题的场景描述如下:
N个节点组成一个分布式集群,要保证所有节点都可以执行相同的命令序列,并达到一致的状态。即在所有节点都执行了相同的命令序列后,每个节点上的结果都完全相同。实际上,由于分布式系统的不可靠性,通常只要保证集群中超过半数的节点(N/2+1)正常并达到一致性即可。
前面说过,绝大多数分布式集群都采用了中心化的设计思想,上述最终一致性问题场景里的集群也遵循了这种设计,即存在一个Leader,但比较特别的是在这个场景里,集群中的其他节点都是Leader 的追随者——Follower。客户端发送给Leader的所有指令,Follower都复制一遍。这听起来很简单,但在一个分布式环境下实际上很难实现。
如下图所示是分布式集群“一致性”算法的一个典型案例,来自Kafka。

本文深入探讨了分布式系统的一致性原理,强调了由于网络的不可靠性,保证分布式集群中所有节点达到一致状态的挑战。介绍了Kafka和Cassandra等系统的一致性算法,如基于Raft的状态机模型。最终一致性作为一种权衡数据一致性和性能的方法也被提及,它允许短暂的数据不一致以提高读写性能。下篇文章将讨论ZooKeeper在分布式系统中的作用。
最低0.47元/天 解锁文章
1588

被折叠的 条评论
为什么被折叠?



