你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:将数据迁移到用于 Cassandra 帐户的 API

适用于: 卡珊德拉

作为开发人员,你可能具有在本地或云中运行的现有 Cassandra 工作负荷。 你可能想要将它们迁移到 Azure。 可以将此类工作负载迁移到 Azure Cosmos DB 中的 API for Cassandra 帐户。 本教程提供有关可用于将 Apache Cassandra 数据迁移到 Azure Cosmos DB 中 Cassandra 帐户 API 的不同选项的说明。

本教程涵盖以下任务:

  • 规划迁移。
  • 满足迁移的先决条件。
  • 使用 cqlshCOPY 命令迁移数据。
  • 使用 Spark 迁移数据。

如果没有 Azure 订阅,请在开始之前创建一个免费帐户

迁移的先决条件

  • 估计吞吐量需求: 将数据迁移到 Azure Cosmos DB 中 Cassandra 帐户的 API 之前,请估计工作负荷的吞吐量需求。 一般情况下,从创建、读取、更新和删除(CRUD)操作所需的平均吞吐量开始。 然后,将提取、转换和加载(ETL)或突发操作所需的额外吞吐量包括进去。 需要以下详细信息来规划迁移:

    • 现有数据大小或估计数据大小:定义最小数据库大小和吞吐量要求。 如果估计新应用程序的数据大小,则可以假定数据在行中均匀分布。 可以通过与数据大小相乘来估计值。

    • 所需的吞吐量:大概的读取(查询/获取)和写入(更新/删除/插入)吞吐率。 需要使用此值来计算所需的请求单位以及状态稳定的数据大小。

    • 架构:通过 cqlsh 连接到现有的 Cassandra 群集并从 Cassandra 中导出架构:

      cqlsh [IP] "-e DESC SCHEMA" > orig_schema.cql
      

      确定现有工作负荷的要求后,根据收集的吞吐量要求创建 Azure Cosmos DB 帐户、数据库和容器。

    • 确定某个操作的请求单位(RU)费用: 可以使用适用于 Cassandra 的 API 所支持的任何 SDK 来确定 RU。 此示例演示获取 RU 费用的 .NET 版本。

      var tableInsertStatement = table.Insert(sampleEntity);
      var insertResult = await tableInsertStatement.ExecuteAsync();
      
      foreach (string key in insertResult.Info.IncomingPayload)
        {
           byte[] valueInBytes = customPayload[key];
           double value = Encoding.UTF8.GetString(valueInBytes);
           Console.WriteLine($"CustomPayload:  {key}: {value}");
        }
      
  • 分配所需的吞吐量:随着吞吐量需求的增长,Azure Cosmos DB 可以自动扩展存储和吞吐量。 可以使用 Azure Cosmos DB RU 计算器估算吞吐量需求。

  • 在用于 Cassandra 帐户的 API 中创建表: 开始迁移数据之前,请从 Azure 门户或 Azure cqlsh门户预先创建所有表。 如果要迁移到具有数据库级吞吐量的 Azure Cosmos DB 帐户,请在创建容器时提供分区键。

  • 增加吞吐量:数据迁移的持续时间取决于为 Azure Cosmos DB 中的表预配的吞吐量。 在迁移期间增加吞吐量。 通过更高的吞吐量,可以避免速率限制,并在更少的时间内迁移。 完成迁移后,请降低吞吐量以节省成本。 此外,我们还建议在源数据库所在的同一区域中拥有 Azure Cosmos DB 帐户。

  • 启用传输层安全性(TLS): Azure Cosmos DB 具有严格的安全要求和标准。 与帐户交互时启用 TLS。 将 Cassandra 查询语言(CQL)与安全外壳配合使用时,可以提供 TLS 信息。

迁移数据的选项

可以使用命令或使用 Spark 将数据从现有 Cassandra 工作负载移动到 Azure Cosmos DB cqlshCOPY

使用 cqlsh COPY 命令迁移数据

警告

仅使用 CQL COPY 命令迁移小型数据集。 若要移动大数据集,请通过使用 Spark 来迁移数据

  1. 若要确定 .csv 文件包含正确的文件结构,请使用 COPY TO 命令将数据直接从源 Cassandra 表导出到 .csv 文件。 请确保使用相应的凭据将 cqlsh 连接到源表。

    COPY exampleks.tablename TO 'data.csv' WITH HEADER = TRUE;   
    
  2. 现在,获取用于 Cassandra 帐户的连接字符串信息的 API:

    1. 登录到 Azure 门户,并转到你的 Azure Cosmos DB 帐户。
    2. 打开“连接字符串”窗格。 可在此处查看从 cqlsh 连接到 API for Cassandra 帐户所需的所有信息。
  3. 使用 Azure 门户中的连接信息登录 cqlsh

  4. 使用 CQL COPY FROM 命令复制 data.csv。 此文件仍位于已安装的用户根目录中 cqlsh

    COPY exampleks.tablename FROM 'data.csv' WITH HEADER = TRUE;
    

注意

适用于 Cassandra 的 API 支持随 Cassandra 3.11 附带的协议版本 4。 如果将更高版本的协议版本用于我们的 API,则可能会出现问题。 使用更高版本的协议版本,该 COPY FROM 命令可以进入循环并返回重复行。

protocol-version添加到cqlsh命令中:

cqlsh <USERNAME>.cassandra.cosmos.azure.com 10350 -u <USERNAME> -p <PASSWORD> --ssl --protocol-version=4

将吞吐量限制选项添加到 CQL COPY 命令

cqlsh 中的 COPY 命令支持各种参数来控制将文档引入 Azure Cosmos DB 的速率。

命令 COPY 的默认配置尝试高效地摄取数据。 它不考虑 Azure Cosmos DB 的速率限制行为。 根据集合中配置的吞吐量,减少 CHUNKSIZEINGESTRATE

以下是我们建议的配置(最低为 20,000 RU),用于文档或记录大小为 1 KB 的集合:

  • CHUNKSIZE = 100
  • INGESTRATE = 500
  • MAXATTEMPTS = 10
示例命令
  • 将数据从用于 Cassandra 的 API 复制到本地 .csv 文件:

    COPY standard1 (key, "C0", "C1", "C2", "C3", "C4") TO 'backup.csv' WITH PAGESIZE=100 AND MAXREQUESTS=1 ;
    
  • 将数据从本地 .csv 文件复制到 Cassandra 的 API:

    COPY standard2 (key, "C0", "C1", "C2", "C3", "C4") FROM 'backup.csv' WITH CHUNKSIZE=100 AND INGESTRATE=100 AND MAXATTEMPTS=10;
    

重要说明

仅支持开源 Apache Cassandra 版本 CQLSH COPY 。 Datastax Enterprise (DSE) 版本的 CQLSH 可能遇到错误。

使用 Spark 迁移数据

若要使用 Spark 将数据迁移到 Cassandra 帐户的 API,请执行以下步骤:

  1. 预配 Azure Databricks 群集Azure HDInsight 群集

  2. 将数据移到目标 API for Cassandra 终结点。 有关详细信息,请参阅将数据 从 Cassandra 迁移到 Azure Cosmos DB for Apache Cassandra 帐户

如果数据驻留在 Azure 虚拟机或任何其他云中的现有群集中,建议使用 Spark 作业迁移数据。 将 Spark 设置为用于一次性引入或常规引入的中介。 你可以通过使用本地环境和 Azure 之间的 Azure ExpressRoute 连接加速此迁移。

实时迁移

如果需要从本机 Apache Cassandra 群集进行零停机迁移,建议配置双写入和单独的大容量数据加载以迁移历史数据。 使用开源 双写代理 来允许最少的应用程序代码更改时,实现此模式更为简单。 有关详细信息,请参阅 实时将数据从 Apache Cassandra 迁移到 Azure Cosmos DB for Apache Cassandra

清理资源

不再需要资源时,可以删除资源组、Azure Cosmos DB 帐户和所有相关资源。 为此,请选择虚拟机的资源组,选择“删除”,然后确认要删除的资源组的名称。

后续步骤

本教程介绍了如何将数据迁移到 Azure Cosmos DB 中 Cassandra 帐户的 API。 你先可了解 Azure Cosmos DB 的其他概念: