我正在研究如何在内部设计数据库。我发现主要有三个组成部分
- WAL-预写日志
- Memtable-内存中的数据结构,如RedBlack Tree或SkipList
- SSTables-磁盘上的文件
现在考虑像cassandra
这样的数据库,它具有顺序写入,因此在更新memtable
时没有问题。然而,假设write
和read
同时到来,那么像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