数据库上的并发读写实施策略 |内存表



我正在研究如何在内部设计数据库。我发现主要有三个组成部分

  1. WAL-预写日志
  2. Memtable-内存中的数据结构,如RedBlack Tree或SkipList
  3. SSTables-磁盘上的文件

现在考虑像cassandra这样的数据库,它具有顺序写入,因此在更新memtable时没有问题。然而,假设writeread同时到来,那么像cassandra这样的数据库是如何工作的。

我这么问是因为——假设数据库使用ReadBlack树作为memtable,并启动write,这可能会导致树重组,但同时read也在发生,那么它可能会导致不一致。

另一种情况是,假设数据库在任何写入之前都在redblacktree上获取lock,那么性能将大幅下降,因为可能有1000秒的读取时间等待锁定释放。

,有人能帮助了解它是如何工作的吗

这并不是真正相关的,因为Cassandra不使用锁定机制(轻量级事务除外(,所以写入是非阻塞的,这也是它们非常快的部分原因。

突变通过追加持久化到commitlog,这意味着不涉及磁盘查找或排序/排序。

Cassandra确实是为高速吞吐量而设计的,它支持互联网规模的读/写。这只是家喻户晓的科技巨头选择卡桑德拉的原因之一。干杯

RocksDB使用一个能够同时读写无锁的跳过列表。由于结构的不变量,无法回收单个条目,因此Delete必须使用tombstone,并且在将整个跳过列表刷新到SST文件后,将回收整个跳过列表。

有关RocksDB写入路径中WAL的更多信息:https://github.com/facebook/rocksdb/wiki/WAL-Performancehttps://github.com/facebook/rocksdb/wiki/Pipelined-Writehttps://github.com/facebook/rocksdb/wiki/unordered_write

最新更新