分布式系统基础-第三篇:分布式数据基础

307 阅读6分钟

分区

把系统的数据集划分为不同的分块并且由不同的节点服务不同的分块的技术被称为分区。通过使用分区技术,分布式系统的单点负载问题可以被减轻。在节点之间的分区被称为水平分区,在节点内部的分区被称为垂直分区。

分区的策略包括基于哈希的分区和基于范围的分区。

基于范围的分区就是把键分为若干个范围,不同的节点分为不同的范围。例如,节点A负责键03,节点B负责键47。该策略的优点是顺序查找非常快速。缺点是当数据集分布不均且难以预料的时候,热点问题就会出现。

基于哈希的分区就是把键key分到hash(key)分区上。基本的哈希策略就是使用一个尽可能随机、均匀的哈希函数,这最大程度减轻了基于范围的分区策略中出现的热点问题。但节点的加入和退出引起的重分区会引起过多键的迁移,甚至大多数是不必要的。一致性哈希解决了这一问题。一致性哈希就是把hash输出固定到一个范围,这个范围被视作一个环。hash(key)的值落在该环中,key对应的分区就是hash(key)沿着该环顺时针走的第一个partition(具体怎么走由实现决定)。

consistent-hash.png


复制

把一个节点的数据集复制到另一个节点上的技术被称为复制技术。通过使用复制技术,分布式系统提高了其可用性,避免了单点故障问题。复制技术的常见架构有两种:主从复制和主主复制。

在主从复制中,只有一个节点的主节点,其他的节点为从节点。根据同步性质来分,主从复制被分为同步的和异步的。同步的主从复制具有更高的一致性和更久的用户请求完成时间,而异步的主从复制具有更低的一直性和更短的用户请求完成时间。根据一致性的要求,系统设计者可以考虑是否允许从节点处理用户的读请求。例如,在ZooKeeper的设计中,设计者为了给read-dominant负载提供高性能,允许从节点返回一定旧数据。

在主主复制中,多个节点可以为主节点或者说集群的所有节点都可以处理读请求和写请求,但如果需要确保线性一致性需要基于共识。常见的处理主主复制的共识算法是quorum算法。


数据存储理论

CAP理论

理论陈述:任何分布式数据存储都只能提供Consisteny, Availability和Partition tolerance中的任意两个保证。当网络分区发生的时候,系统要么提供一致性保证,要么提供可用性保证。

一般来说,现在的分布式系统,特别是多数据中心的分布式系统,普遍存在网络分区的情况,所以分布式系统一般都会提供Partition tolerance保证。CP一般用在金融系统这类对数据一致性要求很高的系统中,而AP一般用在互联网娱乐资讯类软件的后台系统中,该类系统对可用性要求很高,允许数据在合理的时间内不一致。

PACELC理论

理论陈述:分布式数据存储在遇到网络分区(Partition)情况时,需要在可用性(Availability)和一致性(Consistency)之间选择。而在没有网络分区情况时(Else),也需要在延迟(Latency)和一致性(Consistency)之间选择。该理论是对CAP理论的扩展。

BASE理论

理论陈述:Basically Available指的是系统一般总是可用的;Soft State指的是即使没有系统外的输入或者触发,系统内的数据也会更改;Eventual Consistency指的是一个成功的写总会在未来的某个时间后被所有的读发现。

BASE理论实际上就是AP模型,它更强调需要客户端处理数据的完整性。举例来说,假设一个用户给一个文章点了赞,该用户能够立刻看到点赞成功的界面。然而,该文章的最新点赞信息不能立刻被其它用户看到,相反地,该文章的点赞信息可能依然在节点之间同步。我们说这个页面的点赞状态就是一个软状态。


一致性模型

分布式系统的常见一致性模型包括:线性一致性、顺序一致性、因果一致性和最终一致性。

线性一致性

线性一致性有两个要点:1)所有的复制都以某种全序来执行操作;2)全序保留两个操作间的实时顺序。如果一个操作A在操作B开始之前结束,那么我们说A在实时顺序上先于B。

概括来说,线性一致性就是某个全序+实时顺序。

顺序一致性

顺序一致性有两个要点:1)所有的复制都以某种全序来执行操作;2)同一线程上的处理顺序应该体现在全局顺序中。

概括来说,顺序一致性就是某个全序+处理顺序。

因果一致性

前置概念:潜在因果关系(potential causality),符号表示为->。其定义规则如下:

  • 执行线程:如果操作a和b都在一个线程中被执行,并且a发生在b之前,那么a->b。
  • 从...获取(Get From):如果操作a是一个put操作,操作b得到了a的返回值,那么a->b。
  • 传递性:如果a->b, b->c,那么a->c。

因果一致性需要满足:从一个复制得到的值需要满足因果关系。因果一致性存在并发问题。例如,两个节点同时分别发出put(x,4)和put(x,5)的请求,因果一致性允许一部分节点将x更新为4,而另一部分节点将x更新为5,此时出现了不一致的问题。

因果一致性+(Causality consistency+)引入了汇聚冲突处理(convergent conflict handling)来通过使用冲突处理函数来解决该问题。一般的做法是last-writer-win策略。

最终一致性

最终一致性要求如果一个写操作write(x, val)在执行后足够长的时间内,没有其他的write(x,new_val)操作,那么x=val的结果应该能够从任意节点通过请求get(x)得到。


参考文章

Partitioning: The Magic Recipe For Distributed Systems | by Pranay Kumar Chaudhary | Medium :一篇介绍分布式系统分区技术的文章。

Explanation of BASE Terminology | Baeldung on Computer Science :一篇理解BASE理论的文章。

Princeton University Distributed System L15-consistency.pdf :普林斯顿大学关于一致性模型的讲解PPT,里面给出了关于线性一致性、顺序一致性和因果一致性的足够示例。