常用 NoSQL 比較

Inshua發表於2024-10-09

Q: 請根據 CAP 實現程度,分散式實現方式,資料結構,查詢方式,儲存引擎等比較 mongodb, redis, cassandra, scylladb, dragonflydb, TiKV, couchbase 等 nosql 資料庫

A: 對比 NoSQL 資料庫時,可以根據以下幾個關鍵維度來分析:CAP 理論實現分散式架構資料結構查詢方式儲存引擎等。下面將對 MongoDBRedisCassandraScyllaDBDragonflyDBTiKV、和 Couchbase 進行逐項比較。

1. CAP 理論實現(Consistency, Availability, Partition Tolerance)

  • MongoDB: 作為 CP 系統(優先一致性和分割槽容忍性),預設配置下提供強一致性。透過副本集實現高可用性,犧牲部分可用性來實現一致性,但可以透過讀寫策略配置接近 AP 模型(透過允許從次要節點讀取以提高可用性)。
  • Redis: 在主從模式下更偏向於 AP 模型(優先可用性和分割槽容忍性),但在主從切換期間可能會導致一致性問題。如果配置為使用 Redis Sentinel 或 Redis Cluster,它可以在一定程度上實現可用性和容忍分割槽,但一致性較弱。
  • Cassandra: 作為 AP 系統,強調可用性和分割槽容忍性。它使用可調一致性級別(如 Quorum、One 等)來在可用性和一致性之間做權衡。
  • ScyllaDB: 也遵循 AP 模型,是 Cassandra 的高效能實現,因此在 CAP 特性上與 Cassandra 類似,強調高可用性和可擴充套件性。
  • DragonflyDB: 類似 Redis,偏向 AP 模型,注重高效能和可用性。主要用於快取和實時處理,不保證強一致性。
  • TiKV: 作為 CP 系統,TiKV 保證強一致性和分割槽容忍性,透過 Raft 協議實現分散式一致性。可用性可能會在網路分割槽時受到影響。
  • Couchbase: 提供靈活的 CAP 選擇,允許根據使用場景選擇 CP 或 AP 模型。通常,Couchbase 透過副本與分片來實現分割槽容忍性,同時提供可調的強一致性或最終一致性。

2. 分散式實現方式

  • MongoDB: 採用副本集(Replica Set)和分片(Sharding)機制進行資料分佈。副本集用於實現高可用性,分片用於橫向擴充套件和大規模資料的分散式儲存。
  • Redis: Redis 支援主從複製(Replication)和Redis Cluster(分散式模式)。Redis Cluster 透過分片機制在多個節點之間分佈資料。
  • Cassandra: Cassandra 使用對等節點架構(Peer-to-Peer),每個節點都相同,無主節點。資料透過一致性雜湊進行分佈和複製。
  • ScyllaDB: 繼承了 Cassandra 的對等架構,同時透過改進 I/O 並行性,基於 C++ 實現,專注於更高效能和更低的延遲。
  • DragonflyDB: 基於類似 Redis 的設計,支援主從模式,但目前還沒有成熟的多節點分散式架構。主要用於快取場景。
  • TiKV: 基於Raft 協議的分散式事務系統,支援強一致性。TiKV 是 TiDB 的底層儲存,透過Region(分片)進行資料分佈,並使用多副本來保證高可用性。
  • Couchbase: 採用分散式架構,透過分片和副本來實現擴充套件性和高可用性。它的一致性協議基於 DCP(Database Change Protocol),用於分散式同步。

3. 資料結構

  • MongoDB: 使用文件模型儲存資料,基於 JSON/BSON 格式。每條記錄是一個文件,支援巢狀文件和陣列,靈活的結構化和非結構化資料。
  • Redis: Redis 是基於記憶體的資料儲存,支援多種資料型別,包括字串雜湊列表集合有序集合等,非常適合快取和實時資料處理。
  • Cassandra: 基於列族儲存模型(類似於鍵值對),適合處理大規模、稀疏資料。資料儲存為列族和行,適合寫多讀少的應用場景。
  • ScyllaDB: 與 Cassandra 相同的列族模型,但使用更加高效的底層實現。
  • DragonflyDB: 類似 Redis,支援多種資料結構,如字串、雜湊、列表、集合和有序集合等,專注於記憶體中處理高效快取。
  • TiKV: 使用鍵值對儲存模型,支援多種複雜的資料結構,透過與 TiDB 配合使用,支援 SQL 和事務模型。
  • Couchbase: 使用文件儲存模型,類似於 MongoDB,基於 JSON 文件,支援巢狀結構和陣列。

4. 查詢方式

  • MongoDB: 提供強大的查詢語言,支援基於欄位的條件查詢、索引查詢、聚合查詢等。支援豐富的運算子和管道操作。
  • Redis: 透過命令列介面(CLI)或程式設計介面對其資料結構進行直接操作,查詢能力較為簡單,適合鍵值對操作和簡單的集合、雜湊等查詢。
  • Cassandra: 支援 CQL(Cassandra Query Language),類似於 SQL 的查詢語言,但查詢能力相對受限,主要適合範圍查詢和批次資料寫入。
  • ScyllaDB: 完全相容 Cassandra 的 CQL 查詢語言,但由於底層改進,查詢效能更高。
  • DragonflyDB: 類似於 Redis,透過命令列介面進行資料查詢和操作,支援多種資料結構的操作,主要用於快取場景。
  • TiKV: 本身不提供直接查詢介面,通常與 TiDB 配合使用,TiDB 提供 SQL 查詢能力。TiKV 透過鍵值介面運算元據。
  • Couchbase: 支援 N1QL(一種基於 SQL 的查詢語言),適用於 JSON 文件的查詢,支援索引、聚合和全文檢索。

5. 儲存引擎

  • MongoDB: 使用WiredTiger 作為預設的儲存引擎,支援壓縮和加密,能夠高效地處理讀寫操作。MongoDB 也可以使用其他儲存引擎,如 MMAPv1(已棄用)。
  • Redis: Redis 是基於記憶體的資料庫,資料主要儲存在記憶體中,並透過快照(RDB)或追加檔案(AOF)來持久化到磁碟。
  • Cassandra: 使用基於磁碟的儲存引擎,採用SSTableLSM Tree(Log-Structured Merge Tree)來最佳化寫效能和磁碟 I/O。
  • ScyllaDB: 同樣使用 LSM Tree 儲存引擎,但透過對現代硬體的最佳化(如直接 I/O 和非同步執行緒管理),提升了效能和延遲。
  • DragonflyDB: 類似 Redis,基於記憶體,但專注於高效的多執行緒設計和快取場景。
  • TiKV: 使用基於 RocksDB 的儲存引擎,適合高併發的寫入場景,支援事務處理。
  • Couchbase: Couchbase 採用了基於記憶體和磁碟的混合儲存引擎,支援對記憶體資料進行高效的查詢,並定期將資料持久化到磁碟。

總結對比表:

資料庫 CAP 實現 分散式架構 資料結構 查詢方式 儲存引擎
MongoDB CP(預設) 副本集+分片 文件模型 強大的查詢語言 WiredTiger
Redis AP 主從複製+叢集 多種資料結構 命令列介面 記憶體儲存,RDB/AOF
Cassandra AP 對等架構 列族模型 CQL LSM Tree/SSTable
ScyllaDB AP 對等架構 列族模型 CQL LSM Tree(高效能)
DragonflyDB AP 主從複製 多種資料結構 命令列介面 記憶體儲存
TiKV CP Raft 分散式架構 鍵值對 與 TiDB 配合 RocksDB

Q: 請在上表繼續新增 cockroachdb,garnet,apache ignite, apache kvrocks

A: 以下是包含 CockroachDBGarnetApache IgniteApache Kvrocks 的更新對比表,繼續沿用 CAP 實現分散式架構資料結構查詢方式儲存引擎 維度。

資料庫 CAP 實現 分散式架構 資料結構 查詢方式 儲存引擎
MongoDB CP(預設) 副本集+分片 文件模型 強大的查詢語言 WiredTiger
Redis AP 主從複製+叢集 多種資料結構 命令列介面 記憶體儲存,RDB/AOF
Cassandra AP 對等架構 列族模型 CQL LSM Tree/SSTable
ScyllaDB AP 對等架構 列族模型 CQL LSM Tree(高效能)
DragonflyDB AP 主從複製 多種資料結構 命令列介面 記憶體儲存
TiKV CP Raft 分散式架構 鍵值對 與 TiDB 配合 RocksDB
Couchbase CP/AP 可選 分片+副本 文件模型 N1QL,支援 SQL 基於記憶體和磁碟
CockroachDB CP 基於 Raft 的對等架構 行儲存模型 類 SQL 查詢(SQL 相容) Pebble 儲存引擎(基於 RocksDB)
Garnet CP/AP 可選 分散式架構 多種資料結構 命令列介面 記憶體+持久化儲存
Apache Ignite CP/AP 可選 分散式+記憶體計算 鍵值對/SQL 支援 SQL、Cassandra 風格查詢 記憶體優先,持久化到磁碟
Apache Kvrocks AP 主從複製+叢集 多種資料結構 Redis 風格命令 基於 RocksDB

6. CockroachDB

  • CAP 實現: 強調一致性和分割槽容忍性(CP),透過 Raft 協議實現分散式一致性和事務性。
  • 分散式架構: 使用對等架構,基於 Raft 的複製來保證強一致性和高可用性。各節點對等,透過自動分片和副本管理進行橫向擴充套件。
  • 資料結構: 類似於關係型資料庫,採用行儲存模型,支援 ACID 事務。
  • 查詢方式: 完全支援 SQL,相容 PostgreSQL 查詢語法,適合關係型查詢和複雜事務操作。
  • 儲存引擎: 使用 CockroachDB 自己的Pebble 儲存引擎,基於 RocksDB,專為高效能的分散式事務設計。

7. Garnet

  • CAP 實現: 提供 CP 和 AP 模型之間的靈活選擇,可以根據應用場景調整一致性和可用性。
  • 分散式架構: 透過副本和分片機制實現分散式儲存,支援自動擴充套件和高可用性。
  • 資料結構: 支援多種資料結構(如鍵值對、雜湊、列表等),類似於 Redis 和 DragonflyDB。
  • 查詢方式: 透過命令列介面進行資料操作,適合快取和實時資料處理場景。
  • 儲存引擎: 結合記憶體和持久化儲存,適合高併發場景下的資料儲存與查詢。

8. Apache Ignite

  • CAP 實現: 提供可配置的 CAP 實現,允許使用者選擇強一致性(CP)或高可用性(AP),視需求而定。
  • 分散式架構: 基於記憶體的分散式架構,支援橫向擴充套件和高效能運算,透過複製和分片實現資料分佈和高可用性。
  • 資料結構: 支援鍵值對SQL 結構化資料,支援複雜的記憶體計算和大資料處理,相容 HDFS、Cassandra 風格的儲存。
  • 查詢方式: 提供 SQL 支援,也支援類似 Cassandra 風格的查詢,適合大規模資料計算和實時分析。
  • 儲存引擎: 以記憶體優先(In-Memory Computing),但支援將資料持久化到磁碟以確保資料安全性。

9. Apache Kvrocks

  • CAP 實現: 偏向 AP 模型,專注於高可用性和分割槽容忍性。
  • 分散式架構: 支援主從複製叢集模式,類似 Redis 的分片機制。
  • 資料結構: 支援多種資料結構,類似於 Redis,包括字串雜湊列表集合等。
  • 查詢方式: 使用與 Redis 類似的命令列介面,支援 Redis 風格的查詢和資料操作。
  • 儲存引擎: 基於 RocksDB 儲存引擎,提供持久化支援,與 Redis 相比更注重資料的持久化和高併發寫入效能。

以下是更新後的 NoSQL 資料庫對比表,增加了“事務支援程度”列,對各個資料庫的事務支援做了詳細說明。

資料庫 CAP 實現 分散式架構 資料結構 查詢方式 儲存引擎 事務支援程度
MongoDB CP(預設) 副本集+分片 文件模型 強大的查詢語言 WiredTiger 支援多文件 ACID 事務,在 4.0 及以上版本中支援多文件事務
Redis AP 主從複製+叢集 多種資料結構 命令列介面 記憶體儲存,RDB/AOF 不支援分散式事務,支援單例項內的 Lua 指令碼作為事務的替代
Cassandra AP 對等架構 列族模型 CQL LSM Tree/SSTable 支援輕量級事務(LWT),提供有限的事務支援(行級別的事務)
ScyllaDB AP 對等架構 列族模型 CQL LSM Tree(高效能) 支援輕量級事務,與 Cassandra 類似,行級事務支援有限
DragonflyDB AP 主從複製 多種資料結構 命令列介面 記憶體儲存 不支援事務,專注於高效的快取場景
TiKV CP Raft 分散式架構 鍵值對 與 TiDB 配合 RocksDB 支援分散式 ACID 事務,透過 TiDB 提供完整的分散式事務支援
Couchbase CP/AP 可選 分片+副本 文件模型 N1QL,支援 SQL 基於記憶體和磁碟 支援 ACID 事務,但主要用於單節點或副本之間,分散式事務支援較弱
CockroachDB CP 基於 Raft 的對等架構 行儲存模型 類 SQL 查詢(SQL 相容) Pebble 儲存引擎(基於 RocksDB) 支援強一致性的分散式 ACID 事務,完全支援分散式事務
Garnet CP/AP 可選 分散式架構 多種資料結構 命令列介面 記憶體+持久化儲存 支援簡單事務,但事務模型相對簡單,主要針對記憶體中的資料
Apache Ignite CP/AP 可選 分散式+記憶體計算 鍵值對/SQL 支援 SQL、Cassandra 風格查詢 記憶體優先,持久化到磁碟 支援分散式事務,提供 ACID 事務支援,適用於記憶體計算和資料一致性
Apache Kvrocks AP 主從複製+叢集 多種資料結構 Redis 風格命令 基於 RocksDB 不支援分散式事務,專注於持久化和高併發操作

事務支援程度總結:

  • 支援分散式 ACID 事務:

    • TiKV(透過 TiDB)
    • CockroachDB
    • Apache Ignite
  • 支援輕量級事務(LWT)或行級事務:

    • Cassandra
    • ScyllaDB
  • 支援單節點 ACID 事務或簡單事務:

    • MongoDB(多文件事務支援)
    • Couchbase
    • Garnet
  • 不支援事務或支援極為有限:

    • Redis(單例項 Lua 指令碼模擬事務)
    • DragonflyDB
    • Apache Kvrocks

結論:

資料庫對事務的支援差異較大,像 CockroachDBTiKV 專門設計用於支援強一致性的分散式事務,而 CassandraScyllaDB 則透過輕量級事務提供有限的事務支援。類似 RedisDragonflyDB 的快取資料庫則沒有事務支援或僅在單節點上提供簡單的替代方案。

相關文章