注意
本文档适用于 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_path和max_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;
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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.