从 Apache Cassandra 迁移至 Amazon Keyspaces

简介

在本教程中,您将学习如何使用 Amazon Keyspaces(兼容 Apache Cassandra),将自托管的 Apache Cassandra 集群迁移至全托管集群。首先,您将了解为什么要使用 Amazon Keyspaces 来管理 Cassandra 集群。接下来,您将按照步骤操作,将现有的 Cassandra 集群迁移至 Amazon Keyspaces。完成本教程后,您应能够自如地将现有的 Cassandra 数据库迁移至 Amazon Keyspaces。

 时长

30-45 分钟

为什么使用 Amazon Keyspaces?

Amazon Keyspaces 是一项全托管服务,可以在 Amazon Web Services (AWS) 上运行与 Cassandra 兼容的数据库。对于许多数据量大、性能要求高的应用程序来说,Cassandra 是一个很受欢迎的选择。

通过 Amazon Keyspaces,AWS 将负责管理您的数据库运维工作,让您的团队能够全身心投入创新。Amazon Keyspaces 处理集群扩展、实例故障转移、数据备份和软件更新。依托 AWS Cloud 的高效性,您可以使用速度更快、成本更低、可靠性更高的数据库服务。

教程内容

在本教程中,您将了解如何在 Amazon Keyspaces 中将自托管的 Cassandra 集群迁移至全托管集群。本教程分为四个步骤。

1. (可选)在 Amazon Elastic Compute Cloud (Amazon EC2) 中创建源 Cassandra 集群

在本模块中,您将在 Amazon EC2 中创建自托管的 Cassandra 数据库。该数据库将作为源数据库,用于演示向 Amazon Keyspaces 迁移的步骤。您可以使用该数据库完成向 Amazon Keyspaces 迁移所需的步骤。

如果您已经有了想要迁移的源 Cassandra 数据库,则可以跳过本模块,直接学习下一个模块。

如果需要为迁移实践创建源 Cassandra 数据库,请登录 Amazon EC2 控制台。点击 Launch instance(启动实例),启动 Amazon EC2 实例创建向导。

Amazon EC2 实例创建向导的第一步是选择 Amazon 机器镜像 (AMI)。选择默认的 x86 架构的 Amazon Linux 2 AMI,然后点击 Select(选择)。

在下一页中,选择 Amazon EC2 实例的实例类型。在本实践中,请至少使用 t2.large 实例,因为 Cassandra 需要大量的内存。点击 Review and Launch(检查并启动)继续。

下一页显示了 Amazon EC2 其余设置的默认选项。在该使用场景中,默认选项就可以满足需求。点击 Launch(启动)继续。

接下来,选择一个密钥对,以便通过 SSH 访问您的新 Amazon EC2 实例。在下拉菜单中点击 Create a new key pair(创建新的密钥对),为本实践创建一个新的密钥对。然后,将密钥对命名为 cassandra-migration,并点击 Download Key Pair(下载密钥对),将密钥对下载至您的计算机上。最后,点击 Launch Instances(启动实例)创建实例。

此时会显示一个确认页面,表明您的实例正在启动。点击 View Instances(查看实例)查看您的 Amazon EC2 实例。

实例初始化时,Instance State(实例状态)会显示为 pending(待处理)。请等到 Instance State(实例状态)变为 running(正在运行)。

当 Instance State(实例状态)显示为 running(正在运行)时,您就可以通过 SSH 连接至该实例了。

复制实例的 IPv4 Public IP(IPv4 公网 IP),然后在终端中运行以下命令,通过 SSH 连接至该实例。

chmod 600 /path/to/cassandra-migration.pem
ssh -i /path/to/cassandra-migration.pem ec2-user@<IPv4PublicIP>

请务必将您下载的 cassandra-migration.pem 文件的正确路径替换至命令中,并使用实例的正确 IPv4 公网 IP 地址。

如果无法连接至 Amazon EC2 实例,请参阅使用 SSH 连接至 Linux 实例

如果连接成功,终端应如下图所示。

要安装 Cassandra,首先需要安装 Java。在终端中执行以下命令安装 Java。

sudo amazon-linux-extras enable corretto8
sudo yum -y install java-1.8.0-amazon-corretto-devel

安装完 Java 后,执行以下命令来安装并启动 Cassandra。

echo '[cassandra]
name=Apache Cassandra
baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.apache.org/dist/cassandra/KEYS' | sudo tee -a /etc/yum.repos.d/cassandra.repo > /dev/null
sudo yum -y install cassandra
sudo systemctl daemon-reload
sudo service cassandra start

安装并启动 Cassandra 后,使用 nodetool CLI 检查 Cassandra 集群的运行状况。在终端中执行以下命令。

nodetool status

您应该会在 Cassandra 集群中看到一个如下图所示的节点。

有一个名为 tlp-stress 的开源工具,可用于对 Cassandra 集群进行负载测试和基准测试。它提供了一种简单的方法来将数据加载至集群中,可用于验证迁移是否正常进行。

在终端中运行以下命令来安装 tlp-stress。

sudo yum install -y git
git clone https://github.com/thelastpickle/tlp-stress.git
cd tlp-stress
./gradlew shadowJar

接下来,使用 tlp-stress 将 10000 条时间序列记录加载至集群中,用于迁移。为此,请在终端中执行以下命令。

bin/tlp-stress run BasicTimeSeries -i 10k

执行该命令时,您应该会在终端中看到一些输出。该命令运行完成后,将显示操作结果。

在本模块中,您创建了一个自托管的源 Cassandra 集群,可以使用它来测试如何将数据迁移至 Amazon Keyspaces。在下一个模块中,您将创建一个全托管的 Amazon Keyspaces 集群。

2. 创建 Amazon Keyspaces 集群

在本模块中,您将创建一个 Amazon Keyspaces 集群。将现有数据复制到此集群后,它将成为您的主数据库。

首先,请登录 Amazon Keyspaces 控制台。在 Keyspaces 页面上,点击 Create keyspace(创建键空间),创建一个新的键空间。

在键空间创建向导中,为您的键空间指定一个名称。

您可以为键空间添加标签,用于访问控制或计费跟踪。然后,点击 Create keyspace(创建键空间)创建您的键空间。

现在您应当能在 Amazon Keyspaces 控制台上看到您的键空间。点击您的键空间,查看更多详细信息。

当前,您的键空间中还没有任何表。让我们在键空间中创建第一个表,用于存储迁移后的数据。

点击 Create table(创建表),启动创建表向导。

为表指定一个名称。tlp-stress 工具将表命名为 sensor_data,所以这里也使用相同的名称。

接下来,您需要定义表的 Schema(模式)。tlp-stress 工具在表中添加了三列:sensor_id、timestamp 和 data。sensor_id 和 data 列的类型为 text,timestamp 列的类型为 timeuuid。此外,分区键是 sensor_id 和 timestamp 的组合。

在 Amazon Keyspaces 创建表向导中,您的 Schema 应如下图所示。

最后,您可以选择 Capacity mode(容量模式)并添加任何必要的标签。使用 Amazon Keyspaces 预配容量计费模式时,需要声明所需的读取和写入容量。使用按需计费模式时,您无需预先规划表的容量。Amazon Keyspaces 会根据您实际使用的读取和写入量直接计费。AWS 免费套餐生效时,在创建 Amazon Keyspaces 资源后的前三个月内,您每月可以使用 3000 万个按需读取单位和 3000 万个按需写入单位。

请注意,创建 Amazon Keyspaces 表时,无需像在 Cassandra 中那样配置压缩策略、布隆过滤器、缓存或其他常见的调优参数。Amazon Keyspaces 会为您处理这些任务,让开发人员可以专注于优化数据模型和访问模式。

创建表向导会显示用于创建表的 Cassandra 命令。准备就绪后,点击 Create table(创建表)创建您的表。

Amazon Keyspaces 控制台显示您的表正在创建过程中。创建表时,表的 Status(状态)将显示为 Creating(创建中)。

当表准备就绪可用时,表的 Status(状态)将变为 Active(活动)。

在本模块中,您在 Amazon Keyspaces 中创建了一个键空间和一个表。该表采用全托管方式,并与 Cassandra 兼容。

在下一个模块中,您将把现有的 Cassandra 表迁移至 Amazon Keyspaces 中的全托管表。

3. 从现有的 Cassandra 表迁移至 Amazon Keyspaces 表

使用 Cassandra 的命令行工具 cqlsh 来辅助迁移。首先,从 Cassandra 的现有表中导出数据。然后,将数据导入至 Amazon Keyspaces 的新表中。

开始之前,请使用 cqlsh 生成服务专用凭证以连接至 Amazon Keyspaces。这些服务专用凭证是连接至 Amazon Keyspaces 表进行身份验证的两种方式之一。服务专用凭证与特定的 AWS Identity and Access Management (IAM) 用户关联,用于对服务进行身份验证。

请登录 IAM 控制台生成服务专用凭证。找到要授予服务专用凭证的 IAM 用户,然后选择该用户。

在该 IAM 用户页面上,选择 Security credentials(安全凭据)页签。

接着前往页面底部。在 Amazon Keyspaces 部分,点击 Generate credentials(生成凭证),为该 IAM 用户创建 Amazon Keyspaces 凭证。

页面将显示一个窗口,其中展示刚刚创建的特定服务的凭据。下载这些凭证,并妥善保存,以便在本模块后续步骤中使用。

下载服务专用凭证后,您就可以开始迁移了。您将在托管自托管 Cassandra 数据库的 Amazon EC2 实例上执行迁移。

前往 Amazon EC2 控制台,找到您在本教程第一个模块中创建的 Amazon EC2 实例。

复制实例的 IPv4 Public IP(IPv4 公网 IP 地址)。

获取 IPv4 公网 IP 地址后,运行第一个模块中使用的命令连接至实例。

ssh -i /path/to/cassandra-migration.pem ec2-user@<IPv4PublicIP>

连接至实例后,在终端中输入 cqlsh 进入 CQL shell。

您可以在 cqlsh 中使用以下命令查看一些示例数据。

SELECT * FROM tlp_stress.sensor_data LIMIT 5;

您应该会看到类似下图的输出结果。

在 cqlsh 工具中输入以下命令,在 Amazon EC2 实例中将表导出为 .csv 文件。

COPY tlp_stress.sensor_data TO 'sensor_data_export.csv' WITH HEADER=true;

该命令只需几秒钟即可完成。输入 exit 退出 CQL shell。

当前目录下有一个名为 sensor_data_export.csv 的文件,其中包含了表的内容。您可以在终端中运行以下命令查看部分内容。

head -n5 sensor_data_export.csv

该命令会打印出文件的标题行和前四行数据。

现在,使用 cqlsh 和您创建的服务专用凭证连接至 Amazon Keyspaces 表。

首先,使用以下命令下载 Amazon 数字证书。

curl https://www.amazontrust.com/repository/AmazonRootCA1.pem -o /home/ec2-user/.cassandra/AmazonRootCA1.pem

然后运行以下命令,配置 cqlsh 连接至 Amazon Keyspaces。

echo '[connection]
port = 9142
factory = cqlshlib.ssl.ssl_transport_factory

[ssl]
validate = true
certfile = /home/ec2-user/.cassandra/AmazonRootCA1.pem' >> /home/ec2-user/.cassandra/cqlshrc

配置完 cqlsh 后,在 cqlsh 中运行以下命令连接至您的键空间。

cqlsh cassandra.us-east-1.amazonaws.com 9142 -u <user> -p <password> --ssl

请确保将 <user> 替换为用户名,将 <password> 替换为服务专用凭证中的密码。

如果命令执行成功,您应该已经通过 cqlsh 连接至了键空间。

 

使用 cqlsh 中的 USE 命令切换至您创建的键空间,并将写入一致性级别设置为 LOCAL_QUORUM。

USE fully_managed_keyspace;
CONSISTENCY LOCAL_QUORUM;

然后,将数据导入表中。

COPY "sensor_data" FROM './sensor_data_export.csv' WITH HEADER=true AND INGESTRATE=1000;

几秒钟后,.csv 文件中的所有记录都将导入至 Amazon Keyspaces 表中。您可以使用以下命令查看一些记录。

SELECT * FROM sensor_data LIMIT 5;

与源 Cassandra 数据库一样,该命令会打印出部分记录。

有关使用 cqlsh 将数据导入 Amazon Keyspaces 表的更多详细信息和配置选项,请参阅使用 cqlsh 将数据加载至 Amazon Keyspaces

在本模块中,您从运行在 Amazon EC2 上的自托管 Cassandra 集群中导出了数据,并将数据导入至了全托管的 Amazon Keyspaces 表中。为此,您创建了供 cqlsh 使用的服务专用凭证,然后针对源数据库和目标 Amazon Keyspaces 表执行了 cqlsh 命令。

在下一个模块中,您将完成迁移并清理资源。

4. 完成迁移并清理资源

如果您已完成本教程中的所有步骤,那么您已经创建了一个全托管的 Amazon Keyspaces 表,并将现有数据从自托管的 Cassandra 集群迁移至了该表中。在最后一个模块中,您将完成迁移并清理资源。

初始迁移完成并且所有数据都同步至新的 Amazon Keyspaces 表后,您就可以在应用程序中使用这个新的 Amazon Keyspaces 表了。在应用程序中,修改配置以使用 Amazon Keyspaces 表,而不是现有的 Cassandra 数据库。有关使用 Cassandra 客户端连接至 Amazon Keyspaces 的更多信息,请参阅使用 Cassandra 客户端驱动程序以编程方式访问 Amazon Keyspaces

将应用程序配置切换至新的 Amazon Keyspaces 表,并且对迁移结果完全满意后,您就可以删除 Amazon EC2 上现有的自托管 Cassandra 数据库了。

前往 Amazon EC2 控制台。找到用于托管 Cassandra 数据库集群的实例。选择该实例,然后在 Actions(操作)下拉菜单中依次点击 Instance State > Terminate(实例状态 > 终止)。

如果您不再需要本教程中创建的键空间和表,也应该将其删除。为此,请登录 Amazon Keyspaces 控制台。选择您创建的键空间,然后点击 Delete(删除)。

删除键空间之前,系统会显示一个确认窗口。在文本框中输入 Delete,然后点击 Delete keyspace(删除键空间)删除您的键空间。

Amazon Keyspaces 页面将显示您的键空间正在删除中。

在本模块中,您学习了如何迁移应用程序以使用新的全托管 Amazon Keyspaces 表。您还学习了如何清理 Amazon EC2 实例以及在本教程中创建的 Amazon Keyspaces 资源。

总结

在本教程中,您已经成功地将运行在 Amazon EC2 上的现有自托管 Apache Cassandra 数据库迁移至了全托管的 Amazon Keyspaces 表中。您使用了 cqlsh 等工具,轻松地将数据从现有实例迁移至了 Amazon Keyspaces 表中。

从 Redis 迁移至 Amazon ElastiCache