这篇博客记录一下分布式系统中的几个比较容易让人混淆的概念。
一致性 #
在分布式系统中,一致性模型用于描述多个副本或节点之间的数据一致性程度。越强的一致性往往意味着越差的处理性能。根据选择一致性的强度不同,分为强一致性和弱一致性。
强一致性 (Strong Consistency) #
强一致性要求所有操作按全局顺序执行,任何读取操作都能看到最新写入的数据。系统表现得像只有一个数据副本,所有操作按顺序执行。
想象这样一种场景:用户A向用户B转账100元。
强一致性要求转账完成后,用户A和用户B的账户余额必须立即更新,且任何查询操作都能看到最新的余额。如果用户B在转账后立即查询余额,一定会看到增加了100元的结果。
强一致性还分为顺序一致性和线性一致性。
-
顺序一致性 (Sequential Consistency):要求所有操作按某个全局顺序执行,且每个节点的操作顺序与程序顺序一致。不保证实时性,但保证所有节点看到相同的操作顺序。如果两个线程同时对一个共享变量进行操作。
线程1执行:x = 1,然后x = 2。线程2执行:x = 3,然后读取x的值。顺序一致性要求所有线程看到的操作顺序必须一致。例如,线程2可能看到操作顺序为x = 1 -> x = 3 -> x = 2,但所有线程必须看到相同的顺序。
-
线性一致性 (Linearizability):强一致性的特例,要求所有操作按全局顺序执行,且操作实时生效。任何读取操作都能看到之前所有写入的结果。在多个客户端尝试获取同一个锁的场景下,线性一致性要求锁的获取和释放操作必须按真实时间顺序生效。如果客户端A在时间点T1获取了锁,客户端B在时间点T2尝试获取锁(T2 > T1),那么客户端B必须看到锁已被A持有,直到A释放锁。系统表现得像只有一个锁服务,所有操作按真实时间顺序执行。操作按全局顺序执行,且实时生效。
弱一致性 (Weak Consistency) #
弱一致性不保证读取操作能看到最新写入的数据,允许数据在一段时间内不一致,但最终会达到一致状态。
假如用户A发布了一条动态,用户B尝试查看这条动态。弱一致性允许用户B可能不会立即看到用户A的动态,因为系统可能存在延迟,数据还未同步到所有节点。用户B可能需要刷新几次页面,或者等待一段时间才能看到用户A的动态。
共识 #
共识算法是分布式系统中用于确保所有节点就某一状态或决策达成一致的机制。其核心目标是让系统在存在故障或网络延迟的情况下,仍能正常运行并保持一致。
一致性的概念比共识广泛,一致性指系统在某一时刻所有节点的数据状态相同,强调结果;共识指分布式系统中所有节点就某一状态或决策达成一致的过程,强调过程。
Last modified on 2025-02-06