Cassandra 介面

本頁面會比較 Apache Cassandra 和 Spanner 架構,並協助您瞭解 Spanner Cassandra 介面的功能和限制。本文假設您熟悉 Cassandra,並想遷移現有應用程式或設計新應用程式,同時使用 Spanner 做為資料庫。

Cassandra 和 Spanner 都是大規模分散式資料庫,專為需要高擴充性和低延遲的應用程式而建構。雖然這兩種資料庫都能支援要求嚴苛的 NoSQL 工作負載,但 Spanner 提供資料模型化、查詢和交易作業的進階功能。如要進一步瞭解 Spanner 如何符合 NoSQL 資料庫條件,請參閱「 適用於非關聯式工作負載的 Spanner」。

核心概念

本節會比較 Cassandra 和 Spanner 的重要概念。

術語

Cassandra Spanner
叢集 執行個體

Cassandra 叢集相當於 Spanner 執行個體,也就是伺服器和儲存空間資源的集合。由於 Spanner 是代管服務,因此您不必設定基礎硬體或軟體。您只需要指定要為執行個體保留的節點數量,或使用自動調度資源來自動調度執行個體。執行個體就像是資料庫的容器。您也可以在執行個體層級選擇資料複製拓撲 (單一區域、雙區域或多區域)。
鍵空間 資料庫

Cassandra 鍵空間相當於 Spanner 資料庫,也就是資料表和其他結構定義元素 (例如索引和角色) 的集合。與鍵空間不同,您不需要設定複製位置。Spanner 會自動將資料複製到執行個體中指定的區域。
Table 資料表

在 Cassandra 和 Spanner 中,資料表都是由資料列集合組成,並由資料表結構定義中指定的主鍵識別。
分區 分割

Cassandra 和 Spanner 都會透過資料分片來擴充。 在 Cassandra 中,每個分片稱為分區,而在 Spanner 中,每個分片稱為分割。Cassandra 使用雜湊分割,也就是說,系統會根據主鍵的雜湊,將每個資料列獨立指派給儲存節點。Spanner 會進行範圍分片,也就是說,在主鍵鍵空間中連續的資料列,在儲存空間中也會連續 (分割界線除外)。Spanner 會根據負載和儲存空間負責分割及合併,應用程式不會察覺到這項作業。主要影響是,與 Cassandra 不同,在 Spanner 中,對主鍵前置字串進行範圍掃描是有效率的作業。
Row 資料列

在 Cassandra 和 Spanner 中,資料列都是由主鍵唯一識別的資料欄集合。與 Cassandra 類似,Spanner 支援複合主鍵。與 Cassandra 不同,Spanner 不會區分分割區鍵和叢集資料欄,因為資料是範圍分片。您可以將 Spanner 視為只有叢集資料欄,分區則在幕後管理。
資料欄

在 Cassandra 和 Spanner 中,資料欄都是一組具有相同類型的資料值。資料表中的每一列都有一個值。如要進一步瞭解如何比較 Cassandra 資料欄類型與 Spanner,請參閱「資料類型」。

架構

Cassandra 叢集由一組伺服器和與這些伺服器共置的儲存空間組成。雜湊函式會將分區鍵空間中的資料列對應至虛擬節點 (vnode)。然後,系統會隨機指派一組 vnode 給每個伺服器,以服務部分叢集鍵空間。vnode 的儲存空間會在本機附加至服務節點。用戶端驅動程式會直接連線至服務節點,並處理負載平衡和查詢路徑。

Spanner 執行個體是由複寫拓撲中的一組伺服器組成。Spanner 會根據 CPU 和磁碟用量,將每個資料表動態分片為列範圍。系統會將分片指派給運算節點,以提供服務。資料實際儲存在 Google 的分散式檔案系統 Colossus 上,與運算節點分開。用戶端驅動程式會連線至 Spanner 的前端伺服器,執行要求轉送和負載平衡。詳情請參閱「Cloud Spanner 讀取和寫入的流程」白皮書。

從高階層面來看,這兩種架構都會隨著資源新增至基礎叢集而擴充。Spanner 的運算和儲存空間分離功能可讓運算節點之間的負載更快重新平衡,以因應工作負載變化。與 Cassandra 不同,分片移動不會涉及資料移動,因為資料會保留在 Colossus 上。此外,對於希望資料依分區鍵排序的應用程式而言,Spanner 的範圍式分割可能更自然。範圍式分區的缺點是,如果沒有考慮額外的結構定義設計,寫入鍵空間一端的工作負載 (例如以目前時間戳記為鍵的資料表) 可能會有熱點。如要進一步瞭解如何克服熱點,請參閱「結構定義設計最佳做法」。

一致性

使用 Cassandra 時,您必須為每個作業指定一致性層級。如果您使用仲裁一致性層級,多數副本節點必須回應協調器節點,作業才會視為成功。如果您使用一致性層級 1,Cassandra 只需要單一副本節點回應,作業就會視為成功。

Spanner 提供強式一致性。Spanner API 不會向用戶端公開副本。Spanner 用戶端與 Spanner 互動時,會將其視為單一機器資料庫。Spanner 一律會先將寫入作業寫入多數副本,再向使用者回報成功。後續的任何讀取作業都會反映新寫入的資料。應用程式可以選擇讀取過去某個時間點的資料庫快照,這可能比強讀取更有效能優勢。如要進一步瞭解 Spanner 的一致性屬性,請參閱「交易總覽」。

Spanner 的設計宗旨是支援大規模應用程式所需的同步一致性和可用性。Spanner 可大規模提供同步一致性,且效能卓越。對於需要此功能的用途,Spanner 支援快照 (過時) 讀取,可放寬新鮮度規定。

Cassandra 介面

透過 Cassandra 介面,您可以使用熟悉的 Cassandra 工具和語法,充分運用 Spanner 的全代管、可擴充且高可用性基礎架構。本頁說明 Cassandra 介面的功能和限制。

Cassandra 介面的優點

  • 可攜性:Cassandra 介面可存取各種 Spanner 功能,並使用與 Cassandra 相容的結構定義、查詢和用戶端。這項功能可簡化將以 Spanner 建構的應用程式遷移至其他 Cassandra 環境,或反向遷移的程序。這項可攜性提供部署彈性,並支援災難復原情境,例如壓力退出。
  • 熟悉度:如果您已使用 Cassandra,可以快速開始使用 Spanner,因為許多 CQL 陳述式和型別都相同。
  • 毫不妥協的 Spanner:由於 Cassandra 介面是以 Spanner 現有基礎架構為建構依據,因此提供 Spanner 現有的所有可用性、一致性和成本效益優勢,且不必在互補的 GoogleSQL 生態系統中,對任何可用功能做出妥協。

CQL 相容性

  • 支援 CQL 方言:Spanner 提供 CQL 方言的子集,包括資料查詢語言 (DQL)、資料操縱語言 (DML)、輕量型交易 (LWT)、匯總和日期時間函式。

  • 支援的 Cassandra 功能:Cassandra 介面支援許多最常用的 Cassandra 功能。包括結構定義和型別系統的核心部分、許多常見的查詢形狀、各種函式和運算子,以及 Cassandra 系統目錄的重要層面。應用程式可透過 Spanner 實作的 Cassandra 連線通訊協定,使用許多 Cassandra 用戶端或驅動程式。

  • 用戶端和連線通訊協定支援:Spanner 支援Cassandra 連線通訊協定 v4 的核心查詢功能,並使用 Cassandra Adapter (一種與應用程式並行執行的輕量型用戶端)。這項功能可讓許多 Cassandra 用戶端直接使用 Spanner Cassandra 介面資料庫,同時運用 Spanner 的全域端點和連線管理,以及 IAM 驗證。

支援的 Cassandra 資料類型

下表列出支援的 Cassandra 資料類型,並將每個資料類型對應至等效的 Spanner GoogleSQL 資料類型。

支援的 Cassandra 資料類型 Spanner GoogleSQL 資料類型
數值類型 tinyint (8 位元帶正負號的整數) INT64 (64 位元帶正負號整數)

Spanner 支援單一 64 位元寬度的帶正負號整數資料型別。

smallint (16 位元帶正負號的整數)
int (32 位元帶正負號整數)
bigint (64 位元帶正負號整數)
float (32 位元 IEEE-754 浮點) FLOAT32 (32 位元 IEEE-754 浮點)
double (64 位元 IEEE-754 浮點數) FLOAT64 (64 位元 IEEE-754 浮點數)
decimal 如要使用固定精確度的十進位數字,請使用 NUMERIC 資料類型 (精確度 38,小數位數 9)。
varint (可變精確度整數)
字串類型 text STRING(MAX)

textvarchar 都會儲存及驗證 UTF-8 字串。在 Spanner 中,STRING 資料欄需要指定最大長度。這項變更不會影響儲存空間,僅用於驗證。

varchar
ascii STRING(MAX)
uuid STRING(MAX)
inet STRING(MAX)
blob BYTES(MAX)

如要儲存二進位資料,請使用 BYTES 資料型別。

日期和時間類型 date DATE
time INT64

Spanner 不支援專屬的時間資料類型。使用 INT64 儲存奈秒時間長度。

timestamp TIMESTAMP
timeuuid STRING(MAX)
容器類型 set ARRAY

Spanner 不支援專用的 set 資料類型。使用 ARRAY 欄代表 set

list ARRAY

使用 ARRAY 儲存型別物件清單。

map JSON

Spanner 不支援專用地圖類型。使用 JSON 欄代表地圖。

其他類型 boolean BOOL
counter INT64

資料類型註解

您可以使用 cassandra_type 資料欄選項,定義 Cassandra 和 Spanner 資料類型之間的對應。在 Spanner 中建立資料表時,如果打算使用與 Cassandra 相容的查詢與資料表互動,可以透過 cassandra_type 選項,為每個資料欄指定對應的 Cassandra 資料型別。Spanner 接著會使用這個對應,在兩個資料庫系統之間轉移資料時,正確解讀及轉換資料。

舉例來說,如果 Cassandra 中有結構定義如下的資料表:

CREATE TABLE Albums (
  albumId uuid,
  title varchar,
  artists set<varchar>,
  tags  map<varchar, varchar>,
  numberOfSongs tinyint,
  releaseDate date,
  copiesSold bigint,
  ....
  PRIMARY KEY(albumId)
)

在 Spanner 中,您可以使用型別註解對應至 Cassandra 資料型別,如下所示:

CREATE TABLE Albums (
  albumId       STRING(MAX) OPTIONS (cassandra_type = 'uuid'),
  title         STRING(MAX) OPTIONS (cassandra_type = 'varchar'),
  artists       ARRAY<STRING(max)> OPTIONS (cassandra_type = 'set<varchar>'),
  tags          JSON OPTIONS (cassandra_type = 'map<varchar, varchar>'),
  numberOfSongs INT64 OPTIONS (cassandra_type = 'tinyint'),
  releaseDate   DATE OPTIONS (cassandra_type = 'date'),
  copiesSold    INT64 OPTIONS (cassandra_type = 'bigint')
  ...
) PRIMARY KEY (albumId);

在上一個範例中,OPTIONS 子句會將資料欄的 Spanner 資料類型對應至對應的 Cassandra 資料類型。

  • albumId (Spanner STRING(MAX)) 會對應至 Cassandra 中的 uuid
  • title (Spanner STRING(MAX)) 會對應至 Cassandra 中的 varchar
  • artists (Spanner ARRAY<STRING(MAX)>) 會對應至 Cassandra 中的 set<varchar>
  • tags (Spanner JSON) 會對應至 Cassandra 中的 map<varchar,varchar>
  • numberOfSongs (Spanner INT64) 會對應至 Cassandra 中的 tinyint
  • releaseDate (Spanner DATE) 會對應至 Cassandra 中的 date
  • copiesSold (Spanner INT64) 會對應至 Cassandra 中的 bigint
修改 cassandra_type 選項

您可以使用 ALTER TABLE 陳述式,在現有資料欄中新增或修改 cassandra_type 選項。

如要將 cassandra_type 選項新增至尚未提供該選項的資料欄,請使用下列陳述式:

ALTER TABLE Albums ALTER COLUMN uuid SET OPTIONS (cassandra_type='uuid');

在本例中,Albums 資料表的 uuid 欄會更新為 cassandra_type 選項,並設為 uuid

如要修改現有的 cassandra_type 選項,請使用 ALTER TABLE 陳述式搭配新的 cassandra_type 值。舉例來說,如要將 Albums 資料表中 numberOfSongs 資料欄的 cassandra_type 變更為 bigint,請使用下列陳述式:tinyint

ALTER TABLE Albums ALTER COLUMN numberOfSongs SET OPTIONS (cassandra_type='bigint');

您只能修改下列類型:

寄件者 收件者
tinyint smallint、int、bigint
smallint int、bigint
整數 bigint
浮點數 雙精度值
文字 varchar
ascii varchar、text
直接且細緻的對應關係

在許多情況下,Spanner 和 Cassandra 資料類型之間的對應關係很簡單。舉例來說,Spanner STRING(MAX) 會對應至 Cassandra varchar,而 Spanner INT64 會對應至 Cassandra bigint

不過,在某些情況下,對應需要更多考量和調整。舉例來說,您可能需要將 Cassandra smallint對應至 Spanner INT64

支援的 Cassandra 函式

本節列出 Spanner 支援的 Cassandra 函式。

下表列出 Spanner 支援的 Cassandra 函式。

Spanner 不支援的 Cassandra 功能

請務必瞭解 Cassandra 介面會透過與 Cassandra 相容的結構定義、型別、查詢和用戶端,提供 Spanner 的功能。這項服務不支援所有 Cassandra 功能。即使使用 Cassandra 介面,將現有 Cassandra 應用程式遷移至 Spanner 時,可能也需要進行一些重工,以因應不支援的 Cassandra 功能或行為差異,例如查詢最佳化或主鍵設計。不過,遷移完成後,工作負載就能享有 Spanner 的可靠性,以及獨特的多模態功能。

以下列出不支援的 Cassandra 功能,並提供更多資訊:

  • 不支援部分 CQL 語言功能:使用者定義型別和函式、TTL、寫入時間戳記。
  • Spanner 和 Google Cloud 控制平面:具有 Cassandra 介面的資料庫會使用 Spanner 和 Google Cloud工具,佈建、保護、監控及最佳化執行個體。Spanner 不支援 nodetool 等工具,因此無法執行管理活動。

DDL 支援

使用 Cassandra 介面時,系統不會直接支援 CQL DDL 陳述式。如要變更 DDL,請使用 Spanner Google Cloud 主控台、gcloud 指令或用戶端程式庫。

連線能力

  • Cassandra 用戶端支援

    您可以透過各種用戶端連線至 Spanner 資料庫:

採用 Identity and Access Management 控管存取權

您必須具備 spanner.databases.adaptspanner.databases.selectspanner.databases.write 權限,才能對 Cassandra 端點執行讀取和寫入作業。詳情請參閱 IAM 總覽

如要進一步瞭解如何授予 Spanner IAM 權限,請參閱「套用 IAM 角色」。

監控

Spanner 提供下列指標,協助您監控 Cassandra 介面卡:

  • spanner.googleapis.com/api/adapter_request_count:擷取並公開 Spanner 每秒執行的介面卡要求數量,或 Spanner 伺服器每秒發生的錯誤數量。
  • spanner.googleapis.com/api/adapter_request_latencies:擷取並公開 Spanner 處理介面卡要求所花費的時間。

您可以建立自訂 Cloud Monitoring 資訊主頁,顯示及監控 Cassandra 介面的指標。自訂資訊主頁包含下列圖表:

  • 第 99 個百分位數的要求延遲時間:資料庫每個 message_type 的伺服器要求延遲時間分布情形,以第 99 個百分位數表示。

  • 第 50 個百分位數的要求延遲時間:資料庫每個 message_type 的伺服器要求延遲時間分布情形,以第 50 個百分位數表示。

  • 依訊息類型劃分的 API 要求次數:資料庫的每項 message_type API 要求次數。

  • 依作業類型劃分的 API 要求次數:資料庫的每個 op_type API 要求次數。

  • 錯誤率:資料庫的 API 錯誤率。

Google Cloud 控制台

  1. 下載 cassandra-adapter-dashboard.json 檔案。這個檔案包含在「監控」中填入自訂資訊主頁所需的資訊。
  2. 在 Google Cloud 控制台中,前往「Dashboards」(資訊主頁) 頁面:

    前往「Dashboards」(資訊主頁)

    如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果

  3. 在「資訊主頁總覽」頁面中,按一下「建立自訂資訊主頁」
  4. 在資訊主頁工具列中,按一下「資訊主頁設定」圖示。然後選取「JSON」,接著選取「JSON 編輯器」
  5. 在「JSON 編輯器」窗格中,複製您下載的 cassandra-adapter-dashboard.json 檔案內容,然後貼到編輯器中。
  6. 如要將變更套用至資訊主頁,請按一下「套用變更」。如不想使用這個資訊主頁,請返回「資訊主頁總覽」頁面。
  7. 建立資訊主頁後,按一下「新增篩選器」。然後選取 project_idinstance_id,監控 Cassandra 介面卡。

gcloud CLI

  1. 下載 cassandra-adapter-dashboard.json 檔案。這個檔案包含在「監控」中填入自訂資訊主頁所需的資訊。
  2. 如要在專案中建立資訊主頁,請使用 gcloud monitoring dashboards create 指令:

    gcloud monitoring dashboards create --config-from-file=cassandra-adapter-dashboard.json
    

    詳情請參閱 gcloud monitoring dashboards create 參考資料。

此外,下列 Spanner 指標有助於監控介面卡:

如需系統洞察的完整清單,請參閱「使用系統洞察監控執行個體」。如要進一步瞭解如何監控 Spanner 資源,請參閱「使用 Cloud Monitoring 監控執行個體」。

定價

使用 Cassandra 端點不會產生額外費用,系統會根據執行個體使用的運算資源量,以及資料庫使用的儲存空間量,向您收取標準 Spanner 費用。

詳情請參閱「Spanner 定價」。

後續步驟