注意

本文档适用于 Ceph 的开发版本。

RGW 数据缓存和 CDN

从 Octopus 版本开始新增。

此功能为 RGW 增加了使用 Nginx 安全缓存对象并从集群中卸载工作负载的能力。首次访问对象后,它将存储在 Nginx 缓存目录中。当数据已缓存时,无需从 RGW 获取。将对 RGW 进行权限检查,以确保请求用户具有访问权限。此功能基于 Nginx 模块 ngx_http_auth_request_modulenginx-aws-auth-module,以及用于 Lua 功能的 OpenResty。

目前,此功能将仅缓存 AWSv4 请求(仅限 S3 请求),在第一次 GET 请求的输出中缓存,在后续 GET 请求中缓存输出,同时透明地传递 PUT、POST、HEAD、DELETE 和 COPY 请求。

此功能引入了 2 个新 API:Auth 和 Cache。

注意

D3N RGW 数据缓存是一种在 RADOS Gateway 中本地实现的替代数据缓存机制。

新 API

此功能有两个新 API

  • Auth API:缓存使用此 API 来验证用户是否可以访问缓存数据。

  • Cache API:增加了安全覆盖 Range 标头的能力,以便 Nginx 可以在 S3 之上使用其自己的智能缓存。使用此 API 可以在客户端请求对象的特定范围时预读对象。在后续访问缓存对象时,Nginx 将满足对已缓存范围的请求。未缓存的范围将从 RGW 读取(并缓存)。

Auth API

此 API 使用 RGW 对客户端凭据和存储的访问策略的了解,验证正在对缓存进行的特定经过身份验证的访问。如果封装的请求将被授予,则返回成功。

Cache API

此 API 旨在允许使用特权缓存用户更改已签名的 Range 标头。

创建缓存用户

radosgw-admin user create --uid=<uid for cache user> --display-name="cache user" --caps="amz-cache=read"

此用户可以将 Cache API 标头 X-Amz-Cache 发送到 RGW。此标头包含来自原始请求的标头(在更改 Range 标头之前)

  • 原始标头之间通过 ASCII 码 177 十进制的字符分隔。

  • 每个原始标头及其值之间通过 ASCII 码 178 十进制的字符分隔。

RGW 将检查用户是否为授权用户以及该值是否为缓存用户。如果两个检查都成功,它将使用 X-Amz-Cache 来重新验证用户是否具有权限,使用存储在 X-Amz-Cache 标头中的原始标头。在此流程中,RGW 将覆盖 Range 标头。

将 Nginx 与 RGW 配合使用

下载 OpenResty 源代码

wget https://openresty.org.cn/download/openresty-1.15.8.3.tar.gz

使用 git 克隆 Nginx AWS 身份验证模块

git clone https://github.com/kaltura/nginx-aws-auth-module

解压 OpenResty 包

tar xvzf openresty-1.15.8.3.tar.gz
cd openresty-1.15.8.3

编译 OpenResty,确保您有 pcre 库和 openssl

sudo yum install pcre-devel openssl-devel gcc curl zlib-devel nginx
./configure --add-module=<the nginx-aws-auth-module dir> --with-http_auth_request_module --with-http_slice_module --conf-path=/etc/nginx/nginx.conf
gmake -j $(nproc)
sudo gmake install
sudo ln -sf /usr/local/openresty/bin/openresty /usr/bin/nginx

将您的 Nginx 配置文件放到适当位置,并根据您的环境进行编辑

示例 Nginx 配置文件位于 https://github.com/ceph/ceph/tree/main/examples/rgw/rgw-cache

  • nginx.conf 应位于 /etc/nginx/nginx.conf

  • nginx-lua-file.lua 应位于 /etc/nginx/nginx-lua-file.lua

  • nginx-default.conf 应位于 /etc/nginx/conf.d/nginx-default.conf

最可能需要根据环境调整的参数位于文件 nginx-default.conf 中。

修改 proxy_cache_pathmax_size 的示例值

proxy_cache_path /data/cache levels=2:2:2 keys_zone=mycache:999m max_size=20G inactive=1d use_temp_path=off;

并修改示例 server 值以指向 RGW URI

server rgw1:8000 max_fails=2 fail_timeout=5s;
server rgw2:8000 max_fails=2 fail_timeout=5s;
server rgw3:8000 max_fails=2 fail_timeout=5s;
重要的是将 nginx.conf 文件中的*access key* 和 *secret key* 替换为具有 amz-cache caps 的用户所拥有的密钥。
例如,创建缓存用户如下
radosgw-admin user create --uid=cacheuser --display-name="cache user" --caps="amz-cache=read" --access-key <access> --secret <secret>

可以使用 Nginx slicing,这适用于流媒体目的。

要启用分片,您应该使用 nginx-slicing.conf 而不是 nginx-default.conf

如果您不想使用预取缓存,可以将 nginx-default.conf 替换为 nginx-noprefetch.conf。如果禁用预取缓存,Nginx 将单独缓存每个范围请求,并且范围请求中可能存在的重叠将多次获取。例如,如果客户端发送一个 0-4095 的范围请求,然后发送一个 0-4096 的范围请求,则两个请求都将完全从 RGW 获取。

运行 Nginx (OpenResty)

systemctl restart nginx

附录

关于性能的注意事项:在某些情况下,例如开发环境,禁用身份验证可能会(取决于硬件)显著提高性能,因为它避免了对 RADOS Gateway 的 auth API 调用。这可以通过注释掉 nginx-default.conf 中的以下行来完成

#auth_request /authentication;

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入