從 Apache Cassandra 遷移至 Bigtable

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

選擇遷移方法

您可以採用下列其中一種做法,從 Apache 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 Adapter,請參閱「支援的 Cassandra 版本」。

限制

Cassandra 至 Bigtable 代理程式轉接程式僅支援特定資料類型、函式、查詢和子句。詳情請參閱「Cassandra to Bigtable Proxy - Limitations」。

Cassandra 鍵空間

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

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 至 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 轉接程式完全相容。

後續步驟