概覽
與前面提到的 RDBMS ACID 模型相反,NoSQL 的一致性模型被稱為 BASE。
事務中的 ACID
- Atomic (原子性)
- 任務在執行過程中不會中斷。如果中斷,必須回溯到之前的狀態。
- Consistency (一致性)
- 事務成功時,所有數據必須始終保持一致。如果設有完整性約束,違反該約束的事務將被取消。
- Isolation (隔離性)
- 事務執行過程中,其他事務無法介入。
- Durability (持久性)
- 成功的事務必須永久反映在系統中,即使系統發生故障也是如此。
BASE
- BA (Basic Availability,基本可用性)
- 資料庫在大部分時間都能正常運作。
- Soft-state (軟狀態)
- 存儲不需要寫入一致性,不同的副本也不需要隨時保持相互一致。
- Eventual consistency (最終一致性)
- 存儲最終會在未來的某個時間點達到一致。
記住上述特性,讓我們來探討以下幾種 NoSQL 資料庫。
NoSQL 資料庫
Redis (Remote Dictionary Server)
- 開源 (Open source)
- 記憶體內資料結構存儲 (In-memory data structure store)
- NoSQL/快取解決方案 (也可用作資料庫)
- 支援快照 (RDB) / AOF (Append on file) 備份
- RDB:快照整個 Redis 數據 (SAVE, BGSAVE)
- 優點:
快速。以直接載入快照的形式運作,重啟速度快。 - 缺點:
遺失。快照時間點之後的數據可能會遺失。
- 優點:
- AOF:記錄所有寫入/更新操作的日誌
- 優點:
無損 (Lossless)。記錄直到設備關閉前的所有操作,不會有數據遺失。 - 缺點:
慢。因為記錄所有寫入/更新操作,所需空間比 RDB 大,且重啟時需重新執行所有記錄的操作,因此較慢。
- 優點:
- Hybrid (混合模式,推薦):建議將兩者結合使用。
- RDB + AOF:快照 + 快照後的 AOF 增量。
- RDB:快照整個 Redis 數據 (SAVE, BGSAVE)
- Pub/Sub 模型
- 同時支援 1:1 隊列與 1:N 訊息傳遞形式。
- 可以針對單一主題接收多個訊息。
- 例如:music.jazz, music.classic > music 主題 -> jazz, classic
memcached (非 NoSQL)
- 開源 (Open source)
- 分散式記憶體快取系統 (Distributed memory caching system)
- (注意) 如果記憶體空間不足,Memcached 會使用 LRU 演算法 (Least Recently Used) 刪除舊數據並重複使用記憶體。
Cassandra
Apache Cassandra 是一款可大規模擴展的分散式 NoSQL 資料庫,起源於 Facebook 內部並作為開源項目發布。 其特點是使用 P2P 協議 (Gossip),每秒與集群內最多 3 個節點交換狀態訊息。藉此,所有節點都能快速學習集群內的其他節點。需要注意的是,使用多個數據中心集群時,為了容錯能力,建議每個數據中心指定兩個以上的種子節點 (seed nodes)。
- 分散化:即使在物理上分離的數據中心之間,也能運行單一的 Cassandra 集群。
- 非中心化:所有節點完全相同。
- 擴展性:可在不中斷集群服務的情況下進行擴容或縮容。
- 高興能:旨在充分利用多處理器/多核心機器,並在安裝於多個數據中心的數百台機器之間運行。
- Row (列) 導向
- Cassandra 並非關係型結構,而是使用稀疏多維哈希表 (sparse multidimensional hash table) 來表示結構。
- 「稀疏」意味著一行可以擁有一或多個欄位,但不需要每一行都擁有與其他行完全相同的欄位。
- 使用企業
- Twitter:用於分析用途
- Facebook:用於收件箱搜尋
- Reddit:作為持久性快取使用
- Ooyala:用於近乎實時的影片分析數據服務與存儲
- 缺點
- 不支援 Join 或 Transaction
- 難以實現像 RDBMS 那樣的分頁 (Paging),若過度創建 Keyspace 或 Table 可能導致記憶體溢出 (Memory Overflow)
此外,Cassandra 集群的設置與配置比 HBase 集群簡單得多。Cassandra 通常在寫入時表現出 5 倍以上的性能,在讀取時表現出 4 倍以上的性能。
思考點
大多數 NoSQL 都是為了處理大數據量而設計的。因此,它們通常無法完美支援 RDBMS 所保證的一致性 (Consistency)。為了效能,這通常被視為一種權衡 (trade-off) 設置。