【OCI云迁移指南】尝试使用NoSQL数据库迁移工具将Amazon Keyspaces迁移到Oracle NoSQL数据库云服务

OCI云迁移指南的概念是什么?

这是由云工程师(@araidon,@kazunishi,@yama6)组成的团队,致力于从本地环境、AWS等多个平台迁移到Oracle Cloud Infrastructure的迁移项目,在本系列文章中总结了OCI迁移的步骤。每一篇文章都会以示例工作负载为例,介绍迁移的步骤指南。

我想要转移的样本工作负载

image.png

服务迁移:亚马逊 Keyspaces

本次迁移的对象是Amazon keyspaces。

在前述的AWS架构图中,DynamoDB被标注为键值型数据库,但本次将指导迁移至Amazon keyspaces。

 

image.png

NoSQL数据库迁移器是什么。

OCI中也提供了名为Oracle NoSQL Database Cloud Service的NoSQL数据库服务,并且还提供了一个名为NoSQL Database Migrator的工具,该工具可以支持从Amazon DynamoDB和MongoDB等键值型数据库进行迁移。

您可以使用Oracle NoSQL Database Migrator将NoSQL表从一个数据源迁移到另一个数据源(如本地或云上的Oracle NoSQL Database),或者迁移到简单的JSON文件上。您还可以将MongoDB格式的JSON输入文件、DynamoDB格式的JSON输入文件(存储在AWS S3源或文件中)或CSV文件复制到本地或云上的NoSQL数据库中。

 

行动方式

在NoSQL数据库迁移工具中,将源数据库称为”源”,目标数据库称为”汇”。
在本指南中,我们将介绍将以下内容作为源数据库和目标数据库的迁移示例。

移行元(ソース)移行先(シンク)csvOracle NoSQL Database Cloud Service

使用 NoSQL 数据库迁移工具,将存储在安装了 NoSQL Database Migrator 的 EC2 存储中的 CSV 文件作为源数据,迁移数据到 Oracle NoSQL Database Cloud Service。

除了数据迁移,该工具在执行过程中还可以构建 Oracle NoSQL Database Cloud Service 作为迁移目标(Sink)。

image.png

前提条件 tí

在执行迁移之前,根据本文指南,我们的前提条件有两点。

    请确保在下面的文章中Amazon EC2上已安装Oracle NoSQL Database Migrator,并处于可执行状态。

 

    1. 请确保已将与运行Oracle NoSQL Database Migrator的EC2实例关联的IAM角色授予了可操作Amazon keyspaces所需的IAM策略。

 

    * 请参考以下文章以了解如何添加。

 

转变顺序

    1. 创建Amazon keyspaces

 

    1. 使用cql将csv导出

 

    1. 创建NoSQL Database的DDL语句

 

    1. 执行NoSQL Database迁移器

 

    确认执行结果

创建Amazon keyspaces。

请参考以下文章,创建一个作为迁移源的Amazon keyspaces。

 

1-1. 创建键空间和表

在教程的第一步中,我们将创建一个键空间和一个表格。
在”创建键空间”上,我们从”使用控制台”开始,创建一个名为”myGSGKeyspace”的键空间。
然后,在”创建表格”部分,我们从”使用控制台”开始,创建一个名为”employees_tbl”的表格。
在键空间的结构中,将”ID”指定为分区键,将””指定为排序键。

パーティションキーソートキーIDdivision

这个将在以后创建DDL语句时需要考虑到。

1-2. 插入样本数据

在第2步中,我们将向表格中插入和加载数据,并向创建的表格中插入示例数据。本次我们将使用cqlsh,从示例数据文件(employees.csv)中插入数据。

1-2-1. 准备样本数据

请从下面下载示例数据并在本地解压缩。

 

将文件上传到Cloud Shell,并使用以下命令将文件从Cloud Shell传输到EC2。

$scp -i pemキー名 employees.csv ec2-user@EC2のパブリックIPアドレス:/home/ec2-user

1-2-2. 安装cqlsh

为了安装cqlsh,首先将python3安装到Amazon EC2上。

$sudo dnf install python3.11

安装python3-pip。

$sudo dnf install python3-pip

安装 cqlsh-expansion。

$python3 -m pip install --user cqlsh-expansion
$pip3 install --user cqlsh-expansion

确认版本。

$cqlsh-expansion --version
cqlsh 6.1.0

当版本输出后,安装就完成了。

1-2-3. 通过cqlsh连接到Amazon KeySpaces。

使用AWS CLI来设置默认区域。

$aws configure
…
Default region name [None]: ap-northeast-1

我将使用cqlsh与Amazon keyspaces建立SSL连接。

$ cqlsh-expansion cassandra.ap-northeast-1.amazonaws.com 9142 --ssl
Connected to Amazon Keyspaces at cassandra.ap-northeast-1.amazonaws.com:9142
[cqlsh 6.1.0 | Cassandra 3.11.2 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh current consistency level is ONE.
cqlsh> 

一旦连接确认成功后,将显示cqlsh提示符,您可以从这里开始操作。
这里指定了键空间。

cqlsh> USE "myGSGKeyspace" ;
cqlsh:myGSGKeyspace> 

设定书写的一致性水平。

cqlsh> CONSISTENCY LOCAL_QUORUM;
Consistency level set to LOCAL_QUORUM.

1-2-4. 插入样本数据

将样本数据插入到keyspaces中。

COPY employees_tbl (id,name,project,region,division,role,pay_scale,vacation_hrs,manager_id) 
FROM 'path-to-the-csv-file/employees.csv' WITH delimiter=',' AND header=TRUE ;

执行以下查询,确认表格中已添加了7行数据。

cqlsh> SELECT * FROM employees_tbl ;

 id          | division    | manager_id  | name    | pay_scale | project     | region | role    | vacation_hrs
-------------+-------------+-------------+---------+-----------+-------------+--------+---------+--------------
 789-01-2345 |   Executive |        None | Roberta |        15 |         All |     US |     CEO |          184
 567-89-0123 |   Marketing | 678-90-1234 |   Ahmed |         4 | NightFlight |     US |      IC |           88
 234-56-7890 | Engineering | 789-01-2345 |     Bob |         6 | NightFlight |     US | Manager |           72
 456-78-9012 | Engineering | 234-56-7890 |    Beth |         7 | NightFlight |     US |      IC |        100.5
 123-45-6789 | Engineering | 234-56-7890 |     Bob |         1 | NightFlight |     US |  Intern |            0
 678-90-1234 |   Marketing | 789-01-2345 |    Alan |         3 |       Storm |     US | Manager |         18.4
 345-67-8901 | Engineering | 234-56-7890 |   Sarah |         4 |       Storm |     US |      IC |          108

从AWS控制台中查看数据,会显示如下信息。
从CQL编辑器中执行相同的CQL语句。

image.png

2. 使用CQL将CSV导出

为了迁移到NoSQL数据库,现在将插入的数据以csv格式进行导出。

cqlsh:myGSGKeyspace> COPY employees_tbl (id,name,project,region,division,role,pay_scale,vacation_hrs,manager_id) 
                 ... TO '/home/ec2-user/nosqlMigrator/nosql-migrator-1.5.0/expemployees.csv' WITH delimiter=',' AND header=TRUE AND QUOTE='"' ;
cqlsh current consistency level is LOCAL_QUORUM.
Reading options from /home/ec2-user/.cassandra/cqlshrc:[copy]: {'numprocesses': '16', 'maxattempts': '1000'}
Reading options from the command line: {'delimiter': ',', 'header': 'TRUE', 'quote': '"'}
Using 16 child processes

Starting copy of myGSGKeyspace.employees_tbl with columns [id, name, project, region, division, role, pay_scale, vacation_hrs, manager_id].
Processed: 7 rows; Rate:     145 rows/s; Avg. rate:      22 rows/s
7 rows exported to 1 files in 0.370 seconds.

当使用cat命令进行确认时,可以看到包含标题的7行数据。

$ cat expemployees.csv 
id,name,project,region,division,role,pay_scale,vacation_hrs,manager_id
234-56-7890,Bob,NightFlight,US,Engineering,Manager,6,72,789-01-2345
567-89-0123,Ahmed,NightFlight,US,Marketing,IC,4,88,678-90-1234
789-01-2345,Roberta,All,US,Executive,CEO,15,184,None
345-67-8901,Sarah,Storm,US,Engineering,IC,4,108,234-56-7890
678-90-1234,Alan,Storm,US,Marketing,Manager,3,18.4,789-01-2345
456-78-9012,Beth,NightFlight,US,Engineering,IC,7,100.5,234-56-7890
123-45-6789,Bob,NightFlight,US,Engineering,Intern,1,0,234-56-7890

导出后,通过exit退出cqlsh,然后返回到EC2。

创建用于NoSQL数据库的DDL语句

进入nosql-migrator-1.5.0目录,创建名为”mytable_schema.ddl”的ddl文件。

$ cd /nosqlMigrator/nosql-migrator-1.5.0
$ touch mytable_schema.ddl

使用vi命令,将以下内容的DDL语句写入。

create table employees (id STRING, name STRING, project STRING, region STRING, division STRING, role STRING, pay_scale INTEGER, vacation_hrs FLOAT, manager_id STRING, PRIMARY KEY(SHARD(id),division));

重点是在创建键空间和表时,指定了分区键为id,排序键为division。

在这里,我们已经准备好了作为数据源的”expexpemployees.csv”文件和作为NoSQL数据库表结构信息的”mytable_schema.ddl”文件。
通过以下步骤,我们将使用这两个输入来执行迁移器,进行表格的迁移。

4. 进行NoSQL数据库迁移工具实施

和从DynamoDB迁移时一样,执行runMigrator命令。

$ ./runMigrator

在执行命令后,工具将要求回答问题:输入参数并按Enter键。[]括起来的文字是回答留空答案的默认回答。
基于这些参数,NoSQL数据库迁移工具将生成名为”migrator-config.json”的配置文件。这将成为迁移的配置文件。

请根据以下内容,在屏幕上显示分隔的方式记录本次条件下的输入参数。
请参考备注进行输入。

设置创建开始

Configuration file is not provided. Do you want to generate
configuration? (y/n) [n]: y

如果是y,就会继续进行。如果是n,就会返回原始控制台。

4-2. 指定移行设定文件的名称

Enter a location for your config [./migrator-config.json]: 

如果没有特殊原因的话,我认为可以保持默认的”./migrator-config.json”。
如果存在重名的情况,之后是否可以进行覆盖将会询问。

4-3. 選擇醬汁。

Select the source: 
1) nosqldb
2) nosqldb_cloud
3) file
4) object_storage_oci
5) aws_s3
#? 
3

选择第三个文件。这次的源文件是本地目录中的csv文件。

4-4. 设置源参数

Configuration for source type=file
Select the source file format: 
1) json
2) mongodb_json
3) dynamodb_json
4) csv
#? 4
Enter path to a file or directory containing csv data: ./expemployees.csv
Does the CSV file contain a headerLine? (y/n) [n]: y
Do you want to reorder the column names of NoSQL table with respect to
CSV file columns? (y/n) [n]: n
Provide the CSV file encoding. The supported encodings are:
UTF-8,UTF-16,US-ASCII,ISO-8859-1. [UTF-8]: UTF-8
Do you want to trim leading and trailing blanks? (y/n) [n]: n

选择第4个CSV文件。
然后,会询问数据文件的位置,请指定使用# 2. cql导出的”expemployees.csv”文件。
在导出CSV时,使用header=TRUE参数,因此回答说已包含标题以输出带有标题的文件。
其他部分可以使用默认值。

4-5. 洗手池的选择 jī de

Select the sink: 
1) nosqldb
2) nosqldb_cloud
#? 2

选择2的Oracle NoSQL Database Cloud Service。

4-6. 水槽的选择

Configuration for sink type=nosqldb_cloud
Enter endpoint URL or region ID of the Oracle NoSQL Database Cloud: ap-tokyo-1
Would you like to use instance principal authentication?
Use this if you're running migrator within a OCI compute instance and
configured instance principal authentication on it. If you select no you will be
asked to enter OCI credentials file details. (y/n) [n]: n
Enter path to the file containing OCI credentials [/home/ec2-user/.oci/config]: 
Enter the profile name in OCI credentials file [DEFAULT]: 
Enter the compartment name or id of the table []: <コンパートメント名>
Enter table name: employees
Include TTL data? If you select 'yes' TTL value provided by the
source will be set on imported rows. (y/n) [n]: 
Would you like to create table as part of migration process?
Use this option if you want to create table through the migration tool.
If you select yes, you will be asked to provide a file that contains
table DDL or to use schema provided by the source or default schema.
(y/n) [n]: y
Enter path to a file containing table DDL: ./mytable_schema.ddl 
Would you like to use on demand read and write units? (y/n) [n]: y
Enter storage size in GB of new table: 10
Enter percentage of table write units to be used for migration operation. 
(1-100) [90]: 
would you like to overwrite records which are already present?
If you select 'no' records with same primary key will be skipped [y/n] [y]: y
Enter store operation timeout in milliseconds. [5000]: 
Would you like to add transformations to source data? (y/n) [n]: 
Would you like to continue migration if any data fails to be migrated?
 (y/n) [n]: n

由于设置项较多,只列出需要注意的参数,而不是默认值。

請輸入 Oracle NoSQL Database Cloud 的端點 URL 或區域 ID:ap-tokyo-1。

请输入表格的分区名称或id:[<分区名称>]
→ 请选择在OCI上创建Oracle NoSQL Database Cloud的分区。

请输入表名:员工

→请输入表名:员工。与您在“3. 创建NoSQL数据库的DDL语句”中编写的DDL语句中的表名保持一致。

您是否希望在迁移过程中创建表格?如果是的话,请输入 y。

输入包含表 DDL 的文件路径:./mytable_schema.ddl
→ 3. 指定使用创建 NoSQL 数据库时生成的 DDL 语句的 mytable_schema.ddl 文件。

你想使用按需读写单位吗?(是/否)[否]: 是
→无论是按需还是固定容量都没有问题,但这次我们选择了按需。
接下来,”输入新表的存储大小,单位为GB”,我们指定为10GB。

4-7. 确认迁移设置文件

Generated configuration is:
{
  "source" : {
    "type" : "file",
    "format" : "csv",
    "dataPath" : "./expemployees.csv",
    "hasHeader" : true,
    "csvOptions" : {
      "encoding" : "UTF-8",
      "trim" : false
    }
  },
  "sink" : {
    "type" : "nosqldb_cloud",
    "endpoint" : "ap-tokyo-1",
    "table" : "employees",
    "compartment" : "<コンパートメント名>",
    "includeTTL" : false,
    "schemaInfo" : {
      "onDemandThroughput" : true,
      "storageSize" : 10,
      "schemaPath" : "./mytable_schema.ddl"
    },
    "credentials" : "/home/ec2-user/.oci/config",
    "credentialsProfile" : "DEFAULT",
    "writeUnitsPercent" : 90,
    "overwrite" : true,
    "requestTimeoutMs" : 5000
  },
  "abortOnError" : true,
  "migratorVersion" : "1.5.0"
}
Would you like to run the migration with above configuration?
If you select no, you can use the generated configuration file to
run the migration using:
./runMigrator --config ./migrator-config.json
(y/n) [y]: y

当输入4-6时,它会根据输入的参数为您生成一个转移设置文件,格式为JSON。如果没有问题,请输入y。

4-8. 执行迁移

2023-10-29 15:13:49.975 [INFO] creating source from given configuration:
2023-10-29 15:13:50.126 [INFO] source creation completed
2023-10-29 15:13:50.137 [INFO] creating sink from given configuration:
2023-10-29 15:13:52.311 [INFO] sink creation completed
2023-10-29 15:13:52.312 [INFO] creating migrator pipeline
2023-10-29 15:13:52.312 [INFO] migration started
2023-10-29 15:13:52.312 [INFO] [cloud sink] : start loading DDLs
2023-10-29 15:13:52.334 [INFO] [cloud sink] : executing DDL: create table employees (id STRING, name STRING, project STRING, region STRING, division STRING, role STRING, pay_scale INTEGER, vacation_hrs FLOAT, manager_id STRING, PRIMARY KEY(SHARD(id),division)),limits: [0, 0, 10]
2023-10-29 15:13:57.424 [INFO] [cloud sink] : completed loading DDLs
2023-10-29 15:13:57.595 [INFO] [cloud sink] : start loading records
2023-10-29 15:13:57.608 [INFO] [csv file source] : start parsing CSV records from file: expemployees.csv
2023-10-29 15:13:57.836 [INFO] migration completed.
Records provided by source=7, Records written to sink=7, Records failed=0, Records skipped=0.
Elapsed time: 0min 5sec 514ms
Migration completed.

从执行日志中的”Records provided by source=7, Records written to sink=7, Records failed=0, Records skipped=0.”可以看出,有7行数据从源头写入到了目标。
接下来,我们将通过以下步骤来检查OCI上的Oracle NoSQL Database Cloud Service是否正确地反映了数据。

5. 檢查執行結果

image.png
image.png
image.png

我们确认在插入示例数据的过程中,已经成功存储了与插入的数据相同的数据!

image.png
image.png

可以知道id被設置為PRIMARY KEY和SHARD KEY,division被設置為PRIMARY KEY。
在Oracle NoSQL Database Cloud Service中,鍵如下所示相對應。

Amazon keyspacesOracle NoSQL Database Cloud Serviceパーティション・キーPRIMARY KEYおよびSHARD KEYソート・キーPRIMARY KEY

 

总结

继上一次迁移DynamoDB之后,这一次我们尝试将基于Apache Cassandra的Amazon keyspaces迁移到Oracle NoSQL Database Cloud Service。
上一次,我们使用工具根据json数据文件和迁移配置文件生成DDL语句,但这一次,我们使用csv数据文件和DDL语句作为输入,在工具中生成迁移配置文件进行迁移。
对于DynamoDB来说,源数据存储在S3上的DynamoDB json中,而对于Amazon keyspaces来说,源数据设定为本地目录中的csv文件。
由于NoSQL Database Migrator可以根据源服务选择源文件类型,因此能够根据迁移源和目标之间的关系进行灵活选择,这是一个很大的优点。
下一次,我们计划试试将Amazon Document DB迁移到Oracle NoSQL Database Cloud Service。

请找一份参考资料。

 

广告
将在 10 秒后关闭
bannerAds