自动分层 Ceph 对象存储 - PART 2

Steven Umbehocker (OSNexus)

自动分层 Ceph 对象存储 - PART 2

在本文中,我们将进入编写一个简单的 Lua 脚本的有趣部分,以开始自动分层(组织)S3 对象到正确的池中,通过在对象上传(S3 PUT)时动态更改存储类设置来实现。

如果您尚未阅读 PART 1,请在此处查看 此处,因为它为我们在这里 PART 2 中所做的工作奠定了基础。

为什么自动分层很重要

拥有不同的层级(存储类)对于成本节省和性能考虑都非常重要。正如我们在 PART 1 中讨论的那样,如果您上传数百万个 1K 的小对象,通常不建议将这些对象写入编码擦除的数据池。速度会很慢,您会浪费大量空间,用户会不满意。但关键是让对象自动分配到合适的存储类,因为用户通常不会费心对它们进行分类。

alt_text

重新回顾 PART 1 中的图表,我们将再次在 PART 2 中使用此示例来编写 Lua 脚本。

在进入 Lua 之前,非常感谢 Yuval Lifshitz 和他的团队实现了我们今天讨论的功能。该功能当然是能够将 Lua 脚本注入到 CephRGW(CephRGW = Ceph Rados Gateway = S3 协议网关)中,以便我们可以执行自动分层等有趣的操作。

我还想强调 Anthony D’Atri 和 Curt Bruns 所做的 Lua 脚本和讨论,您可以在 YouTube 这里 找到,这给了我这个系列的灵感。在该视频中,您将看到他们如何开发一个 Lua 脚本来基于 TLC 和 QLC 的 NVMe 存储之间进行自动分层,强烈推荐。

一个基本的 Lua 示例

我们将从一个基本的示例开始,并借鉴 Curt & Anthony 的 Lua 脚本。在这个脚本中,我们将把对象分配到三个不同的存储类,这些存储类是在 PART 1 的示例中定义的。这些存储类是 STANDARD(用于大于 1MB 的对象)、MEDIUM_OBJ(用于 16K 到 1MB 之间的对象)和 SMALL_OBJ(用于小于 16K 的所有对象)。

-- Lua script to auto-tier S3 object PUT requests

-- exit script quickly if it is not a PUT request
if Request == nil or Request.RGWOp ~= "put_obj"
then
  return
end

-- apply StorageClass only if user hasn't already assigned a storage-class
if Request.HTTP.StorageClass == nil or Request.HTTP.StorageClass == '' then
  if Request.ContentLength < 16384 then
    Request.HTTP.StorageClass = "SMALL_OBJ"
  elseif Request.ContentLength < 1048576 then
    Request.HTTP.StorageClass = "MEDIUM_OBJ"
  else
    Request.HTTP.StorageClass = "STANDARD"
  end
  RGWDebugLog("applied '" .. Request.HTTP.StorageClass .. "' to object '" .. Request.Object.Name .. "'")
end

将 Lua 脚本安装到 CephRGW 中

接下来,您将把上面的 Lua 脚本保存到一个名为 autotier.lua 的文件中,然后您可以像这样将其安装到 CephRGW 网关中

radosgw-admin script put --infile=./autotier.lua --context=preRequest

无需重新启动 CephRGW 实例,脚本会立即对您区域中的所有 RGW 实例生效。但是,如果您正在进行更高级的脚本编写并添加一个新的 Lua 包,那么 CephRGW 实例需要在区域中的所有节点上重新启动一次,如下所示

# sudo systemctl restart ceph-radosgw@radosgw.*

alt_text

如图所示,有关每个请求(包括 S3 PUT 请求)的对象信息会发送到我们的 autotier.lua 脚本。在那里,我们能够动态更新 Request.HTTP.StorageClass 的值,以便将我们的对象路由到最佳数据池。现在,只需将一些对象上传到任何存储桶,您就会看到它们被路由到不同的数据池,这取决于 autotier.lua 脚本应用的动态分配的 StorageClass 值。

调试

为了调试脚本并查看通过 RGWDebugLog 消息发生的情况,我们需要在 CephRGW 中启用调试模式,这通过编辑 ceph.conf,将“debug rgw 20”添加到 RGW 部分,然后重新启动 CephRGW 来完成。这是我的 radosgw 部分的样子,您可以忽略所有内容,除了添加到末尾的两个调试选项。

[client.radosgw.smu-80]
        admin_socket = /var/run/ceph/ceph-client.radosgw.smu-80.asok
        host = smu-80
        keyring = /etc/ceph/ceph.client.radosgw.keyring
        log file = /var/log/radosgw/client.radosgw.smu-80.log
        rgw dns name = smu-80.osnexus.net
        rgw frontends = beast endpoint=10.0.8.80:7480
        rgw print continue = false
        rgw zone = us-east-1
        debug rgw = 20

现在我们重新启动 CephRGW 以应用添加到 ceph.conf 的调试设置。有几种方法可以 动态启用调试模式 而无需更改 ceph.conf,例如(ceph config set client.radosgw.smu-80 debug_rgw 20),但通常最好更新 ceph.conf,以便在重新启动之间保存您的调试模式设置。

# sudo systemctl restart ceph-radosgw@radosgw.*

最后,让我们查看日志,在 RHEL 上,您会在 /var/log/ceph/FSID/ 下找到日志,但我将我的日志文件设置为这里 /var/log/radosgw/client.radosgw.smu-80.log,所以我使用它来查看 Lua 调试消息

# tail -f  /var/log/radosgw/client.radosgw.smu-80.log | grep Lua

现在我可以看到所有关于对象如何被标记的消息,因为我将对象上传到对象存储中。

2024-02-14T06:08:11.257+0000 7f16a8dc1700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:12.345+0000 7f171569a700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:13.389+0000 7f16a55ba700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:14.465+0000 7f1742ef5700 20 Lua INFO: applied 'MEDIUM_OBJ' to object 'security_features_2023.pdf'
2024-02-14T06:08:42.928+0000 7f16d7e1f700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:44.012+0000 7f1680570700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:45.056+0000 7f1674558700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'
2024-02-14T06:08:46.092+0000 7f1664d39700 20 Lua INFO: applied 'SMALL_OBJ' to object 'whitepaper.docx'

测试

要测试这一点,您需要上传一些不同大小的对象,您会看到存储类标签动态地应用到它们。请注意,如果您将“PERFORMANCE”之类的标签分配给 PUT 请求,但您尚未配置它,那么您的数据将只是路由到与“STANDARD”存储类关联的池中,通常是 rgw.default.bucket.data,如果您有默认配置。

总结

希望您喜欢这个关于使用 Lua 自动分层 Ceph 对象存储的教程。在最后一部分,PART 3 中,我们将深入研究使用 QuantaStor 6 从头开始设置具有三个存储类的 Ceph 对象集群。我们将在 YouTube 上发布一个配套视频,我们将介绍设置所有内容,然后我们将进入更多的 CephRGW Lua 脚本编写,我们将根据特定的文件名扩展来组织对象,而不仅仅是按大小。最后,感谢 Anthony D’Atri 和 Yuval Lifshitz 在审查和校对这些文章方面提供的帮助。