注意

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

RGW 数据缓存和 CDN

Octopus 版本中的新增功能。

此功能为 RGW 添加了安全缓存对象和将工作负载从集群中卸载的能力,使用 Nginx。https://github.com/kaltura/nginx-aws-auth-module, Openresty 用于 Lua 功能。

目前,此功能将仅缓存 AWSv4 请求(仅 s3 请求),缓存第 1 次 GET 请求的输出并在后续 GET 请求中进行缓存,透明地传递 PUT、POST、HEAD、DELETE 和 COPY 请求。

此功能引入了 2 个新 API:认证和缓存。

注意:TheD3N RGW 数据缓存是 RADOS Gateway 中实现的替代数据缓存机制。

新 API

此功能有 2 个新 API:

认证 API - 缓存使用此 API 来验证用户是否可以访问缓存数据

缓存 API - 添加了安全覆盖范围头的能力,这样 Nginx 就可以在 S3 之上使用自己的智能缓存:https://www.nginx.com/blog/smart-efficient-byte-range-caching-nginx/使用此 API 可以在客户端请求对象特定范围时预读对象。

认证 API

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

缓存 API

此 API 的目的是允许使用特权用户(缓存用户)更改签名范围头。

创建缓存用户

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

此用户可以向 RGW 发送缓存 API 头X-Amz-Cache,此头包含原始请求的标头(更改范围头之前)。这意味着X-Amz-Cache由多个头组成。X-Amz-Cache头的标头由 ASCII 码为 177 的字符分隔,标头名称和值由 ASCII 码为 178 的字符分隔。X-Amz-Cache来重新验证用户是否有权限,使用 X-Amz-Cache 中的标头。

使用 Nginx 与 RGW

下载 Openresty 的源代码:

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

克隆 AWS 认证 Nginx 模块:

$ 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 conf 文件都在: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;

并修改示例服务器值以指向 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中的那些属于具有amz-cache权能
用户,例如,创建用户缓存如下:
radosgw-admin user create --uid=cacheuser --display-name="cache user" --caps="amz-cache=read" --access-key <access> --secret <secret>

可以使用 Nginx 切片,这对于流式传输来说是一种更好的方法。

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

关于 Nginx 切片的更多信息:

https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/#byte-range-caching

如果您不想使用预取缓存,可以替换nginx-default.conf with nginx-noprefetch.conf使用noprefetch意味着如果客户端发送范围请求 0-4095 然后是 0-4096,Nginx 将分别缓存这些请求,因此它需要两次获取这些请求。

运行 Nginx(openresty):

$ sudo systemctl restart nginx

附录

关于性能的说明:在某些情况下,如开发环境,通过在nginx-default.conf:

#auth_request /authentication;

中注释掉以下行,可以(取决于硬件)显著提高性能,因为它省略了对 radosgw 的认证 API 调用。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.