S 先生 是一位难得的技术同行,学者气质,一见如故。s 先生 作为本公众号(wireless_com) 的第一位投稿者,老曹深感荣幸。CAP 和 分布式系统的讨论和研究很多,但我认为这一篇肯定给大家带来不一样的收获,欢迎留言讨论。
Author |
Taosheng Shi |
||||||||||||
WeChat Contact |
data-lake |
||||||||||||
Mail Contact |
tshshi@126.com |
||||||||||||
Organization |
NOKIA |
||||||||||||
Document category |
Distributed System |
||||||||||||
Document location |
https://github.com/stone-note/articles |
||||||||||||
|
Contents
1.................... 引言
2.................. 全球规模分布式系统
3.................. 分布式系统设计的两大原则
3.1................ 通过复制来提高可用性
3.2............... 使用CAP理论指导分布式系统设计
4.................. 重新理解CAP
4.1................ CAP三者并不对等,三选二是误导
4.2............... 保证不发生分区,CA也不容易兼得
4.3............... 发生分区时,也不要随意牺牲CA
5.................. 分解,分解,分解
5.1................ P分解:延迟?故障?分区?
5.2............... C分解:服务器端与客户端
5.3............... A分解:出来混,迟早要还的
6................... 真正的难题
7................... 总结
8................... 附录
8.1................附录1:不变性如何打败CAP定理?
8.2............... 附录2:放弃P,选择C
8.3............... 附录3:用PACELC替换CAP
9.................. 参考文献
1 引言
在现代分布式系统中,节点数目是巨大的。在CAP理论的范围内,MichaelStonebraker断言分区必然会发生,并且系统内发生节点失败的机会随着节点数的增加而呈指数级增加:
基于这样的事实,很多人会问:
如果发生分区(故障),系统会牺牲什么?一致性还是可用性?
对于这个问题,我有几个反问:
发生分区这个假设在多大概率上会成立?哪些因素会造成分区?
如果发生分区,一致性如何定义?应用需要什么样的一致性?
如果发生分区,可用性如何定义?应用需要什么样的可用性?
如果不发生分区,一致性和可用性又该如何取舍?
2 全球规模分布式系统
分布式系统是指联网的计算机通过消息传递来协调行为的系统。在这样的系统中机器之间并发执行,独立故障,并且没有全局状态和全局锁。
随着互联网公司的全球化,为了保证服务质量和响应速度,各大互联网公司(Google,Amzon,Facebook,Alibaba等)纷纷在全球建立数据中心,部署服务和放置数据。为了提高可用性和响应速度,以及满足容灾等需求,这些系统都采用了复制技术。这就带来了服务和数据状态的全球范围内的数据复制和一致性问题。
类似这样的系统有:Dynamo,PNUTS,Cassandra,Megastore,Mesa,Walter,COPS,Spanner,Gemini等。
3 分布式系统设计的两大原则
分布式系统设计的原则有很多,这里介绍两个基础性的原则。
3.1 通过复制来提高可用性
通过复制来提高可用性,这是分布式系统设计的首要原则。从复制类型来看,复制可以分为主动复制和被动复制。
在主动复制中,每个客户端请求都由所有服务器处理。主动复制首先由Leslie Lamport以“状态机复制”命名。这要求由服务器托管的进程是确定性的。确定性意味着,给定相同的初始状态和请求序列,所有过程将产生相同的响应序列,并且最终处于相同的最终状态。为了使所有的服务器接收到相同的操作序列,一般都使用原子广播协议。原子广播协议保证所有服务器都接收到消息或没有消息,并且他们都以相同的顺序接收消息。主动复制的主要缺点是实际上大多数真实世界的服务器都是非确定性的。
在被动复制中,只有一个服务器(称为主服务器)处理客户机请求。处理请求后,主服务器更新其他(备份)服务器上的状态,并将响应发送回客户端。如果主服务器发生故障,则其中一台备份服务器就会接管它。被动复制可以用于非确定性过程。被动复制与主动复制相比的主要缺点是在失败的情况下,客户端的响应会被延迟。
从进程与系统交互角度来看,复制分为同步复制和异步复制。
同步复制 - 通过原子写入操作来保证“零数据丢失”,即完全写入。在本地和远程副本存储的确认之前,写入不被认为是完整的。
异步复制 - 本地存储确认后,写入即被认为是完整的。远程存储已更新,但可能滞后很小。系统性能会因异步复制而大大提高。但是在丢失本地存储的情况下,远程存储不能保证具有当前的数据副本,并且最近的数据可能会丢失。
关于复制技术,目前有三大模型:事务复制,paxos复制和虚拟同步。事务复制,paxos复制讨论的已经比较多,虚拟同步则较少看到有产品采用。虚拟同步定义了一个动态的自组织进程组,这个进程组本身可以看作是一个复制变量,那么这个变量需要特定应用中保持一致。虚拟同步常用的场景是订阅发布和DHT中相邻节点的成员关系。虚拟同步和paxos协议的区别在于不同的层次:paxos协议可以用来保证虚拟同步的进程组视图一致。事务复制和paxos复制的区别在于:事务复制满足ACID语义,有明确的begin/commit/abort接口;paxos复制内部可能使用弱一致性的传言协议,并可以呈现外部的一致性。paxos复制没有保证提供ACID语义和begin/commit/abort接口。
https://en.wikipedia.org/wiki/Virtual_synchrony
https://en.wikipedia.org/wiki/Replication_(computing)
我个人认为复制的分类方式可以根据节点组织关系分为以下三种:master/slave复制,paxos复制和链式复制。这里不赘述。
关于复制副本的数量,通常我们讨论的都是3