4.1 說明

Apache Cassandra是一種分佈式數據庫管理系統,屬於 NoSQL 系統類別,旨在為以哈希形式呈現的龐大數據陣列創建高度可擴展且可靠的存儲。

最初,該項目是在 Facebook 內部開發的,並於 2009 年轉移到 Apache 軟件基金會的旗下,該組織繼續開發該項目。部署基於 Cassandra 的工業解決方案,為 Cisco、IBM、Cloudkick、Reddit、Digg、Rackspace、華為、Netflix、Apple、Instagram、GitHub、Twitter 和 Spotify 等公司提供服務。到 2011 年,為 Cassandra 下的單個數據庫提供服務的最大服務器集群擁有 400 多台機器並包含超過 300 TB 的數據。

它使用Java 語言編寫,實現了類似於 DynamoDB 的分佈式哈希系統,隨著數據量的增加提供幾乎線性的可擴展性。它使用基於列族的數據存儲模型,這與 MemcacheDB 等系統的不同之處在於,它能夠存儲具有多層嵌套的哈希值,後者僅將數據存儲在鍵值對中。

屬於容錯型DBMS的範疇:放在數據庫中的數據自動複製到分佈式網絡的幾個節點甚至均勻分佈在幾個數據中心。當一個節點發生故障時,它的功能會被其他節點即時獲取,向集群添加新節點和更新 Cassandra 版本都是即時完成的,無需額外的手動干預和其他節點的重新配置。

但是,強烈建議為每個節點(包括現有節點)重新生成密鑰(標籤),以保持負載平衡的質量。在節點數量成倍增加(2倍、3倍等)的情況下,可以避免為現有節點生成密鑰。

4.2 數據模型

在 Cassandra 術語中,應用程序使用鍵空間,這對應於關係模型中數據庫模式的概念。這個鍵空間可以包含若干個列族(column family),對應關係表的概念。

反過來,列族又包含列(column),這些列使用記錄(row)中的鍵(row key)進行組合。列由三部分組成:名稱(column name)、時間戳(timestamp)和值(value)。記錄中的列是有序的。與關係數據庫不同,記錄(就數據庫而言,這些是行)是否包含與其他記錄中名稱相同的列沒有限制 - 沒有。

列族可以有多種,但在本文中我們將省略這個細節。同樣在最新版本的 Cassandra 中,可以使用 CQL 語言執行定義和更改數據(DDL、DML)的查詢,以及創建二級索引。

cassandra中存儲的具體值標識為:

  • 鍵空間是對應用程序(域)的綁定。允許您在同一集群上託管來自不同應用程序的數據;
  • 列族是對查詢的綁定;
  • key是對集群節點的綁定。鍵確定保存的列將在哪些節點上結束;
  • 列名是對記錄中屬性的綁定。允許您在一個條目中存儲多個值。

每個值都與一個時間戳相關聯,這是一個用戶指定的數字,用於解決記錄期間的衝突:數字越大,將考慮較新的列,並且在比較時會覆蓋舊列。

4.3 數據類型

按數據類型:鍵空間和列族是字符串(名稱);timestamp 是一個 64 位數字;鍵、列名和列值是一個字節數組。Cassandra 也有數據類型的概念。這些類型可以由開發人員在創建列族時指定(可選)。

對於列名,這稱為比較器,對於值和鍵,它稱為驗證器。第一個定義了列名允許的字節值以及如何對它們進行排序。二是什麼字節值對列和鍵值有效。

如果未設置這些數據類型,則 cassandra 會存儲這些值並將它們作為字節字符串 (BytesType) 進行比較,因為實際上,它們是在內部存儲的。

數據類型是:

  • BytesType:任何字節字符串(無驗證)
  • AsciiType : ASCII 字符串
  • UTF8Type : UTF-8 字符串
  • IntegerType : 任意大小的數字
  • Int32Type : 4 字節數字
  • LongType : 8字節數字
  • UUIDType:UUID 類型 1 或 4
  • TimeUUIDType:類型 1 UUID
  • DateType : 8 字節時間戳值
  • BooleanType:兩個值:true = 1 或 false = 0
  • FloatType : 4字節浮點數
  • DoubleType : 8字節浮點數
  • DecimalType:具有任意大小和浮點數的數字
  • CounterColumnType : 8 字節計數器

在cassandra中,所有的數據寫入操作始終都是重寫操作,即如果列族中已經存在一個具有相同key和name的列,並且時間戳大於保存的,則該值被覆蓋. 記錄的值永遠不會改變,只是更新的列帶有新的值。

寫入 cassandra 比讀取更快。這改變了設計中採用的方法。如果我們從設計數據模型的角度考慮 cassandra,那麼更容易將列族想像成一個物化視圖,而不是一個表 - 一種表示某些複雜查詢數據的結構,但將其存儲在磁盤。

與其嘗試使用查詢以某種方式組合數據,不如嘗試將此查詢可能需要的所有內容存儲在目標系列中。也就是說,有必要不從實體之間的關係或對象之間的關係方面來處理,而是從查詢方面來處理:需要選擇哪些字段;記錄應該按什麼順序排列;應該一起請求與主要數據相關的哪些數據——所有這些都應該已經存儲在列族中。

一條記錄的列數理論上限制為 20 億。這是一個簡短的題外話,更多細節可以在設計和優化技術一文中找到。現在讓我們深入研究將數據保存到 cassandra 並讀取它的過程。