对于大量不需要快速访问的数据,建议你使用 Apache Pulsar 的内置功能——​分层存储​。它也是 Pulsar 分片架构的原生优势。

通过分层存储,你可以从 Apache BookKeeper 卸载数据到可扩展、无限的廉价云原生存储(例如 Google Cloud Storage、AWS S3)或文件系统,构建高性能的消息集群,并降低运维成本。

Google Cloud Storage (GCS) offloader 是 StreamNative Hub 上托管的一个 Pulsar 插件。

https://hub.streamnative.io/offloaders/gcs/2.5.1

本文将详细介绍如何​通过 GCS offloader 将存储在 BookKeeper 中的数据卸载至 GCS。


安装

请按照以下步骤安装 GCS offloader。

准备工作

Apache jclouds:2.2.0 或更高版本

步 骤

1. 选择以下任一方式下载 Pulsar 压缩包:

  • 从 Apache mirror 下载:
    https://archive.apache.org/dist/pulsar/pulsar-2.5.1/apache-pulsar-2.5.1-bin.tar.gz

  • 从 Pulsar 下载页面下载
    https://pulsar.apache.org/download

  • 通过 wget 命令下载
    https://www.gnu.org/software/wget

wget https://archive.apache.org/dist/pulsar/pulsar-2.5.1/apache-pulsar-2.5.1-bin.tar.gz

2. 下载并解压 Pulsar offloaders 安装包。

wget https://downloads.apache.org/pulsar/pulsar-2.5.1/apache-pulsar-offloaders-2.5.1-bin.tar.gz


tar xvfz apache-pulsar-offloaders-2.5.1-bin.tar.gz

注意:

  • 在裸机集群中运行 Pulsar 时,需要保证每个 broker 所在的 Pulsar 目录中,都有 `offloaders` 解压缩后的安装文件。

  •  在 Docker 中运行 Pulsar 或使用 Docker image(例如 K8S、DCOS)部署 Pulsar 时,可以使用 `apachepulsar/pulsar-all` image 而不使用 `apachepulsar/pulsar` image。`apachepulsar/pulsar-all` image 已经捆绑了分层存储 offloaders。

3. 在本地 Pulsar 目录中创建 offloader 文件夹,将解压后的 Pulsar offloaders 文件复制到此处。

mv apache-pulsar-offloaders-2.5.1/offloaders apache-pulsar-2.5.1/offloaders


ls offloaders

输出

如下输出所示,Pulsar 通过 Apache jclouds 支持 GCS 和 AWS S3 。 

tiered-storage-file-system-2.5.1.nar
tiered-storage-jcloud-2.5.1.nar

使用

以下内容为在 Pulsar 中使用 GCS offloader 的详细步骤。

第 1 步:配置 GCS offloader driver

在使用 GCS offloader 之前,需要为 GCS offloader driver 配置一些属性。更多关于如何配置 GCS offloader driver 属性的信息,可以参阅:

https://hub.streamnative.io/offloaders/gcs/2.5.1/#configuration

本示例假设已在 `standalone.conf` 中进行了如下配置,并以​单机​模式运行 Pulsar。

managedLedgerOffloadDriver=google-cloud-storage
gcsManagedLedgerOffloadBucket=pulsar-topic-offload-1
gcsManagedLedgerOffloadRegion=europe-west3
gcsManagedLedgerOffloadServiceAccountKeyFile=/Users/user-name/Downloads/affable-ray-226821-6251d04987e9.json
offloadersDirectory=offloaders
managedLedgerMinLedgerRolloverTimeMinutes=2
managedLedgerMaxEntriesPerLedger=5000

------

第 2 步:创建 GCS 存储分区

1. 进入 Google Cloud 控制台(https://console.cloud.google.com/) ,在左边侧栏选择 ​Storage​。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_数据库

2. 选择​浏览器​,然后点击​创建存储分区​。

为了确保 broker 可以访问存储分区,需要为服务账号设置 ​Storage Object Creator ​和 ​Storage Object Viewer​。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_大数据_02


3. 设置存储分区的名称。

Bucket 名称应与在第 1 步配置的 `gcsManagedLedgerOffloadBucket` 值一致。

更多关于 `gcsManagedLedgerOffloadBucket`的信息,可以参阅:

https://hub.streamnative.io/offloaders/gcs/2.5.1/#step-1-configure-gcs-offloader-driver

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_hadoop_03

4. 设置存储分区。

存储分区应与在第 1 步配置的 `gcsManagedLedgerOffloadRegion` 值一致。

更多关于 `gcsManagedLedgerOffloadRegion` 的信息,可以参阅:

https://hub.streamnative.io/offloaders/gcs/2.5.1/#step-1-configure-gcs-offloader-driver

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_java_04

5. 点击​创建​。

现在,你已经成功创建了一个 GCS 存储分区。

------

第 3 步:创建 GCS 服务账号

1. 进入 Google Cloud 控制台 ,在左边侧栏选择 ​IAM 和管理​。


使用 GCS offloader 卸载存储在 BookKeeper 中的数据_运维_05

2. 选择​服务账号​,然后点击​创建服务账号​。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_大数据_06

3. 设置​服务账号名称​。

创建服务账号后,服务账号 ID 会自动创建。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_运维_07

4. 点击​创建​。

5. 为服务账号​授权,​点击​下一步​。

6. 点击​创建密钥​。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_运维_08

7. 选择 ​JSON​ 后点击​创建​,然后选择​将生成的 JSON 文件保存到本地​。


JSON 文件应与在第 1 步配置的 `gcsManagedLedgerOffloadServiceAccountKeyFile` 值一致。


更多关于 `gcsManagedLedgerOffloadServiceAccountKeyFile` 的信息,可以参阅:

https://hub.streamnative.io/offloaders/gcs/2.5.1/#step-1-configure-gcs-offloader-driver

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_java_09

8. 复制 JSON 文件中的密钥 ID 到​密钥 ID​ 对话框,然后点击​完成​。

------

第 4 步:为 GCS 服务账号分配权限

1. 在 ​IAM 和管理​页面,点击 ​IAM​,然后点击​添加​。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_运维_10

2. 填写在第 3 步创建的 GCS 服务账号名称。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_数据库_11

3. 为服务账号设置 ​Storage Object Creator​ 和 ​Storage Object Viewer​ 权限。

4. 点击​保存​。

------

第 5 步:从 BookKeeper 卸载数据到 GCS

以下命令均在本地 Pulsar 所在的文件夹(例如 `~/path/to/apache-pulsar-2.5.1`)中执行。

1. 启动 Pulsar(单机模式)。

./bin/pulsar standalone -a 127.0.0.1

2. 为确保生成的数据不会被立刻删除,建议设置保留策略。

https://pulsar.apache.org/docs/en/next/cookbooks-retention-expiry/#retention-policies


保留策略可以设置为​大小​限制或​时间​限制,设置的值越大,数据保留的时间越长。

./bin/pulsarctl namespaces set-retention public/default --size -10G --time 3d

更多关于 `pulsarctl namespaces set-retention options` 命令的信息(包括 flags、说明、默认值、快捷键等),可以 参阅:

https://streamnative.io/docs/pulsarctl/v0.4.0/#-em-set-retention-em-

3. 使用 pulsar-perf 生产数据。

./bin/pulsar-perf produce -r 1000 -s 2048 test-topic

4. Ledger 发生切换后,卸载操作才会开始。为了确保卸载操作成功执行,建议多等待几个 ledger 发生切换。前文配置的保留策略也是为了保证 ledger 在切换时,数据不会被 broker 删除。

如需查看 ledger 信息,可以使用 `pulsarctl topics internal-stats option` 命令。

./bin/pulsarctl topics internal-stats test-topic

输出

以下输出中显示 ledge 已发生切换:已存在 ledger 10、ledger 11 和 ledger 12。

"entriesAddedCounter" : 107982,
"numberOfEntries" : 107982,
"totalSize" : 508276193,
"currentLedgerEntries" : 1953,
"currentLedgerSize" : 9167863,
"lastLedgerCreatedTimestamp" : "2020-05-12T00:07:27.273+08:00",
"waitingCursorsCount" : 0,
"pendingAddEntriesCount" : 1,
"lastConfirmedEntry" : "12:1951",
"state" : "LedgerOpened",
"ledgers" : [ {
"ledgerld" : 10,
"entries" : 52985,
"size" : 249500259,
"offloaded" : false
}, {
"ledgerld" : 11,
"entries" : 53045,
"size" : 249614295,
"offloaded" : false
}, {
"ledgerId" : 12,
"entries" : 0,
"size" : 0,
"offloaded" : false
}, ]
"cursors" : { }

更多关于 `pulsarctl topics internal-stats options` 命令的信息(包括 flags、说明、默认值、快捷键等),可以参阅:

https://streamnative.io/docs/pulsarctl/v0.4.0/#-em-internal-stats-em-

5. Ledger 切换后,你可以手动触发卸载操作(如下所示)。

另外,你也可以设置自动触发卸载操作。更多关于如何设置自动触发卸载操作,可以参阅:

https://hub.streamnative.io/offloaders/gcs/2.5.1/#configure-gcs-offloader-to-run-automatically

./bin/pulsarctl topics offload --size-threshold 10M public/default/test-topic

输出


Offload triggered for persistent://public/default/test-topic for messages before 12:0:-1

更多关于 `pulsarctl topics offload options` 命令的信息(包括 flags、说明、默认值、快捷键等),可以参阅:

https://streamnative.io/docs/pulsarctl/v0.4.0/#-em-offload-em-

6. 检查卸载操作的状态。   

./bin/pulsarctl topics offload-status -w public/default/test-topic

卸载操作可能会需要一段时间。

输出

Offload was a success

更多关于 `pulsarctl topics offload-status options` 命令的信息(包括 flags、说明、默认值、快捷键等),可以参阅:

https://streamnative.io/docs/pulsarctl/v0.4.0/#-em-offload-status-em-

操作完成后,数据成功卸载到 GCS。

使用 GCS offloader 卸载存储在 BookKeeper 中的数据_java_12

视频演示

点击观看如何在 Pulsar 中使用 GCS offloader 的分步演示。

想要随时掌握 Pulsar 的研发进展、用户案例和热点话题吗?快来关注 Apache Pulsar 和 StreamNative 微信公众号,我们第一时间在这里分享与 Pulsar 有关的一切。