從 Apache Cassandra 遷移至 Bigtable

本文將逐步說明如何將資料從 Apache Cassandra 遷移至 Bigtable,並將中斷情況降至最低。本文說明如何使用開放原始碼工具 (例如 Cassandra to Bigtable Proxy 介面卡或 Cassandra to Bigtable Java 用戶端) 執行遷移作業。開始之前,請務必先熟悉適用於 Cassandra 使用者的 Bigtable

Cassandra 至 Bigtable 代理伺服器介面卡

透過 Cassandra to Bigtable Proxy 介面卡,您可以將以 Cassandra 為基礎的應用程式連線至 Bigtable。Proxy 轉接程式可做為線路相容的 Cassandra 介面,讓應用程式使用 Cassandra 查詢語言 (CQL) 與 Bigtable 互動。使用 Proxy 介面卡時,您不必變更 Cassandra 驅動程式,設定調整幅度也很小。

如要設定及設定 Proxy 轉接程式,請參閱「Cassandra to Bigtable proxy adapter」。

如要瞭解哪些 Cassandra 版本支援 Proxy 配接器,請參閱「支援的 Cassandra 版本」。

Cassandra 鍵空間

Cassandra keyspace 會儲存資料表,並以類似 Bigtable 執行個體的方式管理資源。Cassandra 到 Bigtable 的 Proxy 配接器會以透明方式處理鍵空間命名,因此您可以使用相同的鍵空間進行查詢。不過,您必須建立新的 Bigtable 執行個體,才能以邏輯方式將資料表分組。您也必須另外設定 Bigtable 複製功能。

支援的資料類型

下表顯示支援的 Cassandra CQL 資料類型如何對應至 Bigtable 等效類型。

CQL 類型 Bigtable 對應
text RAW BYTES
blob RAW BYTES
timestamp RAW BYTES
int RAW BYTES
bigint RAW BYTES
float RAW BYTES
double RAW BYTES
boolean RAW BYTES
MAP<key, value> Cassandra 中的資料欄名稱會做為 Bigtable 中的資料欄系列名稱。對應的 key 會做為資料欄限定詞,而對應的 value 則會儲存為儲存格值。
SET<item> Cassandra 中的資料欄名稱會做為 Bigtable 中的資料欄系列名稱。SET 中的每個 item 都會做為資料欄限定符,而儲存格值則會留空。
LIST<item> Cassandra 中的資料欄名稱會做為 Bigtable 中的資料欄系列名稱。系統會使用目前的時間戳記做為資料欄限定詞,並將清單項目儲存為儲存格值。

如要進一步瞭解 Bigtable 中的資料類型對應,請參閱 GoogleSQL for Bigtable 總覽

不支援的資料類型

系統不支援下列 Cassandra 資料類型:

  • counter
  • date
  • decimal
  • duration
  • frozen
  • inet
  • smallint
  • time
  • timeuuid
  • tinyint
  • US-ASCII
  • user-defined 類型 (UDT)
  • uuid
  • varint

DDL 支援

Cassandra to Bigtable Proxy 介面卡支援資料定義語言 (DDL) 作業。您可以使用 DDL 作業,透過 CQL 指令直接建立及管理資料表。建議您採用這種方式設定結構定義,因為這與 SQL 類似,但您不需要在設定檔中定義結構定義,然後執行指令碼來建立資料表。

下列範例說明 Cassandra 至 Bigtable Proxy 配接器如何支援 DDL 作業:

  • 如要使用 CQL 建立 Cassandra 資料表,請執行 CREATE TABLE 指令:

    CREATE TABLE keyspace.table (
        id bigint,
        name text,
        age int,
        PRIMARY KEY ((id), name)
    );
    
  • 如要在表格中新增資料欄,請執行 ALTER TABLE 指令:

    ALTER TABLE keyspace.table ADD email text;
    
  • 如要刪除資料表,請執行 DROP TABLE 指令:

    DROP TABLE keyspace.table;
    

詳情請參閱「DDL Support for Schema Creation (Recommended Method)」。

支援 DML

Cassandra 至 Bigtable 的 Proxy 轉接程式支援資料操作語言 (DML) 作業,例如 INSERTDELETEUPDATESELECT

如要執行原始 DML 查詢,除了數值以外的所有值都必須加上單引號,如下列範例所示:

  • SELECT * FROM keyspace.table WHERE name='john doe';
    
  • INSERT INTO keyspace.table (id, name) VALUES (1, 'john doe');
    

實現零停機時間遷移

搭配使用 Cassandra to Bigtable Proxy 配接器、開放原始碼的 Zero Downtime Migration (ZDM) Proxy 工具Cassandra 資料遷移工具,即可在最短的停機時間內遷移資料。

下圖顯示使用 Proxy 轉接程式從 Cassandra 遷移至 Bigtable 的步驟:

從 Cassandra 遷移至 Bigtable 的程序。
圖 1. 從 Cassandra 遷移至 Bigtable 的程序 (按一下即可放大)。

如要將 Cassandra 遷移至 Bigtable,請按照下列步驟操作:

  1. 將 Cassandra 應用程式連線至 ZDM Proxy 工具。
  2. 啟用雙重寫入 Cassandra 和 Bigtable。
  3. 使用 Cassandra 資料遷移工具大量移動資料。
  4. 驗證遷移作業。驗證完成後,即可終止與 Cassandra 的連線,並直接連線至 Bigtable。

將 Proxy 轉接器與 ZDM Proxy 工具搭配使用時,支援下列遷移功能:

  • 雙重寫入:在遷移期間維持資料可用性
  • 非同步讀取:擴大及壓力測試 Bigtable 執行個體
  • 自動驗證及回報資料:確保整個程序中的資料完整性
  • 資料對應:對應欄位和資料類型,以符合製作標準

如要練習將 Cassandra 遷移至 Bigtable,請參閱「使用雙重寫入 Proxy 從 Cassandra 遷移至 Bigtable」程式碼研究室。

適用於 Java 的 Cassandra 至 Bigtable 用戶端

如要直接與 Bigtable 整合並取代 Cassandra 驅動程式,您可以使用適用於 Java 的 Cassandra to Bigtable 用戶端程式庫,透過 CQL 將以 Cassandra 為基礎的 Java 應用程式與 Bigtable 整合。

如需建構程式庫,以及在應用程式程式碼中加入依附元件的操作說明,請參閱「適用於 Java 的 Cassandra to Bigtable 用戶端」。

以下範例說明如何使用 Java 適用的 Cassandra to Bigtable 用戶端設定應用程式:

import com.datastax.oss.driver.api.core.CqlSession;
import com.datastax.oss.driver.api.core.cql.BoundStatement;
import com.datastax.oss.driver.api.core.cql.PreparedStatement;
import com.datastax.oss.driver.api.core.cql.ResultSet;
import com.datastax.oss.driver.api.core.cql.Row;
import com.google.bigtable.cassandra.BigtableCqlConfiguration;
import com.google.bigtable.cassandra.BigtableCqlSessionFactory;

/**
 * Example using Bigtable CQLSession
 */
public class ExampleWithBigtableCqlSession {

  public static void main(String[] args) {

    // Construct BigtableCqlConfiguration
    BigtableCqlConfiguration bigtableCqlConfiguration = BigtableCqlConfiguration.builder()
        .setProjectId("example-project-id")
        .setInstanceId("example-instance-id")
        .setDefaultColumnFamily("example-column-family")
        .setBigtableChannelPoolSize(4)
        .build();

    // Create CqlSession with BigtableCqlConfiguration
    BigtableCqlSessionFactory bigtableCqlSessionFactory = new BigtableCqlSessionFactory(bigtableCqlConfiguration);

    // Create CqlSession
    try (CqlSession session = bigtableCqlSessionFactory.newSession()) {

      // Create a table
      String createTableQuery = "CREATE TABLE <KEYSPACE>.<TABLE_NAME> (<COLUMN> <TYPE> PRIMARY KEY);";
      session.execute(createTableQuery);

      // Prepare an insert statement
      PreparedStatement preparedInsert = session.prepare(
          "INSERT INTO <KEYSPACE>.<TABLE_NAME> (<COLUMN>) VALUES (?)" // replace with your keyspace, table and columns
      );

      // Insert
      BoundStatement boundInsert = preparedInsert
          .bind()
          .setString("<COLUMN>", "<VALUE>");
      session.execute(boundInsert);

      // Query for all entries
      ResultSet resultSet = session.execute("SELECT <COLUMN> FROM <KEYSPACE>.<TABLE_NAME>;");
      // Print results
      for (Row row : resultSet) {
        System.out.println(row);
      }

    }

  }

}

其他 Cassandra 開放原始碼工具

Cassandra 至 Bigtable 代理程式配接器與 CQL 的線路相容性,可讓您在 Cassandra 開放原始碼生態系統中使用其他工具。這些工具包括:

  • Cqlsh:CQL Shell 可讓您透過 Proxy 轉接程式直接連線至 Bigtable。您可以使用 CQL 進行偵錯及快速查詢資料。
  • Cassandra 資料遷移工具 (CDM): 這項工具以 Spark 為基礎,適合遷移大量 (最多數十億列) 歷來資料。這項工具提供驗證、差異報表和重播功能,且與 Proxy 轉接程式完全相容。

後續步驟