1.4. NWR
N :在分布式存储系统中,有 多少份备份数据
W :代表一次成功的更新操作要求至少有 w 份数据写入成功
R : 代表一次成功的读数据操作要求至少有 R 份数据成功读取
NWR值的不同组合会产生不同的一致性效果,当W+R>N的时候,整个系统对于客户端来讲能保
证强一致性。而如果 R+W<=N,则无法保证数据的强一致性。以常见的 N=3、W=2、R=2 为例:
N=3,表示,任何一个对象都必须有三个副本(Replica),W=2 表示,对数据的修改操作
(Write)只需要在 3 个 Replica 中的 2 个上面完成就返回,R=2 表示,从三个对象中要读取到 2
个数据对象,才能返回。

1.5. Gossip
Gossip 算法又被称为反熵(Anti-Entropy),熵是物理学上的一个概念,代表杂乱无章,而反熵
就是在杂乱无章中寻求一致,这充分说明了 Gossip 的特点:在一个有界网络中,每个节点都随机
地与其他节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。每个节点可
能知道所有其他节点,也可能仅知道几个邻居节点,只要这些节可以通过网络连通,最终他们的
状态都是一致的,当然这也是疫情传播的特点。
1.6. 一致性 Hash
一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。
Memcached client 也选择这种算法,解决将 key-value 均匀分配到众多 Memcached server 上
的问题。它可以取代传统的取模操作,解决了取模操作无法应对增删 Memcached Server 的问题
(增删 server 会导致同一个 key,在 get 操作时分配不到数据真正存储的 server,命中率会急剧下
降)。
1.6.1. 一致性 Hash 特性
平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得
所有的缓冲空间都得到利用。
单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,
又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到新的缓
冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。容易看到,上面的简单求余算法
hash(object)%N 难以满足单调性要求。
平滑性(Smoothness):平滑性是指缓存服务器的数目平滑改变和缓存对象的平滑改变是一致
的。
1.6.2. 一致性 Hash 原理
-
建构环形 hash 空间 :
-
考虑通常的 hash 算法都是将 value 映射到一个 32 为的 key 值,也即是 0~2^32-1 次方的
数值空间;我们可以将这个空间想象成一个首( 0 )尾( 2^32-1 )相接的圆环。
-
把需要缓存的内容 ( 对象 ) 映射到 hash 空间
-
接下来考虑 4 个对象 object1~object4 ,通过 hash 函数计算出的 hash 值 key 在环上的分
布
-
把服务器 ( 节点 ) 映射到 hash 空间
-
Consistent hashing 的基本思想就是将对象和 cache 都映射到同一个 hash 数值空间中,并
且使用相同的 hash 算法。一般的方法可以使用 服务器(节点) 机器的 IP 地址或者机器名作为
hash 输入。
-
把对象映射到 服务节点
-
现在服务节点和对象都已经通过同一个 hash 算法映射到 hash 数值空间中了,首先确定对象
hash 值在环上的位置,从此位置沿环顺时针"行走",第一台遇到的服务器就是其应该定位
到的服务器。

拟节点",这个对应个数也成为"复制个数","虚拟节点"在 hash 空间中以 hash
值排列。
仍以仅部署 cache A 和 cache C 的情况为例。现在我们引入虚拟节点,并设置"复制个数"为 2 ,
这就意味着一共会存在 4 个"虚拟节点", cache A1, cache A2 代表了 cache A; cache C1,
cache C2 代表了 cache C 。此时,对象到"虚拟节点"的映射关系为:
objec1->cache A2 ; objec2->cache A1 ; objec3->cache C1 ; objec4->cache C2 ;
因此对象 object1 和 object2 都被映射到了 cache A 上,而 object3 和 object4 映射到了 cache
C 上;平衡性有了很大提高。
引入"虚拟节点"后,映射关系就从 { 对象 -> 节点 } 转换到了 { 对象 -> 虚拟节点 } 。查询物体所
在 cache 时的映射关系如下图 所示。

2 分布式
1、什么是分布式系统
分布式系统是一个硬件或软件组成分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统
2、分布式系统的特征
- 分布性
分布式系统的多台计算机都会在空间上随意分布的,同时,机器的分布情况也会随时变动 - 对等性
分布式系统中的计算机没有主/从之分,既没有控制整个系统的主机,也没有被控制的从机,组成分布式系统的所有计算机节点都是对等的。副本 (Replica)是分布式系统最常见的概念之一,指的是分布式系统对数据和服务提供的一种冗余方式。 在常见的分布式系统中,为了对外提供高可用的服务,我们往往会对数据和服务进行副本处理。数据副本是指在不同的节点上持久化同一份数据,当某一个节点上存储的数据丢失时,可以从副本上读取到该数据,这是解决分布式系统数据丢失问题 最为有效的手段。另一类副本是服务副本,指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理 - 并发性
在"问题的提出"部分,我们已经提到过与"更新的并发性"相关的内容。在一个计算机网络中,程序运行过程中的并发性操作是非常常见的行为,例如同一个分布式系统中的多个节点,可能会并发地操作一些共享的资源,诸如数据库或分布式存储等,如何准确并高效地协调分布式并发操作也成为了分布式系统架构与设计中最大的挑战之一。 - 缺乏全局时钟
前面提到,一个典型的分布式系统是由一系列在空间上随意分布的多个进程组成的,具有明显的分布性,这些进程之间通过交换消息来进行相互通信。因此,在分布式系统中,很难定义两个事件究竞谁先谁后,原因就是因为分布式系统缺乏一个全局的时钟序列控制。关于分布式系统的时钟和事件顺序中已经做了非常深刻的讲解. - 故障总是会发生
组成分布式系统的所有计算机,都有可能发生任何形式的故障。一个被大量工程实践所检验过的黄金定理是:任何在设计阶段考虑到的异常情况,一定会在系统实际运行中发生,并且,在系统实际运行过程中还会遇到很多在设计时未能考虑到的异常故障。所以,除非需求指标允许,在系统设计时不能放过任何异常情况。
3、分布式环境的各种问题
- 通信异常
从集中式向分布式演变的过程中,必然引人了网络因素,而由于网络本身的不可靠性、因此也引人了额外的问题。分布式系统需要在各个节点之间进行网络通信,因此每次网络通信都会伴随着网络不可用的风险,网络光纤、路由器或是 DNS等硬件设备或是系统不可用都会导致最终分布式系统无法顺利完成一次网络通信。 另外,即使分布式系统各节点之间的网络通信能够正常进行,其延时也会远大于单机操作。通常我们认为在现代计算机体系结构中,单机内存访问的延时在纳秒数量级(通常是10ns左右),而正常的一次网络通信的延迟在0.1- 1ms左右(相当于内存访问延时的105~106倍),如此巨大的延时差别,也会影响消息的收发的过程,因此消息丢失和消息延迟变得非常普遍 - 网络分区
当网络由于发生异常情况,导致分布式系统中部分节点之间的网络延时不断增大,最终导致组成分布式系统的所有节点中,只有部分节点之间能够进行正常通信。而另一些节点则不能我们将这个现象称为网络分区,就是俗称的"脑裂"。当网络分区出现时 分布式系统会出现局部小集群,在极端情况下,这些局部小集群会独立完成原本需要整个分布式系统才能完成的功能,包括对数据的事务处理,这就对分布式一致性提出了非常大的挑战。 - 三态
前面提到,在分布式系统环境下,网络可能存在各种各样的问题;因此分布式系统的每一次请求和响应,存在特有的"三态"概念,即成功、失败与超时。 在传统的单机系统中,应用程序在调用一次函数之后,能够得到一个非常明确的响应,成功或失败;而在分布式系统中,由于网络是不可靠的,虽然在绝大部分情况下,网络通信也能接收到成功或失败的响应,但是当网络出现异常时,就可能出现超时的情况,通常有以下两种情况:- 请求时消息丢失
- 响应时消息丢失
- 节点故障
节点故则是分布式环境下另一个比较常见的问题,指的是组成分布式系统的服务器节点出现的宕机或"死"现象。通常根据经验来说,每个节点都有可能会出现故障,并且每天都在发生