何为分布式系统?分布式系统(Distributed System)是建立在网络之上的软件系统,具有高度透明性。透明性是指每一个节点对用户的应用来说都是透明的,看不出是本地还是远程。
CAP理论阐述
CAP理论由Eric Brewer教授10年前在ACM PODC会议上的主题报告中提出,这个理论是NoSQL数据库的基础,后来Seth Gilbert和Nancy lynch两人证明了CAP理论的正确性。
其中字母“C”、“A”和“P”分别代表了强一致性、可用性和分区容错性三个特征。
- 强一致性(Consistency):系统在执行过某项操作后仍然处于一致的状态,在分布式系统中,更新操作执行成功后所有的用户都应该读取到最新的值,这样的系统被认为具有强一致性。
- 可用性(Availability):每一个操作总是能够在一定的时间内返回结果,这里需要往意的是“一定时间内”和“返回结果”
“一定时间内”是指系统的结果必须在给定时间内返回,如果超时则被认为不可用,这是至关重要的。例如通过网上银行的网络支付功能购买物品。当等待了很长时间,比如15分钟,系统还是没有返回任务操作结果,购买者一直处于等待状态,那么购买者就不知道是否支付成功,还是需要进行其他操作。这样当下次购买者再次使用网络支付功能时必将心有余悸。
“返回结果”同样非常重要。还是拿这个例子来说,假如购买者单击支付之后很快出现了结果,但是结果却是“java.Jang.error…”之类的错误信息。这对于普通购买者来说相当于没有任何结果。因为他仍旧不知道系统处于什么状态,是支付成功还是支付失败,或者需要重新操作。
- 分区容错性(Partition Tolerance):分区容错性可以理解为系统在存在网络分区的情况下仍然可以接受请求(满足一致性和可用性)。这里网络分区是指由于某种原因网络被分成若干个孤立的区域,而区域之间互不相通。还有一些人将分区容错性理解为系统对节点动态加入和离开的处理能力,因为节点的加入和离开可以认为是集群内部的网络分区。
CAP是在分布式环境中设计和部署系统时所要考虑的三个重要的系统需求。根据CAP理论,数据共享系统只能满足这三个特性中的两个,而不能同时满足三个条件。因此系统设计者必须在这三个特性之间做出权衡,如表所示。
- 放弃P:由于任何网络(即使局域网)中的机器之间都可能出现网络互不相通的情况,因此如果想避免分区容错性问题的发生,一种做法是将所有的数据都放到一台机器上。虽然无法100%的保证系统不会出错,但不会碰到由分区带来的负面影响。当然,这个选择会严重影响系统的扩展性。如果数据量较大,一般是无法全部放在一台机器上的,因此放弃Р在这种情况下不能接受。所有的NoSQL 系统都假定P是存在的。
- 放弃A:相对于放弃“分区容错性”来说,其反面就是放弃可用性。一旦遇到分区容错故障,那么受到影响的服务需要等待数据一致,因此在等待期间系统就无法对外提供服务。
- 放弃C:这里所说的放弃一致性,并不是完全放弃数据的一致性,而是放弃数据的强一致性,而保留数据的最终一致性。以网络购物为例,对只剩最后一件库存的商品,如果同时收到了两份订单,那么较晚的订单将被告知商品售完。
- 其他选择:引入 BASE (Basically Availability,Soft-State,Eventually consistency)该方法支持最终一致性,其实是放弃C的一个特例。
传统关系型数据库注重数据的一致性,而对海量数据的分布式存储和处理,可用性与分区容忍性优先级要高于数据一致性,一般会尽量朝着A、P的方向设计,然后通过其他手段保证对于一致性的商务需求