分布式KV数据库比较
系统名词 | 扩容设计 | 内存模型 | 针对单个Key的一致性策略 | 针对多个Key一致性策略 |
---|---|---|---|---|
Masstree | 多核 | 共享内存 | 线性(Linearizable) | 无 |
Bw-tree | 多核 | 共享内存 | 线性(Linearizable) | 无 |
PALM | 多核 | 共享内存 | 线性(Linearizable) | 无 |
MICA | 多核 | 共享内存 | 线性(Linearizable) | 无 |
Redis | 单核 | N/A | 线性(Linearizable) | 串行化(Serializable) |
COPS, Bolt-on | 分布式 | 消息队列 | 最终一致性(Eventual) | 因果一致性(Causal) |
Bayou | 分布式 | 消息队列 | 最终一致性(Eventual), 单调读/写, Read Your Writes | 最终一致性(Eventual) |
Dynamo | 分布式 | 消息队列 | 线性(Linearizable), 最终一致性(Eventual) | 无 |
Cassandra | 分布式 | 消息队列 | 线性(Linearizable), 最终一致性(Eventual) | 无 |
PNUTS | 分布式 | 消息队列 | 线性写, 单调读 | 无 |
CouchDB | 分布式 | 消息队列 | 最终一致性(Eventual) | 无 |
Voldemort | 分布式 | 消息队列 | 线性(Linearizable), 最终一致性(Eventual) | 无 |
HBase | 分布式 | 消息队列 | 线性(Linearizable) | 无 |
Riak | 分布式 | 消息队列 | 最终一致性(Eventual) | 无 |
DocumentDB | 分布式 | 消息队列 | 最终一致性(Eventual), Session, Bounded Staleness, 线性(Linearizable) | 无 |
Memcached | 多核&分布式 | 共享内存&消息队列 | 线性(Linearizable) | 无 |
MongoDB | 多核&分布式 | 共享内存&消息队列 | 线性(Linearizable) | 无 |
H-Store | 多核&分布式 | 消息队列 | 线性(Linearizable) | 串行化(Serializable) |
ScyllaDB | 多核&分布式 | 消息队列 | 线性(Linearizable), 最终一致性(Eventual) | 无 |
Anna | 多核&分布式 | 消息队列 | 最终一致性(Eventual), 最终一致性(Eventual), Item Cut, Writes Follow Reads, 单调读/写, Read Your Writes, PRAM | Read Committed, Read Uncommitted |
一致性说明:
线性(Linearizable) :是指在更新了某行之后,后续的客户端不会读到老数据,通常用在单行一致性上,最强的一致性模型;
最终一致性(Eventual) 是指在更新了某行之后,后续的客户端可能在某些(缓存)结点上会读到老数据(特别是并发执行的事务),但是最后(一段时间后)一定会读到一致的最新数据;
串行化(Serializable) 是指对多个读写同一行数据的事务,采用排序和排队执行的机制,这样也能保证数据的严格一致性,但是通常这涉及加锁(spanner/f1)或单点原子化操作(redis);
单调读(Monotonic Reads) 是指在某一个客户端读取到新数据后,不会再读到老数据,但是有可能在更新一行后短期内客户端仍然读到老数据,属于 最终一致性 的一种;
单调写(Monotonic Writes) 是指对单个客户端的写入操作一定是有序的,属于 最终一致性 的一种;
因果一致性(Causal) 是指在某个客户端上对一组Key的读写操作会被认为有因果关系,那么在进程上也都保持一样的可见性顺序,属于 最终一致性 的一种。通常通过 向量时钟(Vector Clock) 实现;
Read Your Writes 是指当一个数据行被更新后,这个进程后面的读操作一定会读到这个新值。通常如果数据库系统有 N个副本节点 , W个节点感知到写入 , R个节点对读操作返回的数据一致 , 且如果 W + R > N , 那么我们认为当前系统符合 Read Your Writes 一致性,属于 最终一致性 的一种;
Session 是Read Your Writes的一种更具体的行为,即每一次客户端连接到服务器的Session中保证 Read Your Writes 一致性,如果重新建立Session则不保证,属于 最终一致性 的一种;
Bounded Staleness 是指读取操作最多滞后于写入操作最多k个版本或t个周期之后,属于 最终一致性 的一种;
Writes follows reads 是指对一个Key的读操作后一定跟着这个Key的写操作;
PRAM 是指对于某个进程对多个Key的写入,其他进程看到的写入顺序和这个写入进程的写入顺序一致。因为这些Key在这个写入进程上是同一个pipeline;
Read Uncommitted 是指对同一组事务禁止 脏写 ,即多个未提交事务同时修改一组数据;
Read Committed 是指事务读取数据时,不允许看到其他未提交事务所写入的数据,通常涉及多个事务并发执行且需要访问同一组数据;
- See https://en.wikipedia.org/wiki/Consistency_model for more details