本頁面會比較 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)
|
varchar |
||
ascii |
STRING(MAX) |
|
uuid |
STRING(MAX) |
|
inet |
STRING(MAX) |
|
blob |
BYTES(MAX)
如要儲存二進位資料,請使用 |
|
日期和時間類型 | date |
DATE |
time |
INT64
Spanner 不支援專屬的時間資料類型。使用
|
|
timestamp |
TIMESTAMP |
|
timeuuid |
STRING(MAX) |
|
容器類型 | set |
ARRAY
Spanner 不支援專用的 |
list |
ARRAY
使用 |
|
map |
JSON
Spanner 不支援專用地圖類型。使用 |
|
其他類型 | 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
(SpannerSTRING(MAX)
) 會對應至 Cassandra 中的uuid
。title
(SpannerSTRING(MAX)
) 會對應至 Cassandra 中的varchar
。artists
(SpannerARRAY<STRING(MAX)>
) 會對應至 Cassandra 中的set<varchar>
。tags
(SpannerJSON
) 會對應至 Cassandra 中的map<varchar,varchar>
。numberOfSongs
(SpannerINT64
) 會對應至 Cassandra 中的tinyint
。releaseDate
(SpannerDATE
) 會對應至 Cassandra 中的date
。copiesSold
(SpannerINT64
) 會對應至 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 資料庫:
- Cassandra 介面卡可用於程序內輔助程式,或做為 Sidecar Proxy,將 Cassandra 應用程式連線至 Cassandra 介面。詳情請參閱「使用 Cassandra 介面卡連線至 Spanner」。
- Cassandra 介面卡可做為本機的獨立程序啟動,並使用
CQLSH
連線。詳情請參閱「將 Cassandra 介面卡連線至應用程式」。
採用 Identity and Access Management 控管存取權
您必須具備 spanner.databases.adapt
、spanner.databases.select
和 spanner.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 控制台
- 下載
cassandra-adapter-dashboard.json
檔案。這個檔案包含在「監控」中填入自訂資訊主頁所需的資訊。 -
在 Google Cloud 控制台中,前往「Dashboards」(資訊主頁)
頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果。
- 在「資訊主頁總覽」頁面中,按一下「建立自訂資訊主頁」。
- 在資訊主頁工具列中,按一下「資訊主頁設定」圖示。然後選取「JSON」,接著選取「JSON 編輯器」。
- 在「JSON 編輯器」窗格中,複製您下載的
cassandra-adapter-dashboard.json
檔案內容,然後貼到編輯器中。 - 如要將變更套用至資訊主頁,請按一下「套用變更」。如不想使用這個資訊主頁,請返回「資訊主頁總覽」頁面。
- 建立資訊主頁後,按一下「新增篩選器」。然後選取
project_id
或instance_id
,監控 Cassandra 介面卡。
gcloud CLI
- 下載
cassandra-adapter-dashboard.json
檔案。這個檔案包含在「監控」中填入自訂資訊主頁所需的資訊。 如要在專案中建立資訊主頁,請使用
gcloud monitoring dashboards create
指令:gcloud monitoring dashboards create --config-from-file=cassandra-adapter-dashboard.json
詳情請參閱
gcloud monitoring dashboards create
參考資料。
此外,下列 Spanner 指標有助於監控介面卡:
CPU utilization metrics
提供使用者和系統工作的 CPU 使用率資訊,並依優先順序和作業類型細分。Storage utilization metrics
提供資料庫和備份儲存空間的相關資訊。Spanner built-in statistics tables
提供查詢、交易和讀取作業的深入分析資訊,協助您找出資料庫中的問題。
如需系統洞察的完整清單,請參閱「使用系統洞察監控執行個體」。如要進一步瞭解如何監控 Spanner 資源,請參閱「使用 Cloud Monitoring 監控執行個體」。
定價
使用 Cassandra 端點不會產生額外費用,系統會根據執行個體使用的運算資源量,以及資料庫使用的儲存空間量,向您收取標準 Spanner 費用。
詳情請參閱「Spanner 定價」。