从 Aerospike 迁移到 Bigtable


本教程介绍如何将数据从 Aerospike 迁移到 Bigtable。本教程介绍 Aerospike 与 Bigtable 之间的区别,以及如何转换工作负载以在 Bigtable 中运行。本教程面向想要在 Google Cloud 上查找类似于 Aerospike 的数据库服务的数据库从业者。本教程假定您熟悉数据库架构、数据类型、NoSQL 的基础知识以及关系型数据库系统。本教程依赖于运行预定义任务来执行示例迁移。完成本教程后,您可以修改提供的代码和步骤以与您的环境相匹配。

Bigtable 是一种 PB 级的全代管式 NoSQL 数据库服务,用于处理大规模分析和运营工作负载。您可以将其用作可用性和耐用性更高的低延时、PB 级存储服务的存储引擎。您可以使用 DataprocBigQuery 等 Google Cloud 数据分析服务来分析 Bigtable 中的数据。

Bigtable 非常适合用于使用 NoSQL 数据库(如 AeroSpike 或 Cassandra)实现的广告技术 (ad tech)、金融技术 (fintech) 和物联网 (IoT) 服务。如果您要寻找 NoSQL 管理的服务,请使用 Bigtable。

架构

以下参考架构图显示了可用于将数据从 Aerospike 迁移到 Bigtable 的常见组件。

用于从 Aerospike 到 Bigtable 的数据传输过程的组件。

在上图中,数据使用两种不同的方法从本地环境迁移到 Google Cloud 上的 Bigtable。第一种方法使用批处理迁移数据。首先将 Aerospike 备份数据移动到 Cloud Storage 存储桶。当备份数据到达 Cloud Storage 时,它会触发 Cloud Functions 函数,以使用 Dataflow 开始批量提取、转换和加载 (ETL) 流程。Dataflow 作业将备份数据转换为与 Bigtable 兼容的格式,并将数据导入 Bigtable 实例中。

第二种方法使用流式传输来迁移数据。在这种方法中,您通过消息队列(例如 Kafaka)使用 Aerospike Connect 连接到 Aerospike,并将消息实时传输到 Google Cloud 上的 Pub/Sub。当消息到达 Pub/Sub 主题时,Dataflow 流式传输作业会实时处理这些数据,并将数据导入到 Bigtable 实例中。

借助批处理,您可以高效地迁移大数据块。但是,在为新数据库迁移和更新服务时,通常需要足够的停机时间。如果您希望最大限度减少切换停机时间,则可以考虑在首次批处理之后使用流式传输处理来逐步迁移数据,以确保与备份数据保持一致,直到完成逐步切换。在本文档中,您可以对示例应用(包括切换过程)使用批处理来从 Aerospike 迁移。

Aerospike 和 Bigtable 比较

在开始数据迁移之前,您应了解 Aerospike 和 Bigtable 之间的数据模型差异。

Bigtable 数据模型是带有行和列族的分布式多维分类键值对映射。相比之下,Aerospike 数据模型是面向行的数据库,其中每条记录都由键唯一标识。模型之间的区别在于它们如何对实体的属性进行分组。Bigtable 会将相关属性分组到列族中,而 Aerospike 会将属性分组到集中。与 Bigtable 相比,Aerospike 支持更多数据类型。例如,Aerospike 支持整数、字符串、列表和映射。在大多数情况下,Bigtable 会将所有数据视为原始字节字符串

Aerospike 中的架构灵活,同一中的动态值可以具有不同的类型。使用 Aerospike 或 Bigtable 的应用具有相似的灵活性和数据管理职责:应用处理数据类型和完整性约束,而不是依赖于数据库引擎。

Bookshelf 迁移

Bookshelf 应用是一个 Web 应用,用户可在其中存储有关图书的信息,并可查看当前存储在数据库中的所有图书的列表。该应用使用图书标识符 (ID) 来搜索图书信息。该应用或数据库会自动生成这些 ID。当用户选择图书的图片时,应用的后端会从数据库中加载该图书的详细信息。

在本教程中,您将使用 Aerospike 将数据从 Bookshelf 应用迁移到 Bigtable。迁移后,您可以从 Cloud Bigtable 中访问这些图书。

下图展示了如何将数据从 Aerospike 迁移到 Bigtable:

数据迁移步骤。

在上图中,数据迁移方法如下:

  1. 备份当前 Aerospike 数据库中的图书的相关数据,并将数据传输到 Cloud Storage 存储桶。
  2. 当您将备份数据上传到存储桶时,将会使用 Cloud Function 通过 Cloud Storage 更新通知自动触发 as2bt Dataflow 作业。
  3. as2bt Dataflow 作业完成数据迁移后,您将数据库后端从 Aerospike 更改为 Bigtable,以便 Bookshelf 应用从 Bigtable 集群加载图书数据。

目标

  • 部署教程环境以从 Aerospike 迁移到 Bigtable。
  • 在 Cloud Storage 中从 Aerospike 创建应用备份数据集示例。
  • 使用 Dataflow 转移数据架构并将其迁移到 Bigtable。
  • 更改示例应用配置以将 Bigtable 用作后端。
  • 使用 Bigtable 验证 Bookshelf 应用是否正常运行。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

Bigtable 费用根据节点时数、存储的数据量和您使用的网络带宽而定。如需估算 Bigtable 集群和其他资源的费用,您可以使用价格计算器。示例价格计算器设置使用三个 Bigtable 节点而不是单个节点。上例中的预估总费用超过本教程的实际总费用。

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  2. 确保您的 Google Cloud 项目已启用结算功能

  3. 启用 Cloud Resource Manager API。

    启用 API

    Terraform 使用 Cloud Resource Manager API 启用本教程所需的 API。

  4. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

准备环境

如需准备 Aerospike 迁移到 Bigtable 的环境,您可以直接从 Cloud Shell 运行以下工具:

  • Google Cloud CLI
  • gsutil 命令行工具
  • Bigtable 命令行工具 cbt
  • Terraform
  • Apache Maven

这些工具已在 Cloud Shell 中可用,因此您无需再次安装这些工具。

配置您的项目

  1. 在 Cloud Shell 中,检查 Cloud Shell 自动配置的项目 ID。您的命令提示符将会更新以反映您当前活动的项目并采用以下格式显示:USERNAME@cloudshell:~ (PROJECT_ID)$

    如果项目 ID 未正确配置,您可以手动进行配置:

    gcloud config set project <var>PROJECT_ID</var>
    

    PROJECT_ID 替换为您的 Google Cloud 项目 ID。

  2. us-east1 配置为地区,并将 us-east1-b 配置为区域:

    gcloud config set compute/region us-east1
    gcloud config set compute/zone us-east1-b
    

    如需详细了解地区和区域,请参阅地理位置和地区

部署教程环境

  1. 在 Cloud Shell 中,克隆代码库:

     git clone https://github.com/fakeskimo/as2bt.git/
    
  2. 在 Cloud Shell 中,初始化 Terraform 工作目录:

    cd "$HOME"/as2bt/bookshelf/terraform
    terraform init
    
  3. 为部署配置 Terraform 环境变量

    export TF_VAR_gce_vm_zone="$(gcloud config get-value compute/zone)"
    export TF_VAR_gcs_bucket_location="$(gcloud config get-value compute/region)"
    
  4. 查看 Terraform 执行计划:

    terraform plan
    

    输出内容类似如下:

    Terraform will perform the following actions:
    # google_bigtable_instance.bookshelf_bigtable will be created
    + resource "google_bigtable_instance" "bookshelf_bigtable" {
      + display_name  = (known after apply)
      + id            = (known after apply)
      + instance_type = "DEVELOPMENT"
      + name          = "bookshelf-bigtable"
      + project       = (known after apply)
      + cluster {
          + cluster_id   = "bookshelf-bigtable-cluster"
          + storage_type = "SSD"
          + zone         = "us-east1-b"
        }
    }
    
  5. (可选)如需直观呈现 Terraform 部署哪些带有依赖项的资源,请绘制图表

    terraform graph | dot -Tsvg > graph.svg
    
  6. 预配教程环境:

    terraform apply
    

验证教程环境和 Bookshelf 应用

在配置环境之后并在开始数据迁移作业之前,需要验证是否已部署和配置所有资源。本部分介绍如何验证配置过程,并帮助您了解在环境中配置了哪些组件。

验证教程环境

  1. 在 Cloud Shell 中,验证 bookshelf-aerospike Compute Engine 实例:

    gcloud compute instances list
    

    输出显示该实例已部署在 us-east1-b 区域中:

    NAME                 ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP  STATUS
    bookshelf-aerospike  us-east1-b  n1-standard-2               10.142.0.4   34.74.72.3   RUNNING
    
  2. 验证 bookshelf-bigtable Bigtable 实例:

    gcloud bigtable instances list
    

    输出内容类似如下:

    NAME                DISPLAY_NAME        STATE
    bookshelf-bigtable  bookshelf-bigtable  READY
    

    此 Bigtable 实例用作后续步骤的迁移目标。

  3. 验证 bookshelf Cloud Storage 存储桶是否在 Dataflow 流水线作业中:

    gsutil ls -b gs://bookshelf-*
    

    由于 Cloud Storage 存储桶名称必须是全局唯一的,因此会使用随机后缀创建存储桶的名称。输出内容类似如下:

    gs://bookshelf-616f60d65a3abe62/
    

向 Bookshelf 应用添加一本图书

  1. 在 Cloud Shell 中,获取 bookshelf-aerospike 实例的外部 IP 地址:

    gcloud compute instances list --filter="name:bookshelf-aerospike" \
        --format="value(networkInterfaces[0].accessConfigs.natIP)"
    

    记下该 IP 地址,因为下一步需要它。

  2. 如需打开 Bookshelf 应用,请在网络浏览器中转到 http://IP_ADDRESS:8080

    IP_ADDRESS 替换为您从上一步复制的外部 IP 地址。

  3. 如需创建新图书,请点击 添加图书

  4. 添加图书窗口中,填写以下字段,然后单击保存

    • 书名字段中,输入 Aerospike-example
    • 作者字段中,输入 Aerospike-example
    • 发布日期字段中,输入当天的日期。
    • 说明字段中,输入 Aerospike-example

    此图书用于验证 Bookshelf 应用是否使用 Aerospike 作为图书存储。

  5. 在 Bookshelf 应用网址中,记下图书 ID。例如,如果网址为 34.74.80.160:8080/books/10000,则图书 ID 为 10000

    网址中的图书 ID。

  6. 在 Cloud Shell 中,使用 SSH 连接到 bookshelf-aerospike 实例:

    gcloud compute ssh bookshelf-aerospike
    
  7. bookshelf-aerospike 实例会话中,验证是否使用您先前记下的图书 ID 创建了新图书:

    aql -c 'select * from bookshelf.books where id = "BOOK_ID"'
    

    输出内容类似如下:

    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | title                | author               | publishedDate | description          | imageUrl | id      |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    | " Aerospike-example" | " Aerospike-example" | "2000-01-01"  | " Aerospike-example" | ""       | "10000" |
    +----------------------+----------------------+---------------+----------------------+----------+---------+
    1 row in set (0.001 secs)
    

    如果未列出您的图书 ID,请重复执行该步骤以添加新图书

将备份数据从 Aerospike 转移到 Cloud Storage

  1. 在 Cloud Shell 中,从 bookshelf-aerospike 实例会话中,创建 Aerospike 备份文件:

    aql -c "select * from bookshelf.books" --timeout=-1 --outputmode=json \`
        | tail -n +2 | jq -c '.[0] | .[]' \
        | gsutil cp - $(gsutil ls -b gs://bookshelf-*)bookshelf-backup.json
    

    此命令通过以下过程处理数据并创建备份文件:

    • 从 Aerospike 中选择图书信息,并以 JSON prettyprint 格式将其打印出来。
    • 通过使用命令行 JSON 处理器 jq,从输出中删除前两个标题,并将数据转换为以换行符分隔的 JSON (ndjson) 格式。
    • 使用 gsutil 命令行工具将数据上传到 Cloud Storage 存储桶。
  2. 验证 Aerospike 备份文件已上传并且存在于 Cloud Storage 存储桶中:

    gsutil ls gs://bookshelf-*/bookshelf-*\
        gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    
  3. (可选)从 Cloud Storage 存储桶中查看备份文件的内容:

    gsutil cat -r 0-1024 gs://bookshelf-*/bookshelf-backup.json | head -n 2
    

    输出内容类似如下:

    {"title":"book_2507","author":"write_2507","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_2507","createdBy":"write_2507","createdById":"2507_anonymous","id":"2507"}
    {"title":"book_3867","author":"write_3867","publishedDate":"1970-01-01","imageUrl":"https://storage.googleapis.com/aerospike2bt-bookshelf/The_Home_Edit-2019-06-24-044906.jpg","description":"test_3867","createdBy":"write_3867","createdById":"3867_anonymous","id":"3867"}
    
  4. 退出 SSH 会话并返回到 Cloud Shell:

    exit
    

使用 Dataflow 将备份数据迁移到 Bigtable

现在,您可以将备份数据从 Cloud Storage 迁移到 Bigtable 实例。本部分介绍如何使用 Dataflow 流水线来迁移与 Bigtable 架构兼容的数据。

配置 Dataflow 迁移作业

  1. 在 Cloud Shell 中,转到示例代码存储库中的 dataflow 目录:

    cd "$HOME"/as2bt/dataflow/
    
  2. 为 Dataflow 作业配置环境变量:

    export BOOKSHELF_BACKUP_FILE="$(gsutil ls
    gs://bookshelf*/bookshelf-backup.json)"
    export BOOKSHELF_DATAFLOW_ZONE="$(gcloud config get-value compute/zone)"
    
  3. 检查是否已正确配置环境变量:

    env | grep BOOKSHELF
    

    如果正确配置了环境变量,则输出内容类似如下:

    BOOKSHELF_BACKUP_FILE=gs://bookshelf-616f60d65a3abe62/bookshelf-backup.json
    BOOKSHELF_DATAFLOW_ZONE=us-east1-b
    

运行 Dataflow 作业

  1. 在 Cloud Shell 中,将数据从 Cloud Storage 迁移到 Bigtable 实例:

    ./run_oncloud_json.sh
    
  2. 如需监视备份数据迁移作业,则在 Google Cloud 控制台中,前往作业页面。

    前往“作业”

    等待直到作业成功完成。作业成功完成后,Cloud Shell 中的输出内容类似如下:

    Dataflow SDK version: 2.13.0
    Submitted job: 2019-12-16_23_24_06-2124083021829446026
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  08:20 min
    [INFO] Finished at: 2019-12-17T16:28:08+09:00
    [INFO] ------------------------------------------------------------------------
    

检查迁移作业结果

  • 在 Cloud Shell 中,验证备份数据是否已正确转移到 Bigtable:

    cbt -instance bookshelf-bigtable lookup books 00001
    

    输出内容类似如下:

      ----------------------------------------
    00001
      info:author                              @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:description                         @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
      info:id                                  @ 2019/12/17-16:26:04.434000
        "00001"
      info:imageUrl                            @ 2019/12/17-16:26:04.434000
        ""
      info:publishedDate                       @ 2019/12/17-16:26:04.434000
        "2019-10-01"
      info:title                               @ 2019/12/17-16:26:04.434000
        "Aerospike-example"
    

将 Bookshelf 数据库从 Aerospike 更改为 Bigtable

成功将数据从 Aerospike 迁移到 Bigtable 之后,您可以将 Bookshelf 应用配置更改为使用 Bigtable 进行存储。设置此配置时,新图书将保存到 Bigtable 实例中。

更改 Bookshelf 应用配置

  1. 在 Cloud Shell 中,使用 SSH 连接到 bookshelf-aerospike 应用:

    gcloud compute ssh bookshelf-aerospike
    
  2. 验证当前的 DATA_BACKEND 配置为 aerospike

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    输出如下所示:

    DATA_BACKEND = 'aerospike'
    
  3. DATA_BACKEND 配置从 aerospike 更改为 bigtable

    sudo sed -i "s/DATA_BACKEND =.*/DATA_BACKEND = 'bigtable'/g" /opt/app/bookshelf/config.py
    
  4. 验证 DATA_BACKEND 配置已更改为 bigtable

    grep DATA_BACKEND /opt/app/bookshelf/config.py
    

    输出如下所示:

    DATA_BACKEND = 'bigtable'
    
  5. 重启使用新的 bigtable 后端配置的 Bookshelf 应用:

    sudo supervisorctl restart bookshelf
    
  6. 验证 Bookhelf 应用已重启并正常运行:

    sudo supervisorctl status bookshelf
    

    输出内容类似如下:

    bookshelf  RUNNING   pid 18318, uptime 0:01:00
    

验证 Bookshelf 应用正在使用 Bigtable 后端

  1. 在浏览器中,转到 http://IP_ADDRESS:8080
  2. 添加新图书,其名为 Bigtable-example

  3. 如需验证 Bigtable-example 图书是在 Bookshelf 应用创建的 Bigtable 实例中创建的,请从浏览器中的地址栏中复制图书 ID。

  4. 在 Cloud Shell 中,从 Bigtable 实例中查找 Bigtable-example 图书数据:

    cbt -instance bookshelf-bigtable lookup books 7406950188
    

    输出内容类似如下:

    ----------------------------------------
    7406950188
      info:author                              @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:description                         @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
      info:id                                  @ 2019/12/17-17:28:25.592000
        "7406950188"
      info:image_url                           @ 2019/12/17-17:28:25.592000
        ""
      info:published_date                      @ 2019/12/17-17:28:25.592000
        "2019-10-01"
      info:title                               @ 2019/12/17-17:28:25.592000
        "Bigtable-example"
    

您已成功将数据从 Aerospike 迁移到 Bigtable,并更改了 Bookshelf 配置以连接到 Bigtable 后端。

清理

避免产生费用的最简单方法是删除您为本教程创建的 Google Cloud 项目。或者,您也可以删除各个资源。

删除项目

  1. 在 Google Cloud 控制台中,进入管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤