从 Apache Cassandra 迁移到 Bigtable

本文档将引导您完成从 Apache Cassandra 到 Bigtable 的数据迁移过程,同时将中断降至最低。本文介绍了如何使用开源工具(例如 Cassandra 到 Bigtable 的代理适配器或 Cassandra 到 Bigtable 的 Java 客户端)执行迁移。在开始之前,请确保您熟悉面向 Cassandra 用户的 Bigtable 简介

选择迁移方法

您可以使用以下任一方法从 Apache Cassandra 迁移到 Bigtable:

  • 借助 Cassandra to Bigtable 代理适配器,您可以将基于 Cassandra 的应用连接到 Bigtable,而无需更改 Cassandra 驱动程序。此方法非常适合需要极少代码更改的应用。
  • 借助 Cassandra 到 Bigtable 的 Java 客户端,您可以直接与 Bigtable 集成并替换 Cassandra 驱动程序。这种方法非常适合需要高性能和灵活性的应用。

Cassandra to Bigtable 代理适配器

借助 Cassandra 到 Bigtable 代理适配器,您可以将基于 Cassandra 的应用连接到 Bigtable。代理适配器充当传输协议兼容的 Cassandra 接口,可让您的应用使用 Cassandra 查询语言 (CQL) 与 Bigtable 进行交互。使用代理适配器无需更改 Cassandra 驱动程序,并且只需进行极少的配置调整。

如需设置和配置代理适配器,请参阅 Cassandra 到 Bigtable 代理适配器

如需了解哪些 Cassandra 版本支持代理适配器,请参阅支持的 Cassandra 版本

限制

Cassandra 到 Bigtable 代理适配器对某些数据类型、函数、查询和子句的支持有限。如需了解详情,请参阅 Cassandra 到 Bigtable 的代理 - 限制

Cassandra 键空间

Cassandra 键空间用于存储表并以类似于 Bigtable 实例的方式管理资源。Cassandra 到 Bigtable 的代理适配器以透明方式处理键空间命名,因此您可以使用相同的键空间进行查询。不过,您必须创建新的 Bigtable 实例才能实现表的逻辑分组。您还必须单独配置 Bigtable 复制。

DDL 支持

Cassandra 到 Bigtable 代理适配器支持数据定义语言 (DDL) 操作。借助 DDL 操作,您可以通过 CQL 命令直接创建和管理表。我们建议您使用此方法设置架构,因为它与 SQL 类似,但您无需在配置文件中定义架构,然后执行脚本来创建表。

以下示例展示了 Cassandra 到 Bigtable 代理适配器如何支持 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 创建架构(推荐方法)

DML 支持

Cassandra 到 Bigtable 的代理适配器支持数据操纵语言 (DML) 操作,例如 INSERTDELETEUPDATESELECT

如需运行原始 DML 查询,除数值之外的所有值都必须用单引号引起来,如以下示例所示:

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

实现零停机时间迁移

您可以将 Cassandra 到 Bigtable 代理适配器与开源的零停机时间迁移 (ZDM) 代理工具Cassandra 数据迁移工具搭配使用,以尽可能缩短停机时间的方式迁移数据。

下图显示了使用代理适配器从 Cassandra 迁移到 Bigtable 的步骤:

将 Cassandra 迁移到 Bigtable 的过程。
图 1.将 Cassandra 迁移到 Bigtable 的流程(点击可放大)。

如需将 Cassandra 迁移到 Bigtable,请按以下步骤操作:

  1. 将 Cassandra 应用连接到 ZDM 代理工具。
  2. 启用对 Cassandra 和 Bigtable 的双重写入。
  3. 使用 Cassandra 数据迁移工具批量迁移数据。
  4. 验证迁移。验证通过后,您可以终止与 Cassandra 的连接,并直接连接到 Bigtable。

将代理适配器与 ZDM 代理工具搭配使用时,支持以下迁移功能:

  • 双重写入:在迁移期间保持数据可用性
  • 异步读取:扩缩和压力测试 Bigtable 实例
  • 自动进行数据验证和报告:确保整个过程中的数据完整性
  • 数据映射:映射字段和数据类型以满足您的生产标准

如需练习将 Cassandra 迁移到 Bigtable,请参阅使用双重写入代理从 Cassandra 迁移到 Bigtable Codelab。

Java 版 Cassandra 到 Bigtable 客户端

您可以直接与 Bigtable 集成,并替换 Cassandra 驱动程序。借助 Java 版 Cassandra 到 Bigtable 客户端库,您可以使用 CQL 将基于 Cassandra 的 Java 应用与 Bigtable 集成。

如需了解有关构建库以及在应用代码中添加依赖项的说明,请参阅 Cassandra 到 Bigtable 的 Java 客户端

以下示例展示了如何使用 Java 版 Cassandra 到 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 可让您直接连接到 Bigtable。您可以使用它通过 CQL 进行调试和快速数据查找。
  • Cassandra Data Migrator (CDM):此工具基于 Spark,适合迁移大量(最多数十亿行)历史数据。该工具提供验证、差异报告和重放功能,并且与代理适配器完全兼容。

后续步骤