分布式系统设计(1)

 

1 设计分布式系统需要考虑的异常

1.1 节点宕机
1.2 网络异常

消息丢失、消息乱序(可以通过增加序列号解决)以及数据错误

1.3 分布式系统三态

在单机,只要不宕机,一个函数执行要么成功、要么失败,但是分布式系统共下存在成功、失败和超时。下面解释一下超时的不确定性:

某个节点 A 向另一个节点 B 发送一个消息,如果请求 RPC 的节点 A 在给定的时间内没有收到执行 RPC 的节点 B 返回的消息,则认为该操作“超时”。对于超时的请求,我们无法获知该请求是否被节点 B 成功执行了。这是因为,如果超时是由于节点 A 发向节点 B 的请求消息丢失造成的,则该操作肯定没有被节点 B 成功执行;但如果节点 A 成功的向节点 B 发送了请求消息,且节点 B 也成功的执行了该请求,但节点 B 发向节点 A 的结果消息被网络丢失了或者节点 B 在执行完该操作后立刻宕机没有能够发出结果消息,从而造成从节点 A 看来请求超时。所以一旦发生超时,请求方是无法获知 RPC 的执行结果的。

超时解决方法:

A 当出现“超时”时,可以通过发起读取数据的操作以验证 RPC 是否成功 (例如银行系统的做法)。

B 设计分布式协议时将执行步骤设计为可重试的,即具有所谓的“幂等性”。例如覆盖写就是一种常见的幂等性操作,因为重复的覆盖写最终的结果都相等。如果使用可重试的设计,当出现“失败”和“超时”时,一律重试操作直到“成功”。这样,即使超时的操作实际上已经成功了,重试操作也不会对正确性造成影响,从而简化了设计

1.4 存储数据丢失

一般是硬盘机械故障。

2 数据分布方式

2.1 哈希方式

哈希方式是最常见的数据分布方式,其方法是按照数据的某一特征计算哈希值,并将哈希值与机器中的机器建立映射关系,从而将不同哈希值的数据分布到不同的机器上。

优点:

哈希方式需要记录的元信息也非常简单,任何时候,任何节点只需要知道哈希函数的计算方式及模的服务器总数就可以计算出处理具体数据的机器是哪台。

缺点:

A 突出表现为可扩展性不高,一旦集群规模需要扩展,则几乎所有的数据需要被迁移并重新分布

B 一旦某数据特征值的数据严重不均,容易出现“数据倾斜”(data skew)问题,只能重新选择需要哈希的数据特征,例如选择用户 id 与另一个数据维度的组合作为哈希函数的输入。

2.2 按数据范围分布

将数据按特征值的值域范围划分为不同的区间,使得集群中每台(组)服务器处理不同区间的数据。

优点:

使用范围分布数据的方式的最大优点就是可以灵活的根据数据量的具体情况拆分原有数据区间,拆分后的数据区间可以迁移到其他机器,一旦需要集群完成负载均衡时,与哈希方式相比非常灵活。另外,当集群需要扩容时,可以随意添加机器,而不限为倍增的方式,只需将原机器上的部分数据分区迁移到新加入的机器上就可以完成集群扩容。

缺点:

按数据范围分布数据需要记录所有的数据分布情况。一般的,往往需要使用专门的服务器在内存中维护数据分布信息,称这种数据的分布信息为一种元信息。

2.3 按数据量分布

优点:

由于与具体的数据内容无关,按数据量分布数据的方式一般没有数据倾斜的问题,数据总是被均匀切分并分布到集群中。当集群需要重新负载均衡时,只需通过迁移数据块即可完成。集群扩容也没有太大的限制,只需将部分数据库迁移到新加入的机器上即可以完成扩容。

缺点:

需要管理较为复杂的元信息,与按范围分布数据的方式类似,当集群规模较大时,元信息

的数据量也变得很大,高效的管理元信息成为新的课题。

2.4  一致性哈希

一致性哈希(consistent hashing)是另一个种在工程中使用较为广泛的数据分布方式。一致性哈希最初在 P2P 网络中作为分布式哈希表(DHT)的常用数据分布算法。一致性哈希的基本方式是使用一个哈希函数计算数据或数据特征的哈希值,令该哈希函数的输出值域为一个封闭的环,即哈希函数输出的最大值是最小值的前序。将节点随机分布到这个环上,每个节点负责处理从自己开始顺时针至下一个节点的全部哈希值域上的数据。

例 2.1.3:某一致性哈希函数的值域为[0, 10),系统有三个节点 A、B、C,这三个节点处于的一致性哈希的位置分别为 1,4,9,则节点 A 负责的值域范围为[1,4),节点 B 负责的范围为[4, 9),节点 C 负责的范围为[9, 10)和[0, 1)。若某数据的哈希值为 3,则该数据应由节点 A 负责处理。 图  2-4给出了这个例子的示意图。

wps_clip_image-18051

哈希分布数据的方式在集群扩容时非常复杂,往往需要倍增节点个数,与此相比,一致性哈希的优点在于可以任意动态添加、删除节点,每次添加、删除一个节点仅影响一致性哈希环上相邻的节点。

例 2.1.4:假设需要在例 2.1.3 中增加一个新节点 D,为 D 分配的哈希位置为 3,则首先将节点A 中[3, 4)的数据从节点 A 中拷贝到节点 D,然后加入节点 D 即可

优点:

使用一致性哈希的方式需要将节点在一致性哈希环上的位置作为元信息加以管理,这点比直接使用哈希分布数据的方式要复杂。然而,节点的位置信息只于集群中的机器规模相关,其元信息的量通常比按数据范围分布数据和按数据量分布数据的元信息量要小很多。

缺点:

随机分布节点的方式使得很难均匀的分布哈希值域,尤其在动态增加节点后,即使原先的分布均匀也很难保证继续均匀,由此带来的另一个较为严重的缺点是,当一个节点异常时,该节点的压力全部转移到相邻的一个节点,当加入一个新节点时只能为一个相邻节点分摊压力。

2.5  数据分布方式的选择

在实际工程实践中,可以根据需求及实施复杂度合理选择数据分布方式。另外,上述数据分布方式是如果可以灵活组合使用,往往可以兼备各种方式的优点,收到较好的综合效果。

2.6  工程投影

wps_clip_image-3230

posted @ 2013-11-03 23:31  TheBug  阅读(4493)  评论(5编辑  收藏  举报