C(Consistency强一致性):系统在执行过某项操作后仍然处于一致的状态。直接的说就是更新操作执行成功后所有的用户都应该读到最新的值。用户A改了某个数据的值,用户B去读数据,必须要读到A修改后的值。
A(Availability可用性):每一个操作总是能够在一定的时间内返回结果。简单的说就是,用户访问数据库必须有回应,数据库不能卡死或崩掉。
P(Partition tolerance分区容错性):指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信)分离的系统也能够正常运行。简单的说,数据库中的服务器节点需要相互通信,保证彼此的数据都是一致的。当某一个节点和其他的节点断开了,他依然要能够运行(这时它本地保存的数据也许就和其他的节点慢慢的不一样了)
一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个要求,最多只能同时较好的满足其中的两个。
为什么不能同时满足3个呢?因为在逻辑上就会矛盾。
比如:
某一个数据库节点s1,由于网络分片导致s1和其他节点之间所有的通讯都断开了,用户A去更新数据库中的数据X,然后用户B去从s1中读取数据X的值(按照P的要求,s1需要可以继续运行),这时候读到的数据X就不会是最新的了,就无法满足C的要求。
此时,可以选择:
三类:
传统的SQL数据库的事务通常都是支持ACID的强事务机制:
BASE其实就是下面三个术语的缩写:
分布式:不同的多台服务器上面部署不同的服务模块(工程),他们之间通过RPC/RMI之间通信和调用,对外提供服务和组内协作。
集群:不同的多台服务器上面部署相同的模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。