分布式KV数据库比较

分布式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)SessionBounded Staleness线性(Linearizable)
Memcached多核&分布式共享内存&消息队列线性(Linearizable)
MongoDB多核&分布式共享内存&消息队列线性(Linearizable)
H-Store多核&分布式消息队列线性(Linearizable)串行化(Serializable)
ScyllaDB多核&分布式消息队列线性(Linearizable)最终一致性(Eventual)
Anna多核&分布式消息队列最终一致性(Eventual)最终一致性(Eventual), Item Cut, Writes Follow Reads, 单调读/写, Read Your WritesPRAMRead CommittedRead 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
updatedupdated2024-08-252024-08-25