对象网关配置和管理指南

Red Hat Ceph Storage 4

配置和管理 Ceph 存储对象网关

摘要

本文档提供有关配置和管理 Ceph 存储对象网关的说明。
红帽承诺替换我们的代码、文档和网页属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。这些更改将在即将发行的几个发行本中逐渐实施。详情请查看 CTO Chris Wright 信息

第 1 章 概述

Ceph 对象网关(也称为 RADOS 网关(RGW))是在 librados 基础上构建的对象存储接口,为应用提供 Ceph 存储群集的 RESTful 网关。Ceph 对象网关支持两个接口:

  1. S3 兼容: 提供对象存储功能,与 Amazon S3 RESTful API 的大子集兼容。
  2. Swift 兼容: 提供对象存储功能,与 OpenStack Swift API 的大子集兼容。

Ceph 对象网关是与 Ceph 存储集群交互的服务器。由于它提供与 OpenStack Swift 和 Amazon S3 兼容的接口,Ceph 对象网关具有自己的用户管理。Ceph 对象网关可以将数据存储到同一个 Ceph 存储群集中,用于存储来自 Ceph 块设备客户端的数据;但是,它将涉及单独的池,可能会涉及到不同的 CRUSH 层次结构。S3 和 Swift API 共享一个通用命名空间,因此您可以通过一个 API 写入数据,并在另一个 API 检索数据。

gateway
警告

不要对 RGW 使用的池使用 RADOS 快照。这样做可能会导致不必要的数据不一致。

第 2 章 Configuration

2.1. Beast 和 CivetWeb 前端 web 服务器

Ceph 对象网关提供 Beast 和 CivetWeb 作为前端,都是 C/C++ 嵌入式 Web 服务器。

beast

从 Red Hat Ceph Storage 4 开始,Beast 是默认的前端 Web 服务器。从红帽 Ceph 存储 3 升级时,rgw_frontends 参数会自动更改为 Beast。Beast 使用 Boost.Beast C++ 库来解析 HTTP,并使用 Boost.Asio 进行异步网络 I/O。

CivetWeb

在 Red Hat Ceph Storage 3 中,CivetWeb 是默认的前端,但 Beast 也可通过相应地设置 rgw_frontends 选项来使用。Civetweb 是 HTTP 库,它是 Mongoose 项目的一个分支。

2.2. 使用 Beast 前端

Ceph 对象网关将 CivetWeb 和 Beast 嵌入式 HTTP 服务器作为前端提供。Beast 前端使用 Boost.Beast 库进行 HTTP 解析,Beast 前端将 Boost.Asio 库用于异步网络 I/O。在 Red Hat Ceph Storage 版本 3.x 中,CivetWeb 是默认的前端,若要使用红帽 Ceph 存储配置文件中的 rgw_frontends 指定 Beast 前端。自 Red Hat Ceph Storage 版本 4.0 起,Beast 前端默认为 4.0,从 Red Hat Ceph Storage 3.x 升级会自动将 rgw_frontends 参数改为 Beast。

其它资源

2.3. Past 配置选项

以下 Beast 配置选项可以传递到 RADOS 网关的 Ceph 配置文件中的嵌入式 Web 服务器:每个选项都有一个默认值。如果没有指定值,则默认值为空。

选项描述默认

endpointssl_endpoint

以地址 [ :port] 形式设置侦听地址,其中地址是以十进制格式的 IPv4 地址字符串,或者方括号括起的十六进制表示法中的 IPv6 地址。可选的端口默认为 endpoint8080ssl_endpoint 的可选端口则默认为 443。它可以在 endpoint=[::1] endpoint=192.168.0.100:8000 中多次指定。

ssl_certificate

用于启用 SSL 端点的 SSL 证书文件路径。如果文件是包含多个项目的 PEM 文件,则顺序非常重要。文件必须以 RGW 服务器密钥、任何中间证书开头,最后是 CA 证书。

ssl_private_key

用于启用 SSL 端点的私钥文件的可选路径。如果未提供文件,则使用 ssl_certificate 指定的文件作为私钥。

tcp_nodelay

某些环境的性能优化.

request_timeout_ms

为 Beast 前端设置显式请求超时。设置较大的请求超时可使网关更具灵活性的缓慢客户端(例如,通过高延迟网络连接的客户端)。

65

使用 SSL 的 Beast 选项的 /etc/ceph/ceph.conf 文件示例:

...

[client.rgw.node1]
rgw frontends = beast ssl_endpoint=192.168.0.100:443 ssl_certificate=<path to SSL certificate>

注意

默认情况下,Beast 前端写入一个访问日志行,记录服务器处理的所有请求到 RADOS 网关日志文件。

其它资源

2.4. 更改 CivetWeb 端口

使用 Ansible 安装 Ceph 对象网关时,它会将 CivetWeb 配置为在端口 8080 上运行。Ansible 通过在 Ceph 配置文件中添加类似如下的行来实现此操作:

rgw frontends = civetweb port=192.168.122.199:8080 num_threads=100
重要

如果 Ceph 配置文件不包含 rgw frontends = civetweb 行,Ceph 对象网关侦听端口 7480。如果它包含 rgw_frontends = civetweb 行,但没有指定端口,Ceph 对象网关侦听端口 80

重要

由于 Ansible 将 Ceph 对象网关配置为侦听端口 8080,并且安装红帽 Ceph 存储 4 的支持方式是使用 ceph-ansible所以端口 8080 被视为红帽 Ceph 存储 4 文档中的默认端口。

先决条件

  • 正在运行的红帽 Ceph 存储 4.1 集群.
  • Ceph 对象网关节点.

流程

  1. 在网关节点上,打开 /etc/ceph/ 目录中的 Ceph 配置文件。
  2. 查找类似以下示例的 Ceph 对象网关(RGW)客户端部分:

    [client.rgw.gateway-node1]
    host = gateway-node1
    keyring = /var/lib/ceph/radosgw/ceph-rgw.gateway-node1/keyring
    log file = /var/log/ceph/ceph-rgw-gateway-node1.log
    rgw frontends = civetweb port=192.168.122.199:8080 num_threads=100

    [client.rgw.gateway-node1] 标题将 Ceph 配置文件的这一部分标识为配置 Ceph 存储集群客户端,其中客户端类型是由 rgw 标识的 Ceph 对象网关,节点的名称则是 gateway-node1

  3. 将默认 Ansible 配置的端口 8080 更改为 80,编辑 rgw frontends 行:

    rgw frontends = civetweb port=192.168.122.199:80 num_threads=100

    确保 rgw_frontends 键/值对中的 port= port-number 之间没有空格。

    在您要更改端口的任何其他网关节点上重复此步骤。

  4. 从每个网关节点重启 Ceph 对象网关服务,使新端口设置生效:

    # systemctl restart ceph-radosgw.target
  5. 确定在每个网关节点的防火墙中打开配置的端口:

    # firewall-cmd --list-all
  6. 如果没有打开端口,请添加端口并重新载入防火墙配置:

    # firewall-cmd --zone=public --add-port 80/tcp --permanent
    # firewall-cmd --reload

2.5. 将 SSL 与 Civetweb 一起使用

在 Red Hat Ceph Storage 1 中,对 Ceph 对象网关的 Civetweb SSL 支持依赖于 HAProxy 和 keepalived。在 Red Hat Ceph Storage 2 及更新的版本中,Civetweb 可以使用 OpenSSL 库来提供传输层安全性(TLS)。

重要

生产部署 MUST 使用 HAProxy 和 keepalived 在 HAProxy 终止 SSL 连接。建议仅通过 Civetweb 使用 SSL 进行 中小型 测试和预生产 部署。

若要将 SSL 与 Civetweb 一起使用,请从与网关节点主机名匹配的证书颁发机构(CA)获取证书。红帽建议从具有 主题备用名称 字段的 CA 获取证书,并使用通配符与 S3 样式子域一起使用。

Civetweb 需要在单个 .pem 文件中提供密钥、服务器证书以及任何其他证书颁发机构或中间证书。

重要

a .pem 文件包含 secret key。保护 .pem 文件免受未经授权的访问。

若要配置 SSL 的端口,请将端口号添加到 rgw_frontends,并将 s 附加到端口号,以指明它是一个安全端口。另外,使用指向 .pem 文件的路径添加 ssl_certificate。例如:

[client.rgw.{hostname}]
rgw_frontends = "civetweb port=443s ssl_certificate=/etc/ceph/private/server.pem"

2.6. Civetweb 配置选项

以下 Civetweb 配置选项可以传递到 RADOS 网关的 Ceph 配置文件中的嵌入式 Web 服务器:每个选项都有一个默认值,如果没有指定值,则默认值为空。

选项描述默认

access_log_file

用于访问日志的文件的路径。完整路径或相对于当前工作目录的相对路径。如果不存在(默认),则不会记录访问权限。

error_log_file

错误日志的文件路径。完整路径或相对于当前工作目录的相对路径。如果缺少 (默认),则不会记录错误.

num_threads

worker 线程数量。Civetweb 在一个单独的线程中处理每个传入的连接。因此,此选项的值实际上就是 Civetweb 可以处理的并发 HTTP 连接数。

50

request_timeout_ms

网络读取和网络写入操作的超时,以毫秒为单位。如果客户端计划保持长时间的连接,可以增加这个值或(更好)使用 keep-alive 消息。

30000

以下是设置了其中一些选项的 /etc/ceph/ceph.conf 文件示例:

...

[client.rgw.node1]
rgw frontends = civetweb request_timeout_ms=30000 error_log_file=/var/log/radosgw/civetweb.error.log access_log_file=/var/log/radosgw/civetweb.access.log

CivetWeb 和 Beast 前端均将服务器处理的所有请求的访问日志文件写入 RADOS 网关日志文件。

2.7. 向 DNS 添加通配符

要将 Ceph 与 S3 样式子域搭配使用,如 bucket-name.domain-name.com,请向 DNS 服务器的 DNS 记录添加通配符,供 ceph-radosgw 守护进程用于解析域名。

对于 dnsmasq,使用主机名前的句点(.)添加以下地址设置:

address=/.{hostname-or-fqdn}/{host-ip-address}

例如:

address=/.gateway-node1/192.168.122.75

对于 绑定,向 DNS 记录添加一个通配符。例如:

$TTL    604800
@       IN      SOA     gateway-node1. root.gateway-node1. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      gateway-node1.
@       IN      A       192.168.122.113
*       IN      CNAME   @

重启 DNS 服务器并使用子域对服务器发出 ping 命令,以确保 ceph-radosgw 守护进程可以处理子域请求:

ping mybucket.{hostname}

例如:

ping mybucket.gateway-node1

如果 DNS 服务器位于本地计算机上,您可能需要通过为本地机器添加 nameserver 条目来修改 /etc/resolv.conf

最后,使用 rgw_dns_name = {hostname } 设置在 Ceph 配置文件的相应 [client.rgw.{instance} ] 部分中指定 DNS 服务器的主机名或地址。例如:

[client.rgw.rgw1.rgw0]
...
rgw_dns_name = {hostname}
注意

作为最佳实践,请在中央位置(如管理节点或 ceph-ansible )更改 Ceph 配置文件,并根据需要重新分发配置文件,以确保集群间的一致性。

最后,重新启动 Ceph 对象网关,以使 DNS 设置生效。

2.8. 调整日志记录和调试输出

完成设置过程后,检查日志输出以确保它满足您的需要。如果遇到与配置相关的问题,您可以在 Ceph 配置文件的 [global] 部分中增加日志和调试消息,并重新启动网关,以帮助对所有配置问题进行故障排除。例如:

[global]
#append the following in the global section.
debug ms = 1
debug civetweb = 20

对于 RGW 调试日志,在 Ceph 配置文件的 [client.rgw.{instance}] 部分中添加以下参数:

[client.rgw.rgw1.rgw0]
...
debug rgw = 20

您还可以在运行时修改这些设置。例如:

# ceph tell osd.0 injectargs --debug_civetweb 10/20

默认情况下,Ceph 日志文件位于 /var/log/ceph 中。

有关日志记录和调试的一般详情,请参见《 红帽 Ceph 存储配置指南》中的 Ceph 调试和日志记录 配置 部分。

2.9. S3 服务器端加密

Ceph 对象网关支持为 S3 应用编程接口(API)对上载对象进行服务器端加密。服务器端加密意味着 S3 客户端以未加密的形式通过 HTTP 发送数据,而 Ceph 对象网关以加密的形式将数据存储在红帽 Ceph 存储群集中。

注意

红帽不支持静态大型对象(SLO)或动态大对象(DLO)的 S3 对象加密。

重要

若要使用加密,客户端请求 MUST 通过 SSL 连接发送请求。除非 Ceph 对象网关使用 SSL,否则红帽不支持从客户端进行 S3 加密。但是,出于测试目的,管理员可以在测试期间禁用 SSL,方法是 在运行时rgw_crypt_require_ssl 配置设置设置为 false,在 Ceph 配置文件中将其设置为 false,并在 Ansible 配置文件中将其设置为 false,并代表 Ceph 对象网关的 Ansible playbook。

在生产环境中,可能无法通过 SSL 发送加密的请求。在这种情况下,使用 HTTP 和服务器端加密发送请求。

有关如何使用服务器端加密配置 HTTP 的详情,请参考下面 的附加资源 部分。

管理加密密钥有两个选项:

客户提供的键

在使用客户提供的密钥时,S3 客户端会传递加密密钥以及每个请求来读取或写入加密数据。客户负责管理这些密钥。客户必须记住用于加密每个对象的 Ceph 对象网关的关键是什么。

Ceph 对象网关根据 Amazon SSE-C 规范在 S3 API 中实施客户提供的关键行为。

由于客户处理密钥管理,并且 S3 客户端将密钥传递到 Ceph 对象网关,因此 Ceph 对象网关不需要特殊配置来支持这种加密模式。

密钥管理服务

在使用密钥管理服务时,安全密钥管理服务存储密钥,Ceph 对象网关则按需检索密钥,为数据加密或解密请求提供服务。

Ceph 对象网关根据 Amazon SSE-KMS 规范在 S3 API 中实施关键管理服务行为。

重要

目前,唯一测试的关键管理实施是 HashiCorp Vault 和 OpenStack Barbican。但是,OpenStack Barbican 是一个技术预览,不支持在生产环境中使用。

2.10. 服务器端加密请求

在生产环境中,客户端通常通过代理联系 Ceph 对象网关。此代理称为负载平衡器,因为它连接到多个 Ceph 对象网关。当客户端发送请求到 Ceph 对象网关时,负载平衡器会将这些请求路由到多个 Ceph 对象网关,从而分发工作负载。

在这种配置中,SSL 终止可能同时发生在负载平衡器和负载平衡器和多个 Ceph 对象网关之间。通信仅使用 HTTP。若要设置 Ceph 对象网关以接受服务器端加密请求,请参阅 配置服务器端加密

2.11. 配置服务器端加密

作为存储管理员,您可以在无法通过 SSL 发送加密请求的情况下设置服务器端加密来使用 HTTP 将请求发送到 Ceph 对象网关。

此流程使用 HAProxy 作为代理和负载均衡器。

先决条件

  • 对存储集群中所有节点的根级别访问权限。
  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 已安装 HAProxy。

流程

  1. 编辑 haproxy.cfg 文件:

    示例

    frontend http_web
        bind *:80
        mode http
        default_backend rgw
    
    frontend rgw­-https
      bind *:443 ssl crt /etc/ssl/private/example.com.pem
      default_backend rgw
    
    backend rgw
        balance roundrobin
        mode http
        server  rgw1 10.0.0.71:8080 check
        server  rgw2 10.0.0.80:8080 check

  2. 注释掉允许访问 http 前端的行,并添加指令来指示 HAProxy 使用 https 前端:

    示例

    #     frontend http_web
    #     bind *:80
    #     mode http
    #     default_backend rgw
    
    frontend rgw­-https
      bind *:443 ssl crt /etc/ssl/private/example.com.pem
      http-request set-header X-Forwarded-Proto https if { ssl_fc }
      http-request set-header X-Forwarded-Proto https
    # here we set the incoming HTTPS port on the load balancer (eg : 443)
      http-request set-header X-Forwarded-Port 443
      default_backend rgw
    
    backend rgw
        balance roundrobin
        mode http
        server  rgw1 10.0.0.71:8080 check
        server  rgw2 10.0.0.80:8080 check

  3. 在集群的所有节点上,将以下参数添加到 Ceph 配置文件的 [global] 部分:

      rgw_trust_forwarded_https=true
  4. 启用并启动 HAProxy:

    [root@haproxy]# systemctl enable haproxy
    [root@haproxy]# systemctl start haproxy
  5. 要确保在 Ansible 运行时 rgw_trust_forwarded_https=true 不会从 Ceph 配置文件中删除,请编辑 ceph-ansible all.yml 文件,并在 ceph_ conf _overrides / global 部分中将 ceph-ansible all.yml 文件设置为 rgw_ trust_forwarded_https

    ceph_conf_overrides:
       global:
         rgw_trust_forwarded_https: true
  6. 完成更改后,运行 ceph-ansible playbook 以在所有 Ceph 节点上更新配置。

2.12. HashiCorp Vault

作为存储管理员,您可以在 HashiCorp Vault 中安全地存储密钥、密码和证书,以用于 Ceph 对象网关。HashiCorp Vault 为 Ceph 对象网关使用的服务器端加密提供安全密钥管理服务。

Ceph Vault 集成图

基本工作流:

  1. 客户端根据对象的密钥 ID 从 Vault 请求创建 secret key。
  2. 客户端将带有对象的密钥 ID 的对象上传到 Ceph 对象网关。
  3. 然后,Ceph 对象网关从 Vault 请求新创建的机密密钥。
  4. Vault 通过将机密密钥返回到 Ceph 对象网关来回复请求。
  5. 现在,Ceph 对象网关可以使用新的机密密钥加密对象。
  6. 在加密完成后,对象存储在 Ceph OSD 上。
重要

红帽与我们的技术合作伙伴合作,将本文档作为为客户提供服务。但是,红帽不提供对这个产品的支持。如果您需要此产品的技术协助,请联系 Hashicorp 以获得支持。

2.12.1. 先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • 安装 HashiCorp Vault 软件.

2.12.2. Vault 的 secret 引擎

HashiCorp Vault 提供多个机密引擎来生成、存储或加密数据。应用编程接口(API)向机密引擎发送数据调用,要求对该数据采取操作,机密引擎则返回该操作请求的结果。

Ceph 对象网关支持两个 HashiCorp Vault secret 引擎:

  • 键/价值版本 2
  • Transve

键/价值版本 2

Key/Value secret 引擎将随机 secret 存储在 Vault 中的磁盘上。使用 kv 引擎的版本 2,键可以具有可配置的版本数。默认版本数量为 10。删除版本不会删除底层数据,而是将数据标记为已删除,从而允许取消删除的版本。键名称必须是字符串,在使用命令行界面时引擎会将非字符串值转换为字符串。要保留非字符串值,请提供 JSON 文件或使用 HTTP 应用编程接口(API)。

注意

对于访问控制列表(ACL)策略,Key/Value secret 引擎可识别 创建 和更新 功能之间的区别。

Transve

Transit secret 引擎对传输中数据执行加密功能。Transit secret 引擎可以生成哈希值,可以是随机字节的来源,也可对数据进行签名和验证。在使用 Transit secret 引擎时,Vault 不会存储数据。Transit secret 引擎允许将同一密钥用于多个目的,从而支持密钥生成。此外,传输机密引擎支持密钥版本控制。Transit secret 引擎支持这些关键类型:

aes128-gcm96
带有 128 位 AES 密钥和 96 位非ce 的 AES-GCM;支持加密、解密、密钥派生和聚合加密
aes256-gcm96
带有 256 位 AES 密钥和 96 位非ce 的 AES-GCM;支持加密、解密、密钥生成和聚合加密(默认)
chacha20-poly1305
ChaCha20-Poly1305,带有 256 位密钥;支持加密、解密、密钥加密和聚合加密
ed25519
Ed25519; 支持签名、签名验证和密钥生成
ecdsa-p256
使用 curve P-256 的 ECDSA;支持签名和签名验证
ecdsa-p384
使用 curve P-384 的 ECDSA;支持签名和签名验证
ecdsa-p521
使用 curve P-521 的 ECDSA;支持签名和签名验证
rsa-2048
2048 位 RSA 密钥;支持加密、解密、签名和签名验证
rsa-3072
3072 位 RSA 密钥;支持加密、解密、签名和签名验证
rsa-4096
4096 位 RSA 密钥;支持加密、解密、签名和签名验证

其它资源

2.12.3. Vault 的身份验证

HashiCorp Vault 支持多种类型的身份验证机制。Ceph 对象网关目前支持 Vault 代理和令牌身份验证方法。Ceph 对象网关使用 rgw_crypt_vault_authrgw_crypt_vault_addr 选项来配置 HashiCorp Vault 的使用。

令牌

令牌身份验证方法允许用户使用令牌进行身份验证。您可以创建新令牌,按令牌撤销机密,以及许多其他令牌操作。您可以使用令牌存储绕过其他身份验证方法。在使用令牌身份验证方法时,还必须使用 rgw_crypt_vault_token_file 选项。令牌文件只能被 Ceph 对象网关读取。此外,必须使用带有 restricted 策略的 Vault 令牌,允许从特定路径获取密钥环。

警告

红帽建议不要在生产环境中使用令牌身份验证。

Vault 代理

Vault 代理是在客户端节点上运行的守护进程,提供客户端缓存以及令牌续订。Vault 代理通常在 Ceph 对象网关节点上运行。

其它资源

  • 如需更多信息,请参阅 Vault 项目站点上的 Token Auth Method 文档。
  • 如需更多信息,请参阅 Vault 项目站点上的 Vault 代理 文档。

2.12.4. Vault 的命名空间

将 HashiCorp Vault 用作企业服务,可为组织内的团队可以使用的隔离命名空间提供集中管理。这些隔离的命名空间环境称为 租户,组织内的团队可以利用这些 租户 将其策略、机密和身份与其他团队隔离。Vault 的命名空间功能帮助支持单一基础架构内的安全多租户。

其它资源

2.12.5. 将 Ceph 对象网关配置为使用 Vault

要将 Ceph 对象网关配置为使用 HashiCorp Vault,必须设置为加密密钥存储。目前,Ceph 对象网关支持两种不同的机密引擎,以及两种不同的身份验证方法。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 打开 以编辑 Ceph 配置文件,默认为 /etc/ceph/ceph.conf,并启用 Vault 作为加密密钥存储:

    rgw_crypt_s3_kms_backend = vault
  2. [client.radosgw.INSTANCE_NAME] 部分下,选择 Vault 身份验证方法,可以是 Token 或 Vault 代理。

    1. 如果使用 Token,请添加以下行:

      rgw_crypt_vault_auth = token
      rgw_crypt_vault_token_file = /etc/ceph/vault.token
      rgw_crypt_vault_addr = http://VAULT_SERVER:8200
    2. 如果使用 Vault 代理,请添加以下行:

      rgw_crypt_vault_auth = agent
      rgw_crypt_vault_addr = http://VAULT_SERVER:8100
  3. [client.radosgw.INSTANCE_NAME ]部分下,选择 Vault 机密引擎,可以是 Key/Value 或 Transit。

    1. 如果使用 Key/Value,请添加以下行:

      rgw_crypt_vault_secret_engine = kv
    2. 如果使用 Transit,请添加以下行:

      rgw_crypt_vault_secret_engine = transit
  4. (可选)在 [client.radosgw.INSTANCE_NAME] 部分下,您可以设置将检索加密密钥的 Vault 命名空间:

    rgw_crypt_vault_namespace = NAME_OF_THE_NAMESPACE
  5. 通过设置路径前缀来限制 Ceph 对象网关从 Vault 中检索加密密钥的位置:

    示例

    rgw_crypt_vault_prefix = /v1/secret/data

    1. 对于可导出的 Transit 键,请设置前缀路径,如下所示:

      rgw_crypt_vault_prefix = /v1/transit/export/encryption-key

      假设 Vault 服务器的域名是 vault-server,Ceph 对象网关将从以下 URL 获取加密传输密钥:

      示例

      http://vault-server:8200/v1/transit/export/encryption-key

  6. 保存对 Ceph 配置文件的更改。

其它资源

2.12.6. 使用 kv 引擎创建密钥

配置 HashiCorp Vault Key/Value secret 引擎(kv),以便您可以创建用于 Ceph 对象网关的密钥。secret 作为键值对存储在 kv 机密引擎中。

重要

服务器端 encyption 的密钥长度必须为 256 位,并使用 base64 进行 编码。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 HashiCorp Vault 软件.
  • 对 HashiCorp Vault 节点的根级别访问权限。

流程

  1. 启用 Key/Value 版本 2 secret 引擎:

    [root@vault ~]# vault secrets enable kv-v2
  2. 创建新密钥:

    语法

    vault kv put secret/PROJECT_NAME/BUCKET_NAME key=$(openssl rand -base64 32)

    示例

    [root@vault ~]# vault kv put secret/myproject/mybucketkey key=$(openssl rand -base64 32)
    
    ====== Metadata ======
    Key              Value
    ---              -----
    created_time     2020-02-21T17:01:09.095824999Z
    deletion_time    n/a
    destroyed        false
    version          1

2.12.7. 使用传输引擎创建密钥

配置 HashiCorp Vault Transit 机密引擎(传输),以便您可以创建用于 Ceph 对象网关的密钥。使用 Transit secret 引擎创建密钥必须可以导出,才能使用 Ceph 对象网关进行服务器端加密。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 HashiCorp Vault 软件.
  • 对 HashiCorp Vault 节点的根级别访问权限。

流程

  1. 启用 Transit secret 引擎:

    [root@vault ~]# vault secrets enable transit
  2. 创建新的可导出密钥:

    语法

    vault write -f transit/keys/BUCKET_NAME exportable=true

    示例

    [root@vault ~]# vault write -f transit/keys/mybucketkey exportable=true

    注意

    默认情况下,上述命令会创建一个 aes256-gcm96 类型密钥。

  3. 验证密钥的创建:

    语法

    vault read transit/export/encryption-key/BUCKET_NAME/VERSION_NUMBER

    示例

    [root@vault ~]# vault read transit/export/encryption-key/mybucketkey/1
    
    Key     Value
    ---     -----
    keys    map[1:-gbTI9lNpqv/V/2lDcmH2Nq1xKn6FPDWarCmFM2aNsQ=]
    name    mybucketkey
    type    aes256-gcm96

    注意

    提供完整密钥路径,包括密钥版本。

2.12.8. 使用 AWS 和 Vault 上传对象

在上传对象到 Ceph 对象网关时,Ceph 对象网关将从 Vault 获取密钥,然后将对象加密并存储在 bucket 中。发出下载对象的请求时,Ceph 对象网关将自动从 Vault 检索对应的密钥并解密对象。

注意

URL 使用基础地址(通过 rgw_crypt_vault_addr 选项和路径前缀设置)构建,该地址由 rgw_crypt_vault_prefix 选项设置。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • 安装 HashiCorp Vault 软件.
  • 访问 Ceph 对象网关客户端节点.
  • 访问 Amazon Web Services(AWS)。

流程

  1. 使用 AWS 命令行客户端上传对象:

    示例

    [user@client ~]$ aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id myproject/mybucketkey

    注意

2.12.9. 其它资源

2.13. 测试网关

若要使用 REST 接口,首先要为 S3 接口创建初始 Ceph 对象网关用户。然后,为 Swift 接口创建一个子用户。然后,您需要验证创建的用户是否能够访问该网关。

2.13.1. 创建 S3 用户

若要测试网关,请创建 S3 用户并授予用户访问权限。man radosgw-admin 命令提供关于其他命令选项的信息。

注意

在多站点部署中,始终在 master zone group 的 master zone 中的主机上创建用户。

先决条件

  • rootsudo 访问权限
  • 已安装 Ceph 对象网关

流程

  1. 创建 S3 用户:

    radosgw-admin user create --uid=name --display-name="First User"

    使用 S3 用户的名称替换 name,例如:

    [root@master-zone]# radosgw-admin user create --uid="testuser" --display-name="First User"
    {
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [
            {
                "user": "testuser",
                "access_key": "CEP28KDIQXBKU4M15PDC",
                "secret_key": "MARoio8HFc8JxhEilES3dKFVj8tV3NOOYymihTLO"
            }
        ],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "temp_url_keys": [],
        "type": "rgw"
    }
  2. 验证输出,以确保 access_keysecret_key 的值不包含 JSON 转义字符(\)。访问验证需要这些值,但如果值包含 JSON 转义字符,某些客户端将无法处理。要解决这个问题,请执行以下操作之一:

    • 删除 JSON 转义字符。
    • 将字符串封装在引号内。
    • 重新生成密钥,并确保 不包含 JSON 转义字符。
    • 手动指定密钥和 secret。

    不要删除正斜杠 /,因为它是一个有效的字符。

2.13.2. 创建 Swift 用户

要测试 Swift 接口,请创建一个 Swift 子用户。创建 Swift 用户分为两个步骤:第一步是创建用户。第二步是创建机密密钥。

注意

在多站点部署中,始终在 master zone group 的 master zone 中的主机上创建用户。

先决条件

  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 创建 Swift 用户:

    语法

    radosgw-admin subuser create --uid=NAME --subuser=NAME:swift --access=full

    使用 Swift 用户名替换 NAME,例如:

    示例

    [root@rgw]# radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full
    {
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [
            {
                "id": "testuser:swift",
                "permissions": "full-control"
            }
        ],
        "keys": [
            {
                "user": "testuser",
                "access_key": "O8JDE41XMI74O185EHKD",
                "secret_key": "i4Au2yxG5wtr1JK01mI8kjJPM93HNAoVWOSTdJd6"
            }
        ],
        "swift_keys": [
            {
                "user": "testuser:swift",
                "secret_key": "13TLtdEW7bCqgttQgPzxFxziu0AgabtOc6vM8DLA"
            }
        ],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "temp_url_keys": [],
        "type": "rgw"
    }

  2. 创建 secret 密钥:

    语法

    radosgw-admin key create --subuser=NAME:swift --key-type=swift --gen-secret

    使用 Swift 用户名替换 NAME,例如:

    示例

    [root@rgw]# radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret
    {
        "user_id": "testuser",
        "display_name": "First User",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [
            {
                "id": "testuser:swift",
                "permissions": "full-control"
            }
        ],
        "keys": [
            {
                "user": "testuser",
                "access_key": "O8JDE41XMI74O185EHKD",
                "secret_key": "i4Au2yxG5wtr1JK01mI8kjJPM93HNAoVWOSTdJd6"
            }
        ],
        "swift_keys": [
            {
                "user": "testuser:swift",
                "secret_key": "a4ioT4jEP653CDcdU8p4OuhruwABBRZmyNUbnSSt"
            }
        ],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "temp_url_keys": [],
        "type": "rgw"
    }

2.13.3. 测试 S3 访问

您需要编写并运行 Python 测试脚本来验证 S3 访问权限。S3 访问测试脚本将连接到 radosgw,创建一个新 bucket 并列出所有存储桶。aws_access_key_idaws_secret_access_key 的值取自 radosgw _admin 命令返回的 access _key 和 secret _ key 的值。

注意

系统用户对整个区域必须具有 root 特权,因为输出中将包含用于维护元数据的其他 json 字段。

先决条件

  • rootsudo 访问权限.
  • 安装了 Ceph 对象网关.
  • 已创建的 S3 用户.

流程

  1. 为 Red Hat Enterprise Linux 7 启用通用软件仓库和 Red Hat Enterprise Linux 8 的 High Availability 软件仓库:

    Red Hat Enterprise Linux 7

    # subscription-manager repos --enable=rhel-7-server-rh-common-rpms

    Red Hat Enterprise Linux 8

    # subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms

  2. 安装 python-boto 软件包。

    Red Hat Enterprise Linux 7

    # yum install python-boto

    Red Hat Enterprise Linux 8

    # dnf install python3-boto3

  3. 创建 Python 脚本:

    vi s3test.py
  4. 在文件中添加以下内容:

    Red Hat Enterprise Linux 7

    import boto
    import boto.s3.connection
    
    access_key = 'ACCESS'
    secret_key = 'SECRET'
    
    boto.config.add_section('s3')
    
    conn = boto.connect_s3(
            aws_access_key_id = access_key,
            aws_secret_access_key = secret_key,
            host = 's3.ZONE.hostname',
            port = PORT,
            is_secure=False,
            calling_format = boto.s3.connection.OrdinaryCallingFormat(),
            )
    
    bucket = conn.create_bucket('my-new-bucket')
    for bucket in conn.get_all_buckets():
    	print "{name}\t{created}".format(
    		name = bucket.name,
    		created = bucket.creation_date,
    )

    Red Hat Enterprise Linux 8

    import boto3
    
    endpoint = "" # enter the endpoint URL along with the port "http://URL:_PORT_"
    
    access_key = 'ACCESS'
    secret_key = 'SECRET'
    
    s3 = boto3.client(
            's3',
            endpoint_url=endpoint,
            aws_access_key_id=access_key,
            aws_secret_access_key=secret_key
            )
    
    s3.create_bucket(Bucket='my-new-bucket')
    
    response = s3.list_buckets()
    for bucket in response['Buckets']:
        print("{name}\t{created}".format(
    		name = bucket['Name'],
    		created = bucket['CreationDate']
    ))

    1. ZONE 替换为您配置网关服务的主机的区域名称。也就是说,网关主机。确保 host'setting 使用 DNS 解析。使用网关的端口号替换 'PORT
    2. 使用《 红帽 Ceph 存储对象网关配置和管理指南》的" 创建 S3 用户" 部分中的 access _key 和 secret_key 值替换 ACCESS SECRET
  5. 运行脚本:

    Red Hat Enterprise Linux 7

    python s3test.py

    Red Hat Enterprise Linux 8

    python3 s3test.py

    输出示例:

    my-new-bucket 2021-08-16T17:09:10.000Z

2.13.4. 测试 Swift 访问

可以通过 swift 命令行客户端验证 Swift 访问权限。命令 man swift 将提供有关可用命令行选项的更多信息。

要安装 swift 客户端,请执行以下操作:

sudo yum install python-setuptools
sudo easy_install pip
sudo pip install --upgrade setuptools
sudo pip install --upgrade python-swiftclient

要测试 swift 访问,请执行以下操作:

swift -A http://{IP ADDRESS}:{port}/auth/1.0 -U testuser:swift -K '{swift_secret_key}' list

{IP ADDRESS} 替换为网关服务器的公共 IP 地址,将 {swift_secret_key} 替换为为 swift 用户执行的 radosgw-admin key create 命令中的值。将 {port} 替换为您要使用 Civetweb 的端口号(例如,80 80 是默认值)。如果不替换端口,它将默认为端口 80

例如:

swift -A http://10.19.143.116:8080/auth/1.0 -U testuser:swift -K '244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF/IA' list

输出应该是:

my-new-bucket

2.14. 配置 HAProxy/keepalived

Ceph 对象网关允许您将多个对象网关实例分配到一个区域,以便您可以在负载增加时横向扩展,即相同的 zone group 和 zone;但是,您不需要联合架构来使用 HAProxy/keepalived。由于每个 Ceph 对象网关实例都有自己的 IP 地址,因此您可以使用 HAProxy 和 keepalived 在 Ceph 对象网关服务器之间平衡负载。

HAProxy 和 keepalived 的另一个用例是在 HAProxy 服务器上终止 HTTPS。您可以使用 HAProxy 服务器在 HAProxy 服务器上终止 HTTPS,并在 HAProxy 服务器和 Civetweb 网关实例之间使用 HTTP。

注意

这部分论述了 HAProxy 的配置,以及 Red Hat Enterprise Linux 7 的 keepalived

对于 Red Hat Enterprise Linux 8,安装 keepalivedhaproxy 软件包以安装 Load Balancer。请参阅 Red Hat Enterprise Linux 8 是否有额外的负载平衡订阅?有关详细信息的知识库文章.

2.14.1. HAProxy/keepalived 先决条件

要使用 Ceph 对象网关设置 HA 代理,您必须具有:

  • 正在运行的 Ceph 集群
  • 同一区域中至少有两个 Ceph 对象网关服务器,配置为在端口 80 上运行。如果您遵循简单的安装过程,网关实例默认位于同一 zone group 和 zone 中。如果您使用联合架构,请确保实例位于同一 zone group 和 zone 中;以及,
  • HAProxy 和 keepalived 至少两台服务器。
注意

本节假定您在运行测试脚本时至少有两个 Ceph 对象网关服务器运行,并且您在通过端口 80 运行测试脚本时从各自获得有效的响应。

有关 HAProxy 和 keepalived 的详细讨论,请参阅 负载平衡器管理

2.14.2. 准备 HAProxy 节点

以下设置假定两个名为 haproxy 和 haproxy 2 的 HAProxy 节点,以及名为 rgw1 和 rgw 2 的 Ceph 对象网关服务器。您可以使用您喜欢的任何命名规则。在至少两个 HAProxy 节点上执行以下步骤:

  1. Install Red Hat Enterprise Linux 7.
  2. 注册节点。

    [root@haproxy]# subscription-manager register
  3. 启用 RHEL 服务器存储库。

    [root@haproxy]# subscription-manager repos --enable=rhel-7-server-rpms
  4. 更新服务器。

    [root@haproxy]# yum update -y
  5. 根据需要安装管理工具(如 wget vim 等)。
  6. 打开端口 80

    [root@haproxy]# firewall-cmd --zone=public --add-port 80/tcp --permanent
    [root@haproxy]# firewall-cmd --reload
  7. 对于 HTTPS,打开端口 443

    [root@haproxy]# firewall-cmd --zone=public --add-port 443/tcp --permanent
    [root@haproxy]# firewall-cmd --reload
  8. 连接到所需的端口。

    [root@haproxy]# semanage port -m -t http_cache_port_t -p tcp 8081

2.14.3. 安装和配置 keepalived

在至少两个 HAProxy 节点上执行以下步骤:

先决条件

  • 至少两个 HAProxy 节点。
  • 至少两个对象网关节点。

流程

  1. 安装 keepalived

    [root@haproxy]# yum install -y keepalived
  2. 配置 keepalived 在两个 HAProxy 节点上:

    [root@haproxy]# vim /etc/keepalived/keepalived.conf

    在配置文件中,有一个用于检查 haproxy 进程脚本:

    vrrp_script chk_haproxy {
      script "killall -0 haproxy" # check the haproxy process
      interval 2 # every 2 seconds
      weight 2 # add 2 points if OK
    }

    接下来,主负载平衡器和备份负载平衡器上的实例使用 eno1 作为网络接口。它还分配虚拟 IP 地址,即 192.168.1.20

    Master 负载均衡器节点

    vrrp_instance RGW {
        state MASTER # might not be necessary. This is on the Master LB node.
        @main interface eno1
        priority 100
        advert_int 1
        interface eno1
        virtual_router_id 50
        @main unicast_src_ip 10.8.128.43 80
        unicast_peer {
               10.8.128.53
               }
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.20
        }
        track_script {
          chk_haproxy
        }
    }
    virtual_server 192.168.1.20 80 eno1 { #populate correct interface
        delay_loop 6
        lb_algo wlc
        lb_kind dr
        persistence_timeout 600
        protocol TCP
        real_server 10.8.128.43 80 { # ip address of rgw2 on physical interface, haproxy listens here, rgw listens to localhost:8080 or similar
            weight 100
            TCP_CHECK { # perhaps change these to a HTTP/SSL GET?
                connect_timeout 3
            }
        }
        real_server 10.8.128.53 80 { # ip address of rgw3 on physical interface, haproxy listens here, rgw listens to localhost:8080 or similar
            weight 100
            TCP_CHECK { # perhaps change these to a HTTP/SSL GET?
                connect_timeout 3
            }
        }
    }

    备份负载均衡器节点

    vrrp_instance RGW {
        state BACKUP # might not be necessary?
        priority 99
        advert_int 1
        interface eno1
        virtual_router_id 50
        unicast_src_ip 10.8.128.53 80
        unicast_peer {
               10.8.128.43
               }
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.1.20
        }
        track_script {
          chk_haproxy
        }
    }
    virtual_server 192.168.1.20 80 eno1 { #populate correct interface
        delay_loop 6
        lb_algo wlc
        lb_kind dr
        persistence_timeout 600
        protocol TCP
        real_server 10.8.128.43 80 { # ip address of rgw2 on physical interface, haproxy listens here, rgw listens to localhost:8080 or similar
            weight 100
            TCP_CHECK { # perhaps change these to a HTTP/SSL GET?
                connect_timeout 3
            }
        }
        real_server 10.8.128.53 80 { # ip address of rgw3 on physical interface, haproxy listens here, rgw listens to localhost:8080 or similar
            weight 100
            TCP_CHECK { # perhaps change these to a HTTP/SSL GET?
                connect_timeout 3
            }
        }
    }

  3. 启用并启动 keepalived 服务:

    [root@haproxy]# systemctl enable keepalived
    [root@haproxy]# systemctl start keepalived

其它资源

2.14.4. 安装和配置 HAProxy

在至少两个 HAProxy 节点上执行以下步骤:

  1. 安装 haproxy

    [root@haproxy]# yum install haproxy
  2. 为 SELinux 和 HTTP 配置 haproxy

    [root@haproxy]# vim /etc/firewalld/services/haproxy-http.xml

    添加以下行:

    <?xml version="1.0" encoding="utf-8"?>
    <service>
    <short>HAProxy-HTTP</short>
    <description>HAProxy load-balancer</description>
    <port protocol="tcp" port="80"/>
    </service>

    root 身份,为 haproxy-http.xml 文件分配正确的 SELinux 上下文和文件权限。

    [root@haproxy]# cd /etc/firewalld/services
    [root@haproxy]# restorecon haproxy-http.xml
    [root@haproxy]# chmod 640 haproxy-http.xml
  3. 如果要使用 HTTPS,请为 SELinux 和 HTTPS 配置 haproxy

    [root@haproxy]# vim /etc/firewalld/services/haproxy-https.xml

    添加以下行:

    <?xml version="1.0" encoding="utf-8"?>
    <service>
    <short>HAProxy-HTTPS</short>
    <description>HAProxy load-balancer</description>
    <port protocol="tcp" port="443"/>
    </service>

    root 身份,为 haproxy-https.xml 文件分配正确的 SELinux 上下文和文件权限。

    # cd /etc/firewalld/services
    # restorecon haproxy-https.xml
    # chmod 640 haproxy-https.xml
  4. 如果您打算使用 HTTPS,请为 SSL 生成密钥。如果您没有证书,您可以使用自签名证书。要生成密钥,请参阅红帽企业 Linux 7 的《系统管理员指南》 中的 生成新密钥和证书一节

    最后,将证书和密钥放入 PEM 文件中。

    [root@haproxy]# cat example.com.crt example.com.key > example.com.pem
    [root@haproxy]# cp example.com.pem /etc/ssl/private/
  5. 配置 haproxy

    [root@haproxy]# vim /etc/haproxy/haproxy.cfg

    全局默认值 可能保持不变。在 defaults 部分后,您需要配置 frontendbackend 部分。例如:

    frontend http_web
        bind *:80
        mode http
        default_backend rgw
    
    frontend rgw­-https
      bind *:443 ssl crt /etc/ssl/private/example.com.pem
      default_backend rgw
    
    backend rgw
        balance roundrobin
        mode http
        server  rgw1 10.0.0.71:80 check
        server  rgw2 10.0.0.80:80 check

    有关 HAProxy 配置的详细讨论,请参阅 HAProxy 配置

  6. enable/start haproxy

    [root@haproxy]# systemctl enable haproxy
    [root@haproxy]# systemctl start haproxy

2.14.5. 测试 HAProxy 配置

在 HAProxy 节点上,检查 以确保出现来自 keepalived 配置的虚拟 IP 地址。

[root@haproxy]# ip addr show

在 calamari 节点上,查看您是否能通过负载平衡器配置访问网关节点。例如:

[root@haproxy]# wget haproxy

这应该返回相同的结果,如下:

[root@haproxy]# wget rgw1

如果返回包含以下内容的 index.html 文件:

<?xml version="1.0" encoding="UTF-8"?>
	<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
		<Owner>
			<ID>anonymous</ID>
			<DisplayName></DisplayName>
		</Owner>
		<Buckets>
		</Buckets>
	</ListAllMyBucketsResult>

然后,您的配置可以正常工作。

2.15. 为静态 Web 托管配置网关

传统的 Web 托管涉及为每个网站设置 Web 服务器,当内容未动态更改时,此服务器会以低效的方式使用资源。Ceph 对象网关可以在 S3 buckets-​ 中托管静态网站,即不使用 PHP、servlet、数据库、nodejs 等服务器端服务的站点。这种方法比为每个站点设置具有 Web 服务器的虚拟机更经济。

2.15.1. 静态 Web 托管假设

静态 Web 托管要求至少有一个正在运行的 Ceph 存储群集,以及至少两个用于静态网站的 Ceph 对象网关实例。红帽假定每个区域都有多个通过 HAProxy/keepalived 进行负载平衡的网关实例。

有关 HAProxy/keepalived 的详情,请参阅配置 HAProxy/keepalived。

注意

红帽 不支持 使用 Ceph 对象网关实例来同时部署标准 S3/Swift API 和静态 Web 主机。

2.15.2. 静态 Web 托管要求

静态 Web 托管功能使用自己的 API,因此将网关配置为在 S3 存储桶中使用静态网站需要以下内容:

  1. S3 静态 Web 托管使用 Ceph 对象网关实例,这些实例与用于标准 S3/Swift API 用例的实例不同。
  2. 托管 S3 静态网站的网关实例应具有独立于标准 S3/Swift API 网关实例的单独、非覆盖域名。
  3. 托管 S3 静态网站的网关实例应使用与标准 S3/Swift API 网关实例独立的面向公共的 IP 地址。
  4. 托管 S3 静态 web 站点负载均衡的网关实例,如有必要,使用 HAProxy/keepalived 终止 SSL。

2.15.3. 静态 Web 托管网关设置

要为静态 Web 托管启用网关,请编辑 Ceph 配置文件并添加以下设置:

[client.rgw.<STATIC-SITE-HOSTNAME>]
...
rgw_enable_static_website = true
rgw_enable_apis = s3, s3website
rgw_dns_name = objects-zonegroup.domain.com
rgw_dns_s3website_name = objects-website-zonegroup.domain.com
rgw_resolve_cname = true
...

rgw_enable_static_website 设置 MUST 为 truergw_enable_apis 设置 MUST 启用 s3website API。rgw_dns_namergw_dns_s3website_name 设置必须提供其完全限定的域。如果站点将使用规范名称扩展名,请将 rgw_resolve_cname 设置为 true

重要

rgw_dns_namergw_dns_s3website_name 的 FQDN 重叠。

2.15.4. 静态 Web 托管 DNS 配置

以下是假定 DNS 设置的示例,其中前两行使用标准 S3 接口指定网关实例的域,并分别指向 IPv4 和 IPv6 地址。第三行使用规范名称扩展为 S3 存储桶提供通配符 CNAME 设置。第四行和第五行使用 S3 网站接口指定网关实例的域,并分别指向它们的 IPv4 和 IPv6 地址。

objects-zonegroup.domain.com. IN    A 192.0.2.10
objects-zonegroup.domain.com. IN AAAA 2001:DB8::192:0:2:10
*.objects-zonegroup.domain.com. IN CNAME objects-zonegroup.domain.com.
objects-website-zonegroup.domain.com. IN    A 192.0.2.20
objects-website-zonegroup.domain.com. IN AAAA 2001:DB8::192:0:2:20
注意

前两行中的 IP 地址与第四和第五个行中的 IP 地址有所不同。

如果在多站点配置中使用 Ceph 对象网关,请考虑使用路由解决方案将流量路由到最接近客户端的网关。

Amazon Web Service(AWS)需要静态 Web 主机存储桶才能与主机名匹配。Ceph 提供了几种不同的配置 DNS 的方式,如果代理具有匹配的证书,HTTPS 将正常工作。

Subdomain 中 Bucket 的主机名

要使用 AWS 风格的 S3 子域,请在 DNS 条目中使用通配符,并可将请求重定向到任何存储桶。DNS 条目可能类似如下:

*.objects-website-zonegroup.domain.com. IN CNAME objects-website-zonegroup.domain.com.

使用以下方法访问存储桶名称:

http://bucket1.objects-website-zonegroup.domain.com

存储桶名称为 bucket1

主机名到非匹配问题

Ceph 支持将域名映射到 bucket,而不在请求中包含 bucket 名称,这对 Ceph 对象网关而言是唯一的。要使用域名访问 bucket,请将域名映射到 bucket 名称。DNS 条目可能类似如下:

www.example.com. IN CNAME bucket2.objects-website-zonegroup.domain.com.

存储桶名称为 bucket2

使用以下方法访问存储桶:

http://www.example.com

使用 CNAME 到 Long Bucket 的主机名

AWS 通常需要存储桶名称来匹配域名。要使用 CNAME 为静态 Web 托管配置 DNS,DNS 条目可能类似如下:

www.example.com. IN CNAME www.example.com.objects-website-zonegroup.domain.com.

使用以下方法访问存储桶:

http://www.example.com

没有 CNAME 的 Long Bucket 的主机名

如果 DNS 名称包含其他非 CNAME 记录,如 SOANSMXTXT,DNS 记录必须将域名直接映射到 IP 地址。例如:

www.example.com. IN A 192.0.2.20
www.example.com. IN AAAA 2001:DB8::192:0:2:20

使用以下方法访问存储桶:

http://www.example.com

2.15.5. 创建静态 Web 托管站点

要创建静态网站,请执行以下步骤:

  1. 创建 S3 存储桶。bucket 名称 MAY 与网站的域名相同。例如,mysite.com 可能具有 bucket 名称 mysite.com。AWS 需要此功能,但 Ceph 不需要它。详情请参阅 DNS 设置
  2. 将静态网站内容上传到 bucket。内容可能包括 HTML、CSS、客户端 JavaScript、图像、音频/视频内容和其他可下载的文件。网站 MUST 具有 index.html 文件,并且 MAY 有 error.html 文件。
  3. 验证网站内容。此时,只有 bucket 的创建者有权访问其内容。
  4. 设置文件的权限,以便可以公开读取。

2.16. 将命名空间导出到 NFS-Ganesha

在 Red Hat Ceph Storage 3 及更高版本中,Ceph 对象网关通过使用 NFS 版本 3 和 NFS 版本 4.1 在生产系统中导出 S3 对象命名空间的功能。

注意

NFS Ganesha 功能不用于一般用途,而仅适用于迁移到 S3 云。

注意

Red Hat Ceph Storage 不支持版本控制存储桶的 NFS 导出。

其实施符合 Amazon Web Services(AWS)分层命名空间约定,将 UNIX 风格路径名称映射到 S3 存储桶和对象。连接的命名空间的顶级(如果存在)属于 NFSv4 伪根,由 Ceph 对象网关 S3 存储桶组成,其中 bucket 表示为 NFS 目录。bucket 中的对象呈现为 NFS 文件和目录层次结构,遵循 S3 约定。支持创建文件和目录的操作。

注意

不支持创建或删除硬链接或软链接 IS。不支持通过 NFS 对存储桶或目录执行重命名操作,但对目录内和目录间支持的文件以及文件系统和 NFS 挂载之间的文件重命名。通过 NFS 执行文件重命名操作时,其成本会更高,因为它们会更改目标目录,并且通常强制完整 读取目录进行刷新

注意

不支持通过 NFS mount IS 编辑文件。

注意

Ceph 对象网关要求应用按顺序写入文件偏移 0 至文件末尾。尝试写出订单会导致上传操作失败。要临时解决这个问题,请在将文件复制到 NFS 空间时使用 cp、cat 或 rsync 等实用程序。始终使用 sync 选项挂载。

具有 NFS 的 Ceph 对象网关基于网关服务器的内部库打包,以及用于 NFS-Ganesha NFS 服务器的文件系统抽象层(FSAL)命名空间驱动程序。在运行时,一个 Ceph 对象网关守护进程实例与 NFS 结合了完整的 Ceph 对象网关守护进程,这是一个不含 Civetweb HTTP 服务且在一个进程中具有 NFS-Ganesha 实例的省事。要使用此功能,请部署 NFS-Ganesha 版本 2.3.2 或更高版本。

在包含 NFS-Ganesha(nfs-ganesha-rgw)实例的主机上,执行 启动和配置 NFS-Ganesha 实例前 的步骤。

运行多个 NFS 网关

每个 NFS-Ganesha 实例充当完整的网关端点,但当前的限制是 NFS-Ganesha 实例无法配置为导出 HTTP 服务。与普通网关实例一样,可以启动任意数量的 NFS-Ganesha 实例,从群集导出相同或不同的资源。这可实现 NFS-Ganesha 实例的集群。但是,这并不表示高可用性。

当常规网关实例和 NFS-Ganesha 实例重叠相同的数据资源时,可以从标准 S3 API 和导出的 NFS-Ganesha 实例访问它们。您可以将 NFS-Ganesha 实例与 Ceph 对象网关实例在同一主机上并置。

开始前

  1. 在尝试运行 NFS-Ganesha 之前,禁用将运行 NFS-Ganesha 的任何主机上运行的任何内核 NFS 服务实例。如果另一个 NFS 实例正在运行,NFS-Ganesha 将不会启动。
  2. 作为 root 用户 启用 Red Hat Ceph Storage Tools 存储库:

    Red Hat Enterprise Linux 7

    # subscription-manager repos --enable=rhel-7-server-rhceph-4-tools-rpms

    Red Hat Enterprise Linux 8

    # subscription-manager repos --enable=rhceph-4-tools-for-rhel-8-x86_64-rpms

  3. 确保 rpcbind 服务正在运行:

    # systemctl start rpcbind
    注意

    提供 rpcbind 的 The rpcbind 软件包通常会默认安装。否则,请先安装软件包。

    有关 NFS 如何使用 rpcbind 的详细信息,请参阅 Red Hat Enterprise Linux 7 的存储管理指南中的 Required Services 部分。

  4. 如果 nfs-service 服务正在运行,请停止并禁用该服务:

    # systemctl stop nfs-server.service
    # systemctl disable nfs-server.service

配置 NFS-Ganesha 实例

  1. 安装 nfs-ganesha-rgw 软件包:

    # yum install nfs-ganesha-rgw
  2. 将 Ceph 配置文件从 Ceph 监控节点复制到 NFS-Ganesha 主机的 /etc/ceph/ 目录,并根据需要编辑该文件:

    # scp <mon-host>:/etc/ceph/ceph.conf <nfs-ganesha-rgw-host>:/etc/ceph
    注意

    Ceph 配置文件必须包含有效的 [client.rgw.{instance-name}] 部分,以及各种必要的网关配置变量的对应参数,如 rgw_data密钥环rgw_frontends。如果导出不符合有效 S3 存储桶命名要求的 Swift 容器,请将 Ceph 配置文件的 [client.rgw] 部分中的 rgw_relaxed_s3_bucket_names 设置为 true。例如,如果 Swift 容器名称包含下划线,则它不是有效的 S3 存储桶名称,并且不会同步,除非 rgw_relaxed_s3_bucket_names 设为 true。当在 NFS 之外添加对象和存储桶时,这些对象会在 rgw_nfs_namespace_expire_secs 设置的时间里显示在 NFS 命名空间中,默认为大约 5 分钟。覆盖 Ceph 配置文件中的 rgw_nfs_namespace_expire_secs 的默认值,以更改刷新率。

  3. 打开 NFS-Ganesha 配置文件:

    # vim /etc/ganesha/ganesha.conf
  4. 使用 FSAL (File System Abstraction Layer)块配置 EXPORT 部分。提供 ID、S3 用户 ID、S3 访问密钥和机密。对于 NFSv4,它应类似如下:

    EXPORT
    {
            Export_ID={numeric-id};
            Path = "/";
            Pseudo = "/";
            Access_Type = RW;
            SecType = "sys";
            NFS_Protocols = 4;
            Transport_Protocols = TCP;
            Squash = No_Root_Squash;
    
            FSAL {
                    Name = RGW;
                    User_Id = {s3-user-id};
                    Access_Key_Id ="{s3-access-key}";
                    Secret_Access_Key = "{s3-secret}";
            }
    }

    Path 选项指示 Ganesha 在哪里查找导出。对于 VFS FSAL,这是服务器命名空间中的位置。对于其他 FSAL,它可能是由 FSAL 命名空间管理的文件系统中的位置。例如,如果 Ceph FSAL 用于导出整个 CephFS 卷,则 路径 将是 /

    Pseudo 选项指示 Ganesha 将导出放在 NFS v4 的伪文件系统命名空间内。NFS v4 指定服务器可以构造不与任何实际导出位置对应的伪命名空间,并且该伪文件系统的部分可能仅存在于 NFS 服务器的域中且不与任何物理目录对应。此外,NFS v4 服务器将其所有导出放置在一个命名空间内。可以将单个导出导出为伪文件系统 root,但将多个导出放置在伪文件系统中更为常见。使用传统的 VFS 时,Pseudo 位置通常与 路径 位置相同。使用 / 作为路径返回到示例 CephFS 导出,如果需要多个导出,则导出可能会有其他内容作为 Pseudo 选项。例如,/ceph

    任何应支持 NFSv3 的 EXPORT 块都应在 NFS_Protocols 设置中包含版本 3。此外,NFSv3 是支持 UDP 传输的最后一个主要版本。早期版本的标准包括 UDP,但 RFC 7530 禁止其使用。要启用 UDP,将其包含在 Transport_Protocols 设置中。例如:

    EXPORT {
    ...
        NFS_Protocols = 3,4;
        Transport_Protocols = UDP,TCP;
    ...
    }

    设置 SecType = sys; 允许客户端在没有 Kerberos 身份验证的情况下附加.

    设置 Squash = No_Root_Squash; 允许用户在 NFS 挂载中更改目录所有权.

    使用传统 OS 原生 NFS 4.1 客户端的 NFS 客户端通常会看到由目标服务器的 pseudofs root 定义的导出文件系统的联合命名空间。其中任意数量的可以是 Ceph 对象网关导出。

    每个导出都有自己的 名称User_Id、access _KeySecret_Access_Key,并且创建对指定用户可见的对象命名空间的代理。

    ganesha.conf 中的导出也可以包含 NFSV4 块。红帽 Ceph 存储支持 Allow_Numeric_Owners 和 only ly_Numberic_Owners 参数,作为设置 idmapper 程序的替代选择。

    NFSV4 {
        Allow_Numeric_Owners = true;
        Only_Numeric_Owners = true;
    }
  5. 配置 NFS_CORE_PARAM 块。

    NFS_CORE_PARAM{
        mount_path_pseudo = true;
    }

    mount_path_pseudo 配置设置被设置为 true 时,它将使 NFS v3 和 NFS v4.x 挂载使用相同的服务器侧路径来访问导出,例如:

        mount -o vers=3 <IP ADDRESS>:/export /mnt
        mount -o vers=4 <IP ADDRESS>:/export /mnt
    Path            Pseudo          Tag     Mechanism   Mount
    /export/test1   /export/test1   test1   v3 Pseudo   mount -o vers=3 server:/export/test1
    /export/test1   /export/test1   test1   v3 Tag      mount -o vers=3 server:test1
    /export/test1   /export/test1   test1   v4 Pseudo   mount -o vers=4 server:/export/test1
    /               /export/ceph1   ceph1   v3 Pseudo   mount -o vers=3 server:/export/ceph1
    /               /export/ceph1   ceph1   v3 Tag      mount -o vers=3 server:ceph1
    /               /export/ceph1   ceph1   v4 Pseudo   mount -o vers=4 server:/export/ceph1
    /               /export/ceph2   ceph2   v3 Pseudo   mount -o vers=3 server:/export/ceph2
    /               /export/ceph2   ceph2   v3 Tag      mount -o vers=3 server:ceph2
    /               /export/ceph2   ceph2   v4 Pseudo   mount -o vers=4

    mount_path_pseudo 配置设置设为 false 时,NFS v3 挂载使用 Path 选项,NFS v4.x 挂载使用 Pseudo 选项。

    Path            Pseudo          Tag     Mechanism   Mount
    /export/test1   /export/test1   test1   v3 Path     mount -o vers=3 server:/export/test1
    /export/test1   /export/test1   test1   v3 Tag      mount -o vers=3 server:test1
    /export/test1   /export/test1   test1   v4 Pseudo   mount -o vers=4 server:/export/test1
    /               /export/ceph1   ceph1   v3 Path     mount -o vers=3 server:/
    /               /export/ceph1   ceph1   v3 Tag      mount -o vers=3 server:ceph1
    /               /export/ceph1   ceph1   v4 Pseudo   mount -o vers=4 server:/export/ceph1
    /               /export/ceph2   ceph2   v3 Path     not accessible
    /               /export/ceph2   ceph2   v3 Tag      mount -o vers=3 server:ceph2
    /               /export/ceph2   ceph2   v4 Pseudo   mount -o vers=4 server:/export/ceph2
  6. 配置 RGW 部分。指定实例的名称,提供 Ceph 配置文件的路径,并指定任何初始化参数:

    RGW {
        name = "client.rgw.{instance-name}";
        ceph_conf = "/etc/ceph/ceph.conf";
        init_args = "--{arg}={arg-value}";
    }
  7. 保存 /etc/ganesha/ganesha.conf 配置文件。
  8. 启用并启动 nfs-ganesha 服务。

    # systemctl enable nfs-ganesha
    # systemctl start nfs-ganesha
  9. 对于非常大型的伪目录,请将 ceph.conf 文件中的可配置参数 rgw_nfs_s3_fast_attrs 设置为 true,使命名空间不可变并加快速度:

    rgw_nfs_s3_fast_attrs= true
  10. 从每个网关节点重启 Ceph 对象网关服务:

    # systemctl restart ceph-radosgw.target

配置 NFSv4 客户端

要访问命名空间,请将配置的 NFS-Ganesha 导出挂载到本地 POSIX 命名空间中的所需位置。如前文所述,这种实施有一些独特的限制:

  • 仅支持 NFS 4.1 和更高协议类别。
  • 要强制执行写顺序,请使用 sync 挂载选项。

要挂载 NFS-Ganesha 导出,请在客户端主机上的 /etc/fstab 文件中添加以下条目:

<ganesha-host-name>:/ <mount-point> nfs noauto,soft,nfsvers=4.1,sync,proto=tcp 0 0

指定 NFS-Ganesha 主机名和客户端上挂载点的路径。

注意

为了成功挂载 NFS-Ganesha 导出,客户端上必须存在 /sbin/mount.nfs 文件。nfs-tools 软件包提供此文件。在大多数情况下,会默认安装 软件包。但是,验证是否在客户端上安装了 nfs-tools 软件包,如果未安装,请进行安装。

有关 NFS 的详情,请参阅 Red Hat Enterprise Linux 7 的存储管理指南中的 网络文件系统(NFS) 一章。

配置 NFSv3 客户端

通过提供 nfsvers=3 和 noacl 作为挂载选项,可以将 Linux 客户端配置为通过 NFSv3 挂载。要使用 UDP 作为传输,请将 proto=udp 添加到挂载选项中。但是,TCP 是首选的协议。

<ganesha-host-name>:/ <mount-point> nfs noauto,noacl,soft,nfsvers=3,sync,proto=tcp 0 0
注意

如果挂载将使用版本 3 和 UDP,则使用版本 3 和 传输设置 配置 NFS Ganesha EXPORT协议 设置。

由于 NFSv3 不将客户端 OPEN 和 CLOSE 操作告知文件服务器,RGW NFS 无法使用这些操作来标记文件上传事务的开始和结束。相反,当第一次写入以偏移 0 发送到文件时,RGW NFS 会尝试启动新的上传,并在默认情况下 10 秒内看到对 文件的新写入时完成上传。要更改此值,请在 Ceph 配置文件的 RGW 部分中为 rgw_nfs_write_completion_interval_s 设置值。

第 3 章 管理

管理员可以使用 radosgw-admin 命令行界面管理 Ceph 对象网关。

3.1. 管理数据存储

Ceph 对象网关将管理数据存储在实例的区域配置中定义的一系列池中。例如,后续部分中讨论的 bucket、用户、用户配额和使用量统计存储在 Ceph 存储群集的池中。默认情况下,Ceph 对象网关将创建下列池,并将它们映射到默认区域:

  • .rgw.root
  • .default.rgw.control
  • .default.rgw.meta
  • .default.rgw.log
  • .default.rgw.buckets.index
  • .default.rgw.buckets.data
  • .default.rgw.buckets.non-ec

您应该考虑手动创建这些池,以便您可以设置 CRUSH 规则集和放置组的数量。在典型的配置中,存储 Ceph 对象网关管理数据的池通常会使用相同的 CRUSH 规则集,并且使用较少的 PG,因为管理数据有 10 个池。如需了解更多详细信息,请参阅红帽 Ceph 存储 4 的 池 和存储策略 指南。

另请参阅 每个池 PG PG 计算器来获取 PG 计算详细信息。如果将过多的 PG 分配给池(默认情况下为 300 个),mon_pg_warn_max_per_osd 设置将发出警告。您可以调整值以满足您的需求和硬件的功能,其中 n 是每个 OSD 的最大 PG 数。

mon_pg_warn_max_per_osd = n

3.2. 创建存储策略

Ceph 对象网关通过标识放置目标并在与放置目标关联的池中存储 bucket 和对象来存储客户端存储桶和对象。如果您不配置放置目标,并将它们映射到实例区域配置中的池,Ceph 对象网关将使用默认目标和池,如 default_placement

存储策略为 Ceph 对象网关客户端提供了一种访问存储策略的方式,即能够将特定类型的存储作为目标,如 SSD、SAS 驱动器、SATA 驱动器。确保持久性、复制、纠删代码等特殊方法。详情请参阅 Red Hat Ceph Storage 4 的存储策略 指南。

要创建存储策略,请使用以下步骤:

  1. 使用所需的存储策略,创建一个新的 pool .rgw.buckets.special。例如,使用纠删代码、特定 CRUSH 规则集、副本数和 a pg_num 和 pgp_num 计数自定义的池。
  2. 获取 zone group 配置并将其存储在文件中,如 zonegroup.json

    语法

    [root@master-zone]# radosgw-admin zonegroup --rgw-zonegroup=<zonegroup_name> get > zonegroup.json

    示例

    [root@master-zone]# radosgw-admin zonegroup --rgw-zonegroup=default get > zonegroup.json

  3. zonegroup.json 文件中,在 placement_target 下添加一个 特殊placement 条目。

    {
    	"name": "default",
    	"api_name": "",
    	"is_master": "true",
    	"endpoints": [],
    	"hostnames": [],
    	"master_zone": "",
    	"zones": [{
    		"name": "default",
    		"endpoints": [],
    		"log_meta": "false",
    		"log_data": "false",
    		"bucket_index_max_shards": 11
    	}],
    	"placement_targets": [{
    		"name": "default-placement",
    		"tags": []
    	}, {
    		"name": "special-placement",
    		"tags": []
    	}],
    	"default_placement": "default-placement"
    }
  4. 使用修改的 zone group.json 文件设置 zone group

    [root@master-zone]# radosgw-admin zonegroup set < zonegroup.json
  5. 获取区配置并将其存储在文件中,如 zone.json

    [root@master-zone]# radosgw-admin zone get > zone.json
  6. 编辑区文件并在 placement_pool 下添加新放置策略键:

    {
    	"domain_root": ".rgw",
    	"control_pool": ".rgw.control",
    	"gc_pool": ".rgw.gc",
    	"log_pool": ".log",
    	"intent_log_pool": ".intent-log",
    	"usage_log_pool": ".usage",
    	"user_keys_pool": ".users",
    	"user_email_pool": ".users.email",
    	"user_swift_pool": ".users.swift",
    	"user_uid_pool": ".users.uid",
    	"system_key": {
    		"access_key": "",
    		"secret_key": ""
    	},
    	"placement_pools": [{
    		"key": "default-placement",
    		"val": {
    			"index_pool": ".rgw.buckets.index",
    			"data_pool": ".rgw.buckets",
    			"data_extra_pool": ".rgw.buckets.extra"
    		}
    	}, {
    		"key": "special-placement",
    		"val": {
    			"index_pool": ".rgw.buckets.index",
    			"data_pool": ".rgw.buckets.special",
    			"data_extra_pool": ".rgw.buckets.extra"
    		}
    	}]
    }
  7. 设置新区域配置。

    [root@master-zone]# radosgw-admin zone set < zone.json
  8. 更新 zone group map。

    [root@master-zone]# radosgw-admin period update --commit

    special-placement 条目列为 placement_target

在发出请求时指定存储策略:

例如:

$ curl -i http://10.0.0.1/swift/v1/TestContainer/file.txt -X PUT -H "X-Storage-Policy: special-placement" -H "X-Auth-Token: AUTH_rgwtxxxxxx"

3.3. 创建无索引存储桶

您可以配置放置目标,其中创建的存储桶不使用存储桶索引来存储对象索引,即无索引存储桶。不使用数据复制或列表的放置目标可能会实现无索引存储桶。Indexless bucket 提供了一种机制,其中的放置目标不会跟踪特定存储桶中的对象。这消除了每当发生对象写入时发生的资源争用,并减少 Ceph 对象网关对 Ceph 存储集群进行的往返次数。这可能会对并发操作和小对象写入性能产生积极的影响。

警告

请注意,在具有索引放置策略的存储桶上执行操作时,Ceph 对象网关守护进程会崩溃。因此,红帽不推荐使用这个放置策略。

重要

bucket 索引不会反映存储桶的正确状态,列出这些存储桶将无法正确返回其对象列表。这会影响多个功能。具体来说,这些存储桶不会在多区环境中同步,因为存储桶索引不用于存储更改信息。红帽建议不要在无索引存储桶上使用 S3 对象版本控制,因为这个功能需要存储桶索引。

注意

使用无索引存储桶可移除单个 bucket 中最大对象数量的限值。

注意

无法从 NFS 列出无索引存储桶中的对象。

先决条件

  • 正在运行的、健康的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 在 zonegroup 中添加新放置目标:

    示例

    [root@rgw ~]# radosgw-admin zonegroup placement add --rgw-zonegroup="default" \
      --placement-id="indexless-placement"

  2. 在区中添加一个新的放置目标:

    示例

    [root@rgw ~]# radosgw-admin zone placement add --rgw-zone="default" \
       --placement-id="indexless-placement" \
       --data-pool="default.rgw.buckets.data" \
       --index-pool="default.rgw.buckets.index" \
       --data_extra_pool="default.rgw.buckets.non-ec" \
       --placement-index-type="indexless"

  3. 将 zonegroup 的默认放置设置为 无索引放置

    示例

    [root@rgw ~]# radosgw-admin zonegroup placement default --placement-id "indexless-placement"

    在本例中,在 indexless-placement 目标中创建的存储桶将是无索引存储桶。

  4. 如果集群处于多站点配置中,请更新并提交周期:

    示例

    [root@rgw ~]# radosgw-admin period update --commit

  5. 重启 Ceph 对象网关守护进程以使更改生效:

    示例

    [root@rgw ~]# systemctl restart ceph-radosgw.target

3.4. 配置 Bucket 分片

Ceph 对象网关将 bucket 索引数据存储在索引池(index_pool)中,默认为 .rgw.buckets.index。当客户端将许多对象 -​hunds 放入数以百万计的对象时,在单个 bucket 中没有为每个存储桶设置最大对象数量的配额,索引池可能会遭遇显著的性能下降。

当每个存储 桶允许大量对象时,bucket 索引分片 有助于防止性能瓶颈。从 Red Hat Ceph Storage 4.1 开始,默认的存储桶索引分片( bucket_index_max_shards )已从 1 改为 11。这个更改会增加小存储桶的写入吞吐量量,并延迟设置动态重新划分。此更改仅影响新存储桶和部署。

红帽建议将分片计数设为计算的分片计数最为接近的主数。作为主要数字的存储桶索引分片在跨分片均匀分配 bucket 索引条目方面表现更好。例如,7001 存储桶索引分片优于 7000,因为前者是主的。

配置存储桶索引分片:

重新定义存储桶:

3.4.1. bucket 分片限制

重要

请谨慎使用以下限制:您的硬件选择会有影响,因此您应该始终与您的红帽客户团队讨论这些要求。

一个存储桶中的最大对象数量,然后再需要分片

红帽建议每个存储桶索引分片最多有 102,400 个对象。为充分利用分片,请在 Ceph 对象网关 bucket 索引池中提供足够数量的 OSD 来获取最大并行性。

注意

目前,当索引存储中的任何密钥范围超过 200,000 时,Ceph OSD 都会发出警告。因此,如果您接近每个分片需要 200,000 个对象的数量,则会出现此类警告。在一些设置中,值可能较大,并可调整。

使用分片时的最大对象数

动态存储桶重新划分的存储桶索引分片的默认数量为 1999。您可以将此值更改为 65521 分片。1999 bucket 索引分片值为存储桶中的 204697600 个总对象,值 65521 分片提供 6709350400 对象。

注意

根据以前的测试,当前支持的存储桶索引分片的最大数量为 65521。红帽质量保证未对存储桶分片执行完整的可扩展性测试。

重要

如果存储桶索引分片的数量超过 1999,则常规 S3 客户端可能无法列出存储桶内容。自定义客户端可以要求非排序列表,它可扩展到任意数量的分片。

3.4.2. bucket 生命周期并行线程处理

Red Hat Ceph Storage 4.1 的一个新功能允许并行线程处理存储桶生命周期。这种并行化使用 Ceph 对象网关实例的数量进行扩展,并使用数字序列替换内序索引分片。默认锁定超时时间已从 60 秒延长至 90 秒。添加了新的可调选项,以针对每个 Ceph 对象网关实例并行运行生命周期工作线程。

rgw_lc_max_worker

这个选项指定要并行运行的生命周期 worker 线程数量,因此同时处理存储桶和索引分片。rgw_lc_max_worker 选项的默认值为 3

rgw_lc_max_wp_worker

这个选项指定每个生命周期 worker 的工作池中的线程数量。此选项可帮助加快每个存储桶的处理。rgw_lc_max_wp_worker 选项的默认值为 3

其它资源

  • 如需了解更多详细信息,请参见《 红帽 Ceph 存储配置指南》中的 Ceph 配置文件 部分。

3.4.3. 在简单配置中配置 Bucket Index Sharding

要在所有新存储桶上启用和配置 bucket 索引分片,请使用 rgw_override_bucket_index_max_shards 参数。将参数设置为:

  • 0 禁用存储桶索引分片。这是默认值。
  • 值大于 0,以启用存储桶分片并设置分片的最大数量。

先决条件

流程

  1. 计算推荐的分片数量。要做到这一点,请使用以下公式:

    number of objects expected in a bucket / 100,000

    请注意,分片的最大数量为 65521。

  2. rgw_override_bucket_index_max_shards 添加到 Ceph 配置文件:

    rgw_override_bucket_index_max_shards = value

    使用上一步中计算的推荐分片数量替换 value,例如:

    rgw_override_bucket_index_max_shards = 12
    • 要为 Ceph 对象网关的所有实例配置 bucket 索引分片,请在 [global] 部分下添加 rgw_override_bucket_index_max_shards
    • 要仅为 Ceph 对象网关的特定实例配置 bucket 索引分片,请在实例下添加 rgw_override_bucket_index_max_shards
  3. 重启 Ceph 对象网关:

    # systemctl restart ceph-radosgw.target

3.4.4. 在多站点配置中配置 Bucket Index 分片

在多站点配置中,每个区域都有不同的 index_pool 设置来管理故障转移。要为一个 zone group 中的 zone 配置一致的分片计数,请在该 zone group 配置中设置 bucket_index_max_shards 设置。将参数设置为:

将参数设置为:

  • 0 禁用存储桶索引分片,默认值 bucket_index_max_shards11
  • 值大于 0,以启用存储桶分片并设置分片的最大数量。
注意

将索引池(如果适用)映射到基于 SSD 的 OSD 的 CRUSH 规则集也可能有助于 bucket 索引性能。

先决条件

流程

  1. 计算推荐的分片数量。要做到这一点,请使用以下公式:

    number of objects expected in a bucket / 100,000

    请注意,分片的最大数量为 65521。

  2. 将 zone group 配置提取到 zonegroup.json 文件中:

    $ radosgw-admin zonegroup get > zonegroup.json
  3. zonegroup.json 文件中,为每个命名区域设置 bucket_index_max_shards 设置。

    bucket_index_max_shards = VALUE

    使用上一步中计算的推荐分片数量替换 value,例如:

    bucket_index_max_shards = 12
  4. 重置 zone group:

    $ radosgw-admin zonegroup set < zonegroup.json
  5. 更新周期:

    $ radosgw-admin period update --commit

3.4.5. 动态 Bucket Index Resharding

动态 bucket 重新划分的过程定期检查所有 Ceph 对象网关存储桶,并检测需要重新划分的存储桶。如果 bucket 增长大于 rgw_max_objs_per_shard 参数中指定的值,Ceph 对象网关会在后台动态重新定义存储桶。rgw_max_objs_per_shard 的默认值是每个分片 100k 对象。

注意

默认值基于在旋转磁盘上存储存储桶索引的体验。在更现代设置中,使用存储桶索引到闪存介质,每个存储桶索引分片的最大对象值可能较高。

注意

动态 bucket 索引重新划分在升级的单站点配置上正常工作,而无需修改该 zone 或 zone group。单个站点配置可以是以下任意一种:

  • 没有 realm 的默认区配置。
  • 至少一个域的非默认配置。
  • 多站点配置。

先决条件

流程

  • 启用动态存储桶索引重新划分:

    1. 将 Ceph 配置文件中的 rgw_dynamic_resharding 设置设为 true,这是默认值。
    2. 可选。如果需要,更改 Ceph 配置文件中的以下参数:

      • rgw_reshard_num_logs :重新划分日志的分片数量。默认值为 16
      • rgw_reshard_bucket_lock_duration :在重新划分期间存储桶上锁定的持续时间。默认值为 360 秒。
      • rgw_dynamic_resharding :启用或禁用动态重新划分。默认值为 true
      • rgw_max_objs_per_shard :每个分片的最大对象数量。默认值为每个分片 100000 对象。
      • rgw_reshard_thread_interval :重新线程处理循环之间的最长时间。默认值为 600 秒。
  • 将存储桶添加到重新划分队列中:

    radosgw-admin reshard add --bucket bucket --num-shards number

    替换:

    • bucket 的名称为 reshard
    • 带有 新分片数的数字

    例如:

    $ radosgw-admin reshard add --bucket data --num-shards 10
  • 列出重新划分队列:

    $ radosgw-admin reshard list
  • 检查存储桶重新划分状态:

    radosgw-admin reshard status --bucket bucket

    替换:

    • bucket 的名称为 reshard

    例如:

    $ radosgw-admin reshard status --bucket data
  • 立即处理重新划分队列中的条目:

    $ radosgw-admin reshard process
  • 取消待处理的存储桶重新划分:

    radosgw-admin reshard cancel --bucket bucket

    替换:

    • 带有 待处理存储桶名称的 bucket

    例如:

    $ radosgw-admin reshard cancel --bucket data
    重要

    您只能取消 待处理的 重新划分操作。不要取消 持续 重新划分的操作。

  • 如果您使用 Red Hat Ceph Storage 3.1 及更早的版本,请删除过时的存储桶条目,如 重新划分后清除过时的实例 中所述。

3.4.6. 手动 Bucket Index Resharding

如果 bucket 已增长大于已优化的初始配置,请使用 radosgw-admin bucket reshard 命令重新缩小存储桶索引池。这个命令:

  • 为指定存储桶创建新的 bucket 索引对象集合。
  • 在这些 bucket 索引对象之间分发对象条目。
  • 创建新的 bucket 实例。
  • 使用存储桶链接新 bucket 实例,以便所有新的索引操作都通过新 bucket 索引进行。
  • 将旧的和新的 bucket ID 打印到命令输出。
重要

仅在简单配置中使用这个步骤。要在多站点配置中重新定义存储桶,请参阅使用 多站点手动 Resharding Buckets

先决条件

流程

  1. 备份原始存储桶索引:

    radosgw-admin bi list --bucket=bucket > bucket.list.backup

    替换:

    • bucket 的名称为 reshard

    例如,对于名为 data 的存储桶,请输入:

    $ radosgw-admin bi list --bucket=data > data.list.backup
  2. 重新定义存储桶索引:

    radosgw-admin bucket reshard --bucket=bucket
    --num-shards=number

    替换:

    • bucket 的名称为 reshard
    • 带有 新分片数的数字

    例如,对于名为 data 的存储 桶,以及所需的分片数量为 100,请输入:

    $ radosgw-admin bucket reshard --bucket=data
    --num-shards=100
  3. 如果您使用 Red Hat Ceph Storage 3.1 及更早的版本,请删除过时的存储桶条目,如 重新划分后清除过时的实例 中所述。

3.4.7. 在重新划分后清理过时的实例

在红帽 Ceph 存储 3.1 和之前版本中,重新划分过程不会自动清理存储桶条目的陈旧实例。如果没有手动清理,这些过时的实例可能会影响集群的性能。

重要

这个过程只在不在多站点集群中的简单配置中使用。

先决条件

  • 安装了 Ceph 对象网关.

流程

  1. 列出过时的实例:

    $ radosgw-admin reshard stale-instances list
  2. 清理过时的实例:

    $ radosgw-admin reshard stale-instances rm

3.5. 启用压缩

Ceph 对象网关支持利用任何 Ceph 的压缩插件对上传对象进行服务器端压缩。包括:

  • zlib :支持.
  • snappy :技术预览.
  • zstd :技术预览.
注意

snappyzstd 压缩插件是技术预览功能,因此不被完全支持,因为红帽还没有对它们完成质量保证测试。

Configuration

要在区放置目标中启用压缩,请向 radosgw-admin 区放置修改 命令提供 --compression=<type> 选项。压缩 类型 指的是在写入新对象数据时要使用的压缩插件名称。

每个压缩对象存储压缩类型。更改 设置不会影响解压缩现有压缩对象的能力,也不会强制 Ceph 对象网关重新压缩现有的对象。

此压缩设置适用于使用此放置目标上传到存储桶的所有新对象。

要禁用对区放置目标的压缩,请向 radosgw-admin zone placement modify 命令提供 --compression=<type> 选项 并指定一个空字符串或 none

例如:

$ radosgw-admin zone placement modify --rgw-zone=default --placement-id=default-placement --compression=zlib
{
...
    "placement_pools": [
        {
            "key": "default-placement",
            "val": {
                "index_pool": "default.rgw.buckets.index",
                "data_pool": "default.rgw.buckets.data",
                "data_extra_pool": "default.rgw.buckets.non-ec",
                "index_type": 0,
                "compression": "zlib"
            }
        }
    ],
...
}

在启用或禁用压缩后,重新启动 Ceph 对象网关实例,以便更改生效。

注意

Ceph 对象网关创建 默认 区域和一组池。有关生产部署,请参阅 用于生产的 Ceph 对象网关指南,更具体来说,请参阅首先 创建域 部分。另请参阅 多站点

statistics

虽然所有现有命令和 API 都继续根据其未压缩数据报告对象和 bucket 大小,但 radosgw-admin bucket stats 命令包含给定存储桶的压缩统计信息。

$ radosgw-admin bucket stats --bucket=<name>
{
...
    "usage": {
        "rgw.main": {
            "size": 1075028,
            "size_actual": 1331200,
            "size_utilized": 592035,
            "size_kb": 1050,
            "size_kb_actual": 1300,
            "size_kb_utilized": 579,
            "num_objects": 104
        }
    },
...
}

size_utilized 和 size_kb_utilized 字段 分别代表压缩数据的总大小,单位为字节和 KB。

3.6. 用户管理

Ceph 对象存储用户管理是指属于 Ceph 对象存储服务的客户端应用的用户,而不是 Ceph 对象网关作为 Ceph 存储群集的客户端应用。您必须创建用户、访问密钥和机密,以使客户端应用能够与 Ceph 对象网关服务交互。

用户类型有两种:

  • 用户: 术语"用户"反映了 S3 接口的用户。
  • 子用户: 术语"子用户"反映了 Swift 界面的用户。子用户 与用户 关联.

您可以创建、修改、查看、暂停和删除用户及子用户。

重要

在多站点部署中管理用户时,ALWAYS 对 master zone group master zone 中的 Ceph 对象网关节点执行 radosgw-admin 命令,以确保用户在整个多站点集群中同步。不要从 second zone 或 second zone group 创建、修改或删除多站点群集上的用户。本文档使用 [root@master-zone]# 作为 master zone group 的 master zone 中主机的命令行惯例。

除了创建用户和子用户 ID 外,您还可以为用户添加显示名称和电子邮件地址。您可以指定一个密钥和 secret,或者自动生成密钥和 secret。在生成或指定密钥时,请注意用户 ID 与 S3 密钥类型对应,子用户 ID 对应于 swift 密钥类型。Swift 密钥也具有 读取写入、读写 完全 的访问权限级别。

用户管理命令行语法通常遵循 用户 <command> <user-id> 模式,其中 <user-id> 是 --uid= 选项,后跟用户的 ID(S3)或 --subuser= 选项,后跟用户名(Swift)。例如:

[root@master-zone]# radosgw-admin user <create|modify|info|rm|suspend|enable|check|stats> <--uid={id}|--subuser={name}> [other-options]

可能需要其他选项,具体取决于您执行的命令。

3.6.1. multi Tenancy

在 Red Hat Ceph Storage 2 及更高版本中,Ceph 对象网关支持 S3 和 Swift API 的多租户,其中每个用户和 bucket 都位于"租户"。 当多个租户使用通用 bucket 名称(如"test"、"main" 等)时,多租户可防止命名空间冲突。

每个用户和 bucket 位于租户下。为向后兼容,将添加带有空名称的"传统"租户。每当不指定租户的情况下引用存储桶时,Swift API 将假定为"传统"租户。现有用户也存储在传统租户下,因此他们将像之前的版本一样访问 bucket 和对象。

租户对其没有任何操作。在管理用户时,它们根据需要显示和消失。为了创建、修改和删除具有显式租户的用户,提供了一个额外的选项 --tenant,或者在 radosgw-admin 命令的参数中使用了语法"<tenant>$<user >"。

要为 S3 创建用户 testx$tester,请执行以下操作:

[root@master-zone]# radosgw-admin --tenant testx --uid tester \
                    --display-name "Test User" --access_key TESTER \
                    --secret test123 user create

要为 Swift 创建用户 testx$tester,请执行以下任一操作:

[root@master-zone]# radosgw-admin --tenant testx --uid tester \
                    --display-name "Test User" --subuser tester:swift \
                    --key-type swift --access full subuser create

[root@master-zone]# radosgw-admin key create --subuser 'testx$tester:swift' \
                    --key-type swift --secret test123
注意

shell 中必须用引号括起具有显式租户的子用户。

3.6.2. 创建用户

使用 用户 create 命令创建 S3-interface 用户。您必须指定用户 ID 和显示名称。您也可以指定一个电子邮件地址。如果您不指定密钥或 secret,radosgw-admin 将自动为您生成。但是,如果您不希望使用生成的键/secret 对,您可以指定一个键和/或 secret。

[root@master-zone]# radosgw-admin user create --uid=<id> \
[--key-type=<type>] [--gen-access-key|--access-key=<key>]\
[--gen-secret | --secret=<key>] \
[--email=<email>] --display-name=<name>

例如:

[root@master-zone]# radosgw-admin user create --uid=janedoe --display-name="Jane Doe" --email=jane@example.com
{ "user_id": "janedoe",
  "display_name": "Jane Doe",
  "email": "jane@example.com",
  "suspended": 0,
  "max_buckets": 1000,
  "auid": 0,
  "subusers": [],
  "keys": [
        { "user": "janedoe",
          "access_key": "11BS02LGFB6AL6H1ADMW",
          "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
  "swift_keys": [],
  "caps": [],
  "op_mask": "read, write, delete",
  "default_placement": "",
  "placement_tags": [],
  "bucket_quota": { "enabled": false,
      "max_size_kb": -1,
      "max_objects": -1},
  "user_quota": { "enabled": false,
      "max_size_kb": -1,
      "max_objects": -1},
  "temp_url_keys": []}
重要

检查 密钥输出。sometimes radosgw-admin 生成 JSON 转义(\)字符,一些客户端不知道如何处理 JSON 转义字符。强制包括删除 JSON 转义字符(\),用引号括起字符串,重新生成密钥,并确保它没有 JSON 转义字符,或者手动指定密钥和 secret。

3.6.3. 创建子用户

要创建子用户(Swift 接口),您必须指定用户 ID(--uid={username})、子用户 ID 和子用户的访问级别。如果您不指定密钥或 secret,radosgw-admin 将自动为您生成。但是,如果您不希望使用生成的键/secret 对,您可以指定一个键和/或 secret。

注意

full读写,因为它还包含访问控制策略。

[root@master-zone]# radosgw-admin subuser create --uid={uid} --subuser={uid} --access=[ read | write | readwrite | full ]

例如:

[root@master-zone]# radosgw-admin subuser create --uid=janedoe --subuser=janedoe:swift --access=full
{ "user_id": "janedoe",
  "display_name": "Jane Doe",
  "email": "jane@example.com",
  "suspended": 0,
  "max_buckets": 1000,
  "auid": 0,
  "subusers": [
        { "id": "janedoe:swift",
          "permissions": "full-control"}],
  "keys": [
        { "user": "janedoe",
          "access_key": "11BS02LGFB6AL6H1ADMW",
          "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
  "swift_keys": [],
  "caps": [],
  "op_mask": "read, write, delete",
  "default_placement": "",
  "placement_tags": [],
  "bucket_quota": { "enabled": false,
      "max_size_kb": -1,
      "max_objects": -1},
  "user_quota": { "enabled": false,
      "max_size_kb": -1,
      "max_objects": -1},
  "temp_url_keys": []}

3.6.4. 获取用户信息

要获取有关用户的信息,请指定用户 信息和用户 ID(--uid={username})。

[root@master-zone]# radosgw-admin user info --uid=janedoe

若要获取租户用户的信息,可指定用户 ID 和租户名称。

[root@master-zone]# radosgw-admin user info --uid=janedoe --tenant=test

3.6.5. 修改用户信息

要修改用户的信息,您必须指定用户 ID(--uid={username})和您要修改的属性。典型的修改包括密钥和机密、电子邮件地址、显示名称和访问级别。例如:

[root@master-zone]# radosgw-admin user modify --uid=janedoe --display-name="Jane E. Doe"

若要修改子用户值,请指定 子用户修改 和子用户 ID。例如:

[root@master-zone]# radosgw-admin subuser modify --subuser=janedoe:swift --access=full

3.6.6. 启用和提示用户

当您创建用户时,该用户默认是启用的。但是,您可以暂停用户特权并稍后重新启用它们。若要暂停用户,可 指定用户暂停 和用户 ID。

[root@master-zone]# radosgw-admin user suspend --uid=johndoe

要重新启用暂停的用户,请 指定用户启用 和用户 ID。

[root@master-zone]# radosgw-admin user enable --uid=johndoe
注意

禁用该用户将禁用该子用户。

3.6.7. 删除用户

删除用户时,用户和子用户将从系统中删除。但是,如果您愿意,您可以仅删除该子用户。要删除用户(及子用户),请 指定用户 rm 和用户 ID。

[root@master-zone]# radosgw-admin user rm --uid=<uid> [--purge-keys] [--purge-data]

例如:

[root@master-zone]# radosgw-admin user rm --uid=johndoe --purge-data

若要仅删除子用户,请指定 子用户 rm 和 subuser 名称。

[root@master-zone]# radosgw-admin subuser rm --subuser=johndoe:swift --purge-keys

选项包括:

  • 清除数据: -- purge-data 选项清除与 UID 关联的所有数据。
  • 清除密钥: -- purge-keys 选项清除与 UID 关联的所有密钥。

3.6.8. 删除子用户

删除子用户时,您要删除对 Swift 接口的访问。用户将保留在系统中。Ceph 对象网关用于移除子用户,指定 子用户 rm 和子用户 ID。

[root@master-zone]# radosgw-admin subuser rm --subuser=johndoe:test

选项包括:

  • 清除密钥: -- purge-keys 选项清除与 UID 关联的所有密钥。

3.6.9. 重命名用户

要更改用户名称,请使用 radosgw-admin 用户 rename 命令。此命令花费的时间取决于用户拥有的 bucket 和对象的数量。如果数量较大,红帽建议在 屏幕 软件包提供的 Screen 实用程序中使用 命令。

先决条件

  • 正常工作的 Ceph 集群
  • rootsudo 访问权限
  • 已安装的 Ceph 对象网关

流程

  1. 重命名用户:

    radosgw-admin user rename --uid=current-user-name --new-uid=new-user-name

    例如,要将 user1 重命名为 user2

    # radosgw-admin user rename --uid=user1 --new-uid=user2
    
    {
        "user_id": "user2",
        "display_name": "user 2",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [
            {
                "user": "user2",
                "access_key": "59EKHI6AI9F8WOW8JQZJ",
                "secret_key": "XH0uY3rKCUcuL73X0ftjXbZqUbk0cavD11rD8MsA"
            }
        ],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "temp_url_keys": [],
        "type": "rgw"
    }

    如果用户位于租户中,同时指定用户名和租户:

    语法

    radosgw-admin user rename --uid user-name --new-uid new-user-name --tenant tenant

    例如,在 测试 租户 中将 user1 重命名为 user2

    示例

    # radosgw-admin user rename --uid=test$user1 --new-uid=test$user2 --tenant test
    
    1000 objects processed in tvtester1. Next marker 80_tVtester1_99
    2000 objects processed in tvtester1. Next marker 64_tVtester1_44
    3000 objects processed in tvtester1. Next marker 48_tVtester1_28
    4000 objects processed in tvtester1. Next marker 2_tVtester1_74
    5000 objects processed in tvtester1. Next marker 14_tVtester1_53
    6000 objects processed in tvtester1. Next marker 87_tVtester1_61
    7000 objects processed in tvtester1. Next marker 6_tVtester1_57
    8000 objects processed in tvtester1. Next marker 52_tVtester1_91
    9000 objects processed in tvtester1. Next marker 34_tVtester1_74
    9900 objects processed in tvtester1. Next marker 9_tVtester1_95
    1000 objects processed in tvtester2. Next marker 82_tVtester2_93
    2000 objects processed in tvtester2. Next marker 64_tVtester2_9
    3000 objects processed in tvtester2. Next marker 48_tVtester2_22
    4000 objects processed in tvtester2. Next marker 32_tVtester2_42
    5000 objects processed in tvtester2. Next marker 16_tVtester2_36
    6000 objects processed in tvtester2. Next marker 89_tVtester2_46
    7000 objects processed in tvtester2. Next marker 70_tVtester2_78
    8000 objects processed in tvtester2. Next marker 51_tVtester2_41
    9000 objects processed in tvtester2. Next marker 33_tVtester2_32
    9900 objects processed in tvtester2. Next marker 9_tVtester2_83
    {
        "user_id": "test$user2",
        "display_name": "User 2",
        "email": "",
        "suspended": 0,
        "max_buckets": 1000,
        "auid": 0,
        "subusers": [],
        "keys": [
            {
                "user": "test$user2",
                "access_key": "user2",
                "secret_key": "123456789"
            }
        ],
        "swift_keys": [],
        "caps": [],
        "op_mask": "read, write, delete",
        "default_placement": "",
        "placement_tags": [],
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "user_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "temp_url_keys": [],
        "type": "rgw"
    }

  2. 验证用户是否已成功重命名:

    语法

    radosgw-admin user info --uid=new-user-name

    例如:

    示例

    # radosgw-admin user info --uid=user2

    如果用户位于租户中,请使用 租户$user-name 格式:

    radosgw-admin user info --uid=tenant$new-user-name
    # radosgw-admin user info --uid=test$user2

其它资源

  • screen(1) 手册页

3.6.10. 创建密钥

要为用户创建密钥,您必须指定 key create。对于用户,指定用户 ID 和 s3 密钥类型。若要为子用户创建密钥,您必须指定子用户 ID 和 swift keytype。例如:

[root@master-zone]# radosgw-admin key create --subuser=johndoe:swift --key-type=swift --gen-secret
{ "user_id": "johndoe",
  "rados_uid": 0,
  "display_name": "John Doe",
  "email": "john@example.com",
  "suspended": 0,
  "subusers": [
     { "id": "johndoe:swift",
       "permissions": "full-control"}],
  "keys": [
    { "user": "johndoe",
      "access_key": "QFAMEDSJP5DEKJO0DDXY",
      "secret_key": "iaSFLDVvDdQt6lkNzHyW4fPLZugBAI1g17LO0+87"}],
  "swift_keys": [
    { "user": "johndoe:swift",
      "secret_key": "E9T2rUZNu2gxUjcwUBO8n\/Ev4KX6\/GprEuH4qhu1"}]}

3.6.11. 添加和删除访问密钥

用户和子用户必须具有使用 S3 和 Swift 接口的访问密钥。当您创建用户或子用户且您没有指定 access key 和 secret 时,密钥和 secret 会自动生成。您可以创建一个密钥,并指定或生成 access key 和/或 secret。您也可以删除访问密钥和机密。选项包括:

  • --secret=<key> 指定一个 secret key(例如,手动生成)。
  • --Gen-access-key 生成随机访问密钥(默认为 S3 用户)。
  • --Gen-secret 生成随机 secret key。
  • --key-type=<type> 指定一个键类型。这些选项有:swift、s3

要添加密钥,请指定用户:

[root@master-zone]# radosgw-admin key create --uid=johndoe --key-type=s3 --gen-access-key --gen-secret

您也可以指定密钥和 secret。

要删除访问密钥,您需要指定用户和密钥:

  1. 查找特定用户的访问密钥:

    [root@master-zone]# radosgw-admin user info --uid=<testid>

    access 键是输出中的 "access_key" 值,例如:

    $ radosgw-admin user info --uid=johndoe
    {
        "user_id": "johndoe",
        ...
        "keys": [
            {
                "user": "johndoe",
                "access_key": "0555b35654ad1656d804",
                "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
            }
        ],
        ...
    }
  2. 指定用户 ID 和上一步中的访问密钥以删除访问密钥:

    [root@master-zone]# radosgw-admin key rm --uid=<user_id> --access-key <access_key>

    例如:

    [root@master-zone]# radosgw-admin key rm --uid=johndoe --access-key 0555b35654ad1656d804

3.6.12. 添加和删除管理功能

Ceph 存储集群提供了一个管理 API,允许用户通过 REST API 执行管理功能。默认情况下,用户没有访问此 API 的权限。要让用户练习管理功能,请为用户提供管理功能。

要为用户添加管理功能,请执行以下操作:

[root@master-zone]# radosgw-admin caps add --uid={uid} --caps={caps}

您可以向用户、存储桶、元数据和使用(利用率)添加读取、写入或所有功能。例如:

--caps="[users|buckets|metadata|usage|zone]=[*|read|write|read, write]"

例如:

[root@master-zone]# radosgw-admin caps add --uid=johndoe --caps="users=*"

要从用户中删除管理功能,请执行以下操作:

[root@master-zone]# radosgw-admin caps remove --uid=johndoe --caps={caps}

3.7. 配额管理

Ceph 对象网关允许您设置用户拥有的用户和 bucket 的配额。配额包括 bucket 中对象的最大数量,以及最大存储大小(以 MB 为单位)。

  • bucket: --bucket 选项允许您为用户拥有的存储桶指定配额。
  • 最大对象: --max-objects 设置允许您指定对象的最大数量。负值将禁用此设置。
  • 最大大小: --max-size 选项允许您为最大字节数指定配额。负值将禁用此设置。
  • 配额范围: -- quota-scope 选项设置配额的范围。选项为 bucketuser。bucket 配额应用到用户拥有的 bucket。用户配额应用到用户。
重要

具有大量对象的 bucket 可能会导致严重的性能问题。个 bucket 中建议的最多对象数量为 100,000。要增加这个数量,请配置存储桶索引分片。详情请查看 第 3.4 节 “配置 Bucket 分片”

3.7.1. 设置用户配额

在启用配额前,您必须首先设置配额参数。例如:

[root@master-zone]# radosgw-admin quota set --quota-scope=user --uid=<uid> [--max-objects=<num objects>] [--max-size=<max size>]

例如:

radosgw-admin quota set --quota-scope=user --uid=johndoe --max-objects=1024 --max-size=1024

num 对象和 / 或 max size 的负值表示禁用特定的配额属性检查。

3.7.2. 启用和禁用用户配额

设置用户配额后,您可以启用它。例如:

[root@master-zone]# radosgw-admin quota enable --quota-scope=user --uid=<uid>

您可以禁用启用的用户配额。例如:

[root@master-zone]# radosgw-admin quota disable --quota-scope=user --uid=<uid>

3.7.3. 设置存储桶配额

bucket 配额应用到指定 uid 拥有的 bucket。它们独立于用户。

语法

radosgw-admin quota set --uid=USER_ID --quota-scope=bucket --bucket=BUCKET_NAME [--max-objects=NUMBER_OF_OBJECTS] [--max-size=MAXIMUM_SIZE_IN_BYTES]

NUMBER_OF_OBJECTS 的负值 ,MAXIMUM_SIZE_IN_BYTES 表示禁用了特定的配额属性检查。

3.7.4. 启用和禁用 Bucket Quotas

设置存储桶配额后,您可以启用它。例如:

[root@master-zone]# radosgw-admin quota enable --quota-scope=bucket --uid=<uid>

您可以禁用启用的存储桶配额。例如:

[root@master-zone]# radosgw-admin quota disable --quota-scope=bucket --uid=<uid>

3.7.5. 获取配额设置

您可以通过用户信息 API 访问每个用户的配额设置。要使用 CLI 接口读取用户配额设置信息,请执行以下操作:

# radosgw-admin user info --uid=<uid>

要获得租户用户的配额设置,请指定用户 ID 和租户名称:

+ radosgw-admin user info --uid=_user-id_ --tenant=_tenant_

3.7.6. 更新配额统计信息

配额统计异步更新。您可以手动更新所有用户和所有存储桶的配额统计,以检索最新的配额统计。

[root@master-zone]# radosgw-admin user stats --uid=<uid> --sync-stats

3.7.7. 获取用户配额使用列表

要查看用户消耗的配额量,请执行以下操作:

# radosgw-admin user stats --uid=<uid>
注意

您应当使用 --sync -stats 选项执行radosgw- admin 用户 统计信息,以接收最新的数据。

3.7.8. 配额缓存

为每个 Ceph 网关实例缓存配额统计数据。如果有多个实例,缓存可以防止完全强制执行配额,因为每个实例对配额有不同的视图。控制此问题的选项是 rgw bucket 配额 ttl、rg w用户配额存储桶同步间隔rgw 用户配额同步间隔。这些值越大,配额操作效率越高,但多个实例不同步就会越高。这些值越低,将更接近于完美地实施多个实例。如果所有三个都是 0,则有效禁用配额缓存,多个实例也具有完美的配额实施。有关这些选项的详情,请查看 第 4 章 配置参考

3.7.9. 读取和写入全局配额

您可以在 zonegroup map 中读取和写入配额设置。获取 zonegroup map:

[root@master-zone]# radosgw-admin global quota get

全局配额设置可以使用配额 集的 全局配额 对、配额 启用和配额 禁用 命令进行操作,例如:

[root@master-zone]# radosgw-admin global quota set --quota-scope bucket --max-objects 1024
[root@master-zone]# radosgw-admin global quota enable --quota-scope bucket
注意

在存在 realm 和 period 的多站点配置中,必须使用 period update --commit 提交对全局配额的更改。如果没有 period,则必须重启 Ceph 对象网关,才能使更改生效。

3.8. 使用

Ceph 对象网关日志各个用户的使用情况。您还可以在日期范围内跟踪用户使用情况。

选项包括:

  • 起始日期: --start-date 选项允许您从特定开始日期过滤使用情况统计信息(format: yyyy-mm-dd[HH:MM:SS])。
  • 结束日期: --end-date 选项允许您过滤特定日期的使用情况(format: yyyy-mm-dd[HH:MM:SS])。
  • 日志条目: --show-log-entries 选项允许您指定是否使用使用 stats 包括日志条目(options: true | false)。
注意

您可以使用分钟和秒指定时间,但以 1 小时分辨率存储。

3.8.1. 显示使用情况

要显示使用情况统计信息,请指定 用量显示。要显示特定用户的使用情况,您必须指定用户 ID。您还可以指定起始日期和结束日期,以及是否显示日志条目。

# radosgw-admin usage show \
                --uid=johndoe --start-date=2012-03-01 \
                --end-date=2012-04-01

您还可以通过省略用户 ID 来显示所有用户的使用情况信息摘要。

# radosgw-admin usage show --show-log-entries=false

3.8.2. trim usage

使用大量使用时,使用情况日志可能会开始占用存储空间。您可以为所有用户和特定用户修剪使用日志。您还可以指定 Trim 操作的日期范围。

[root@master-zone]# radosgw-admin usage trim --start-date=2010-01-01 \
                    --end-date=2010-12-31

[root@master-zone]# radosgw-admin usage trim --uid=johndoe
[root@master-zone]# radosgw-admin usage trim --uid=johndoe --end-date=2013-12-31

3.9. bucket 管理

作为存储管理员,在使用 Ceph 对象网关时,您可以通过在用户之间移动 bucket 并将它们重命名来管理存储桶。此外,您可以在 Ceph 对象网关中发现在存储集群的生命周期内可能会发生孤立或泄漏的对象。

3.9.1. 移动存储桶

The radosgw-admin bucket 实用程序提供在用户之间移动 bucket 的功能。为此,请将存储桶链接到新用户,并将 bucket 的所有权更改为新用户。

您可以移动存储桶:

3.9.1.1. 先决条件

  • 正在运行的 Red Hat Ceph Storage 集群
  • 已安装 Ceph 对象网关
  • bucket
  • 各种租户和非租户用户

3.9.1.2. 在非租户用户之间移动存储桶

The radosgw-admin bucket chown 命令提供将 bucket 的所有权及其包含的所有对象从一个用户更改为另一个用户的功能。为此,请从当前用户取消链接存储桶,将它链接到新用户,然后将 bucket 的所有权更改为新用户。

流程

  1. 将存储桶链接到一个新用户:

    radosgw-admin bucket link --uid=user --bucket=bucket

    替换:

    • 使用用户名 将存储桶链接到的用户
    • 带有 存储桶 名称的存储桶

    例如,要将 数据存储 桶链接到名为 user2 的用户:

    # radosgw-admin bucket link --uid=user2 --bucket=data
  2. 验证存储桶已成功链接到 user2

    # radosgw-admin bucket list --uid=user2
    [
        "data"
    ]
  3. 将存储桶的所有权更改为新用户:

    radosgw-admin bucket chown --uid=user --bucket=bucket

    替换:

    • 用户名 为 user 的用户,将存储桶所有权更改为
    • 带有 存储桶 名称的存储桶

    例如,要将数据存储的所有权更改为 user 2

    # radosgw-admin bucket chown --uid=user2 --bucket=data
  4. 通过检查以下命令输出中的 所有者 行来验证 数据存储 桶的所有权是否已成功更改:

    # radosgw-admin bucket list --bucket=data

3.9.1.3. 在租户用户之间移动存储桶

您可以将存储桶从一个租户用户移动到另一个租户用户。

流程

  1. 将存储桶链接到一个新用户:

    radosgw-admin bucket link --bucket=current-tenant/bucket --uid=new-tenant$user

    替换

    • bucket 是租户名称 的当前 租户
    • 带有 存储桶 名称的存储桶以链接
    • 新租户,名称为新用户的租户
    • 用户名 为新用户的用户

    例如,将 数据存储 桶从 test 租户链接到 test 2 租户中名为 user 2 的用户:

    # radosgw-admin bucket link --bucket=test/data --uid=test2$user2
  2. 验证存储桶已成功链接到 user2

    # radosgw-admin bucket list --uid=test$user2
    [
        "data"
    ]
  3. 将存储桶的所有权更改为新用户:

    radosgw-admin bucket chown --bucket=new-tenant/bucket --uid=new-tenant$user

    替换:

    • 带有 存储桶 名称的存储桶以链接
    • 新租户,名称为新用户的租户
    • 用户名 为新用户的用户

    例如,将 数据存储 桶的所有权更改为 test 2 租户中的 user 2

    # radosgw-admin bucket chown --bucket='test2/data' --uid='test$tuser2'
  4. 通过检查以下命令输出中的 所有者 行来验证 数据存储 桶的所有权是否已成功更改:

    # radosgw-admin bucket list --bucket=test2/data

3.9.1.4. 将存储桶从非租户用户移到租户的用户

您可以将存储桶从非租户用户移到租户用户。

流程

  1. 可选。如果您还没有多个租户,您可以通过启用 rgw_keystone_implicit_tenants 并从外部租户访问 Ceph 对象网关来创建它们:

    打开并编辑 Ceph 配置文件,默认为 /etc/ceph/ceph.conf。启用 rgw_keystone_implicit_tenants 选项:

    rgw_keystone_implicit_tenants = true

    使用 s3cmdswift 命令从外部租户访问 Ceph 对象网关:

    # swift list

    或使用 s3cmd:

    # s3cmd ls

    从外部租户进行第一次访问可创建等效的 Ceph 对象网关用户。

  2. 将存储桶移到租户的用户:

    radosgw-admin bucket link --bucket=/bucket --uid='tenant$user'

    替换

    • 带有 存储桶 名称的存储桶
    • 带有 新用户的租户名称的租户
    • 用户名 为新用户的用户

    例如,将 数据存储 桶移到 测试 租户中的 tenanted-user 中:

    # radosgw-admin bucket link --bucket=/data --uid='test$tenanted-user'
  3. 验证 数据存储 桶是否已成功链接到 tenanted-user

    # radosgw-admin bucket list --uid='test$tenanted-user'
    [
        "data"
    ]
  4. 将存储桶的所有权更改为新用户:

    radosgw-admin bucket chown --bucket='tenant/bucket name' --uid='tenant$user'

    替换

    • 带有 存储桶 名称的存储桶
    • 带有 新用户的租户名称的租户
    • 用户名 为新用户的用户

    例如,将 数据存储 桶的所有权更改为 test 租户内的 tenanted-user

    # radosgw-admin bucket chown --bucket='test/data' --uid='test$tenanted-user'
  5. 通过检查以下命令输出中的 所有者 行来验证 数据存储 桶的所有权是否已成功更改:

    # radosgw-admin bucket list --bucket=test/data

3.9.2. 重命名存储桶

您可以重命名存储桶。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • bucket.

流程

  1. 列出存储桶:

    radosgw-admin bucket list

    例如,请注意输出中的存储桶:

    # radosgw-admin bucket list
    [
        "34150b2e9174475db8e191c188e920f6/swcontainer",
        "s3bucket1",
        "34150b2e9174475db8e191c188e920f6/swimpfalse",
        "c278edd68cfb4705bb3e07837c7ad1a8/ec2container",
        "c278edd68cfb4705bb3e07837c7ad1a8/demoten1",
        "c278edd68cfb4705bb3e07837c7ad1a8/demo-ct",
        "c278edd68cfb4705bb3e07837c7ad1a8/demopostup",
        "34150b2e9174475db8e191c188e920f6/postimpfalse",
        "c278edd68cfb4705bb3e07837c7ad1a8/demoten2",
        "c278edd68cfb4705bb3e07837c7ad1a8/postupsw"
    ]
  2. 重命名存储桶:

    radosgw-admin bucket link --bucket=original-name --bucket-new-name=new-name --uid=user-ID

    例如,要将 s3bucket1 存储桶重命名为 s3newb

    # radosgw-admin bucket link --bucket=s3bucket1 --bucket-new-name=s3newb --uid=testuser

    如果存储桶位于租户中,还要指定租户:

    radosgw-admin bucket link --bucket=tenant/original-name --bucket-new-name=new-name --uid=tenant$user-ID

    例如:

    # radosgw-admin bucket link --bucket=test/s3bucket1 --bucket-new-name=s3newb --uid=test$testuser
  3. 验证存储桶已被重命名:

    radosgw-admin bucket list

    例如:现在存在名为 s3newb 的存储桶:

    # radosgw-admin bucket list
    [
        "34150b2e9174475db8e191c188e920f6/swcontainer",
        "34150b2e9174475db8e191c188e920f6/swimpfalse",
        "c278edd68cfb4705bb3e07837c7ad1a8/ec2container",
        "s3newb",
        "c278edd68cfb4705bb3e07837c7ad1a8/demoten1",
        "c278edd68cfb4705bb3e07837c7ad1a8/demo-ct",
        "c278edd68cfb4705bb3e07837c7ad1a8/demopostup",
        "34150b2e9174475db8e191c188e920f6/postimpfalse",
        "c278edd68cfb4705bb3e07837c7ad1a8/demoten2",
        "c278edd68cfb4705bb3e07837c7ad1a8/postupsw"
    ]

3.9.3. 查找孤立和泄漏对象

健康的存储集群没有任何孤立或泄漏的对象,但在某些情况下可能会发生孤立或泄漏的对象。例如,如果 Ceph 对象网关在操作的中间发生,这可能会导致一些对象变得孤立。另外,未发现的错误可能导致孤立对象发生。

自红帽 Ceph 存储 4.1 开始,存储管理员可以了解 Ceph 对象网关对象如何映射到 RADOS 对象。The radosgw-admin 命令为您提供一个新工具,可搜索和生成这些潜在孤立或泄漏对象的列表。使用 radoslist 子命令将显示 bucket 中存储的对象,或者存储群集中的所有 bucket。rgw-orphan-list 脚本将显示池中的孤立对象。

警告

rgw-orphan-list 命令仍为实验性命令。在删除任何使用 rados rm 命令之前,请谨慎并仔细评估它中列出的对象。

重要

The radoslist 子命令将替代已弃用的 孤立的 findorphans finish 子命令。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 正在运行的 Ceph 对象网关.

流程

  1. 生成存储桶中保存数据的对象列表:

    语法

    radosgw-admin bucket radoslist --bucket BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin bucket radoslist --bucket mybucket

    注意

    如果省略 BUCKET_NAME,则会显示所有存储桶中的所有对象。

  2. 为池生成孤立项列表:

    [root@rgw ~]# rgw-orphan-list

    示例

    Available pools:
        .rgw.root
        default.rgw.control
        default.rgw.meta
        default.rgw.log
        default.rgw.buckets.index
        default.rgw.buckets.data
        rbd
        default.rgw.buckets.non-ec
        ma.rgw.control
        ma.rgw.meta
        ma.rgw.log
        ma.rgw.buckets.index
        ma.rgw.buckets.data
        ma.rgw.buckets.non-ec
    Which pool do you want to search for orphans?

    输入池名称以搜索孤立项。

    重要

    在使用 rgw-orphan-list 命令而非元数据池时,必须指定数据池。

  3. 检查列表中的孤立对象。
  4. 删除孤立对象:

    语法

    rados -p POOL_NAME rm OBJECT_NAME

    示例

    [root@rgw ~]# rados -p default.rgw.buckets.data rm myobject

    警告

    验证您是否删除了正确的对象。执行 rados rm 命令将从存储群集中删除数据。

其它资源

  • 如需了解有关 legacy radosgw-admin orphans find 子命令的更多详细信息,请参阅红帽 Ceph 存储 3 对象网关管理指南中的 查找对象 一节。

3.9.4. 管理存储桶索引条目

您可以使用 radosgw-admin bucket check 子命令,管理红帽 Ceph 存储集群中 Ceph 对象网关的 bucket 索引条目。

每个与多部分上传对象相关的存储桶索引条目都与其对应的 .meta 索引条目匹配。应该有一个 .meta 条目作为给定多部分上传的所有部分。如果找不到对应的 .meta 条目,它会列出输出的一个部分中的"孤立"部分条目。

bucket 的 stats 存储在存储桶索引标头中。此阶段加载这些标头,也迭代存储桶索引中的所有纯文本对象条目,并重新计算统计。然后,它会在标记为 "existing_header" 和 "calculated_header" 的部分中显示实际和计算的统计,因此可以比较它们。

如果您将 --fix 选项与 存储桶检查 子命令搭配使用,它会从存储桶索引中删除"孤立"条目,并使用它计算的标头中的现有统计信息覆盖。它会导致所有条目(包括版本控制中使用的多个条目)都列在输出的一个部分中。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 正在运行的 Ceph 对象网关.
  • 已创建一个存储桶。

流程

  1. 检查特定存储桶的存储桶索引:

    语法

    radosgw-admin bucket check --bucket=BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin bucket check --bucket=mybucket

  2. 修复存储桶索引中的不一致,包括删除孤立的对象:

    语法

    radosgw-admin bucket check --fix --bucket=BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin bucket check --fix --bucket=mybucket

3.9.5. bucket 通知

bucket 通知提供了一种方式,可以在 bucket 中发生特定事件时从 Ceph 对象网关发送信息。bucket 通知可以发送到 HTTP、AMQP0.9.1 和 Kafka 端点。

必须创建一个通知条目,以便为特定存储桶上的事件和特定主题发送存储桶通知。可以在事件类型的子集上创建 bucket 通知,也可以默认为所有事件类型创建 bucket 通知。bucket 通知可以根据密钥前缀或后缀、匹配键的正则表达式、附加到对象或对象标签的元数据属性过滤出事件。bucket 通知具有 REST API,用于为 bucket 通知机制提供配置和控制接口。

注意

bucket 通知 API 默认启用。如果明确设置了 rgw_enable_apis 配置参数,请确保包含 s3pubsub。要验证这一点,请运行 ceph config get mon.* rgw_enable_apis 命令。

其它资源

3.9.6. 创建存储桶通知

在 bucket 级别上创建 bucket 通知。通知配置具有红帽 Ceph 存储对象网关 S3 事件,即 ObjectCreatedObjectRemoved。这些需要发布,以及发送 bucket 通知的目的地。bucket 通知是 S3 操作。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 正在运行的 HTTP 服务器、RabbitMQ 服务器或 Kafka 服务器。
  • 根级别访问权限.
  • 安装红帽 Ceph 存储对象网关.
  • 用户 access key 和 secret key。
  • 端点参数.
重要

红帽支持 ObjectCreate 事件,如 放置、放置postmultipartUploadcopy。红帽还支持 ObjectRemove 事件,如 object_deletes3_multi_object_delete

流程

  1. 创建 s3 存储桶。
  2. httpamqpkafka 协议创建一个 SNS 主题。
  3. 为 s 3:objectCreate 和 s3:object Remove 事件创建一个 s3 存储桶通知:

    示例

    client.put_bucket_notification_configuration(
       Bucket=bucket_name,
       NotificationConfiguration={
           'TopicConfigurations': [
               {
                   'Id': notification_name,
                   'TopicArn': topic_arn,
                   'Events': ['s3:ObjectCreated:*', 's3:ObjectRemoved:*']
               }]})

  4. 在 bucket 中创建 s3 对象。
  5. http or rabbitmqkafka 接收器上验证对象创建事件。
  6. 删除对象。
  7. http or rabbitmqkafka 接收器上验证对象删除事件。

3.9.7. 其它资源

3.10. bucket 生命周期

作为存储管理员,您可以使用存储桶生命周期配置来管理对象,以便它们在整个生命周期中有效地存储。例如,您可以将对象转换为成本较低的存储类、存档甚至根据您的用例删除它们。

注意

radosgw-admin lc reshard 命令在 Red Hat Ceph Storage 3.3 中已弃用,Red Hat Ceph Storage 4 及更新的版本中不被支持。

3.10.1. 创建生命周期管理策略

您可以使用标准 S3 操作来管理 bucket 生命周期策略配置,而不是使用 radosgw-admin 命令。RADOS 网关仅支持应用于 bucket 的 Amazon S3 API 策略语言的子集。生命周期配置包含为一组 bucket 对象定义的一个或多个规则。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • 已创建一个 S3 存储桶。
  • 创建的用户具有访问权限的 S3 用户。
  • 使用安装的 AWS CLI 软件包访问 Ceph 对象网关客户端。

流程

  1. 为生命周期配置创建 JSON 文件:

    示例

    [user@client ~]$ vi lifecycle.json

  2. 在 文件中添加特定生命周期配置规则:

    示例

    {
    	"Rules": [
            {
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled",
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration"
    	    }
        ]
    }

    生命周期配置示例在 images 目录中过期对象,这些对象超过 1 天。

  3. 在存储桶上设置生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api put-bucket-lifecycle-configuration --bucket BUCKET_NAME --lifecycle-configuration file://PATH_TO_LIFECYCLE_CONFIGURATION_FILE/LIFECYCLE_CONFIGURATION_FILE.json

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api put-bucket-lifecycle-configuration --bucket testbucket --lifecycle-configuration file://lifecycle.json

    在本例中,cluster .json 文件存在于当前目录中。

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api get-bucket-lifecycle-configuration --bucket testbucket
    {
    	"Rules": [
            {
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration",
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled"
    	    }
        ]
    }

  • 可选:在 Ceph 对象网关节点中登录 Cephadm shell 并检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin lc get --bucket=testbucket
    {
    	"prefix_map": {
    		"images/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		}
    	},
    	"rule_map": [
            {
    		"id": "ImageExpiration",
    		"rule": {
    			"id": "ImageExpiration",
    			"prefix": "",
    			"status": "Enabled",
    			"expiration": {
    				"days": "1",
    				"date": ""
    			},
    			"mp_expiration": {
    				"days": "",
    				"date": ""
    			},
    			"filter": {
    				"prefix": "images/",
    				"obj_tags": {
    					"tagset": {}
    				}
    			},
    			"transitions": {},
    			"noncur_transitions": {},
    			"dm_expiration": false
    		}
    	}
      ]
    }

其它资源

3.10.2. 删除生命周期管理策略

您可以使用 s3api delete-bucket-lifecycle 命令删除指定存储桶的生命周期管理策略。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • 已创建一个 S3 存储桶。
  • 创建的用户具有访问权限的 S3 用户。
  • 使用安装的 AWS CLI 软件包访问 Ceph 对象网关客户端。

流程

  • 删除生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api delete-bucket-lifecycle --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api delete-bucket-lifecycle --bucket testbucket

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]# aws --endpoint-url=http://host01:80  s3api get-bucket-lifecycle-configuration --bucket testbucket

  • 可选: 在 Ceph 对象网关节点中检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin lc get --bucket=testbucket

    注意

    如果没有存储桶生命周期策略,命令不会返回任何信息。

其它资源

3.10.3. 更新生命周期管理策略

您可以使用 s3cmd put-bucket-lifecycle-configuration 命令更新生命周期管理策略。

注意

put-bucket-lifecycle-configuration 会覆盖现有的存储桶生命周期配置。如果要保留任何当前生命周期策略设置,则必须在生命周期配置文件中包括它们。

先决条件

  • 正在运行的红帽存储集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.
  • 已创建一个 S3 存储桶。
  • 创建的用户具有访问权限的 S3 用户。
  • 使用安装的 AWS CLI 软件包访问 Ceph 对象网关客户端。

流程

  1. 为生命周期配置创建 JSON 文件:

    示例

    [user@client ~]$ vi lifecycle.json

  2. 将特定生命周期配置规则添加到该文件中:

    示例

    {
    	"Rules": [
            {
    		    "Filter": {
    			    "Prefix": "images/"
    		    },
    		    "Status": "Enabled",
    		    "Expiration": {
    			    "Days": 1
    		    },
    		    "ID": "ImageExpiration"
    	    },
    		{
    			"Filter": {
    				"Prefix": "docs/"
    			},
    			"Status": "Enabled",
    			"Expiration": {
    				"Days": 30
    			},
    			"ID": "DocsExpiration"
    		}
    	]
    }

  3. 更新存储桶上的生命周期配置:

    语法

    aws --endpoint-url=RADOSGW_ENDPOINT_URL:PORT s3api put-bucket-lifecycle-configuration --bucket BUCKET_NAME --lifecycle-configuration file://PATH_TO_LIFECYCLE_CONFIGURATION_FILE/LIFECYCLE_CONFIGURATION_FILE.json

    示例

    [user@client ~]$ aws --endpoint-url=http://host01:80 s3api put-bucket-lifecycle-configuration --bucket testbucket --lifecycle-configuration file://lifecycle.json

验证

  • 检索存储桶的生命周期配置:

    语法

    aws --endpointurl=RADOSGW_ENDPOINT_URL:PORT s3api get-bucket-lifecycle-configuration --bucket BUCKET_NAME

    示例

    [user@client ~]$ aws -endpoint-url=http://host01:80 s3api get-bucket-lifecycle-configuration --bucket testbucket
    
    {
        "Rules": [
            {
                "Expiration": {
                    "Days": 30
                },
                "ID": "DocsExpiration",
                "Filter": {
                    "Prefix": "docs/"
                },
                "Status": "Enabled"
            },
            {
                "Expiration": {
                    "Days": 1
                },
                "ID": "ImageExpiration",
                "Filter": {
                    "Prefix": "images/"
                },
                "Status": "Enabled"
            }
        ]
    }

  • 可选:在 Ceph 对象网关节点中登录 Cephadm shell 并检索存储桶生命周期配置:

    语法

    radosgw-admin lc get --bucket=BUCKET_NAME

    示例

    [root@rgw ~]# radosgw-admin lc get --bucket=testbucket
    {
    	"prefix_map": {
            "docs/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		},
    		"images/": {
    			"status": true,
    			"dm_expiration": false,
    			"expiration": 1,
    			"noncur_expiration": 0,
    			"mp_expiration": 0,
    			"transitions": {},
    			"noncur_transitions": {}
    		}
    	},
    	"rule_map": [
            {
            "id": "DocsExpiration",
        	"rule": {
        		"id": "DocsExpiration",
        		"prefix": "",
        		"status": "Enabled",
        		"expiration": {
        			"days": "30",
        			"date": ""
        		},
                "noncur_expiration": {
                    "days": "",
                    "date": ""
                },
        		"mp_expiration": {
        			"days": "",
        			"date": ""
        		},
        		"filter": {
        			"prefix": "docs/",
        			"obj_tags": {
        				"tagset": {}
        			}
        		},
        		"transitions": {},
        		"noncur_transitions": {},
        		"dm_expiration": false
        	}
        },
        {
    		"id": "ImageExpiration",
    		"rule": {
    			"id": "ImageExpiration",
    			"prefix": "",
    			"status": "Enabled",
    			"expiration": {
    				"days": "1",
    				"date": ""
    			},
    			"mp_expiration": {
    				"days": "",
    				"date": ""
    			},
    			"filter": {
    				"prefix": "images/",
    				"obj_tags": {
    					"tagset": {}
    				}
    			},
    			"transitions": {},
    			"noncur_transitions": {},
    			"dm_expiration": false
    		}
    	}
      ]
    }

其它资源

3.10.4. 监控存储桶生命周期

您可以使用 radosgw- admin lc 列表和 radosgw-admin lc 进程 命令监控生命周期并手动处理存储桶的生命周期。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • Ceph 对象网关节点的根级别访问权限.
  • 创建 S3 存储桶,并应用了生命周期配置策略。

流程

  1. 列出存储桶生命周期进度:

    示例

    [root@rgw ~]# radosgw-admin lc list
    
    [
       {
             “bucket”: “:testbucket:8b63d584-9ea1-4cf3-8443-a6a15beca943.54187.1”,
             “started”: “Thu, 01 Jan 1970 00:00:00 GMT”,
             “status” : “UNINITIAL”
       },
       {
             “bucket”: “:testbucket1:8b635499-9e41-4cf3-8443-a6a15345943.54187.2”,
             “started”: “Thu, 01 Jan 1970 00:00:00 GMT”,
             “status” : “UNINITIAL”
       }
    ]

    存储桶生命周期处理状态可以是以下之一:

    • UNINITIAL - 进程尚未运行。
    • PROCESSING - 进程当前正在运行。
    • COMPLETE - 该过程已完成。
  2. 可选:您可以手动处理存储桶生命周期策略:

    1. 在单个存储桶中处理生命周期策略:

      语法

      radosgw-admin lc process --bucket=BUCKET_NAME

      示例

      [root@rgw ~]# radosgw-admin lc process --bucket=testbucket1

    2. 立即处理所有存储桶生命周期策略:

      示例

      [root@rgw ~]# radosgw-admin lc process

验证

  • 列出存储桶生命周期策略:

    [root@rgw ~]# radosgw-admin lc list
    [
        {
              “bucket”: “:testbucket:8b63d584-9ea1-4cf3-8443-a6a15beca943.54187.1”,
              “started”: “Thu, 17 Mar 2022 21:48:50 GMT”,
              “status” : “COMPLETE”
        }
        {
              “bucket”: “:testbucket1:8b635499-9e41-4cf3-8443-a6a15345943.54187.2”,
              “started”: “Thu, 17 Mar 2022 20:38:50 GMT”,
              “status” : “COMPLETE”
        }
    ]

其它资源

3.10.5. 配置生命周期过期窗口

您可以通过设置 rgw_lifecycle_work_time 参数,设置生命周期管理进程每天运行的时间。默认情况下,生命周期处理每天会在午夜进行一次。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 设置生命周期过期时间:

    语法

    ceph config set client.rgw rgw_lifecycle_work_time %D:%D-%D:%D

    %d:%d-%d:%d 替换为 start_hour:start_minute-end_hour:end_minute

    示例

    [root@rgw ~]# ceph config set client.rgw rgw_lifecycle_work_time 06:00-08:00

验证

  • 检索生命周期过期时间:

    示例

    [root@rgw ~]# ceph config get client.rgw rgw_lifecycle_work_time
    
    06:00-08:00

其它资源

3.10.6. S3 bucket 生命周期在存储集群中转换

您可以使用 bucket 生命周期配置来管理对象,以便在整个对象生命周期内有效存储对象。对象生命周期转换规则允许您在对象生命周期内管理和有效存储对象。您可以将对象转换到成本较低的存储类,存档甚至删除它们。

您可以为以下对象创建存储类:

  • 快速介质,如 SSD 或 NVMe 用于 I/O 敏感工作负载
  • 缓慢的磁带介质,如 SAS 或 SATA 归档。

您可以为热存储类和冷存储类之间的数据移动创建调度。您可以在指定时间后调度此移动,以便对象过期并被永久删除,例如,您可以在创建对象 30 天后将其转换为存储类,甚至可以在创建对象后一年将对象归档到存储类。您可以通过转换规则完成此操作。这个规则适用于从一个存储类转换到另一个存储类的对象。生命周期配置包含使用 <Rule> 元素的一个或多个规则。

其它资源

  • 如需了解有关 存储桶生命周期 的详细信息,请参阅 Red Hat Ceph Storage Developer Guide

3.10.7. 将对象从一个存储类转换到另一个存储类

对象生命周期转换规则允许您将对象从一个存储类转换为另一个类。

先决条件

  • 安装 Ceph 对象网关软件.
  • Ceph 对象网关节点的根级别访问权限.
  • 创建的用户具有访问权限的 S3 用户。

流程

  1. 创建新数据池:

    语法

    ceph osd pool create POOL_NAME

    示例

    [root@rgw ~]# ceph osd pool create test.hot.data

  2. 添加新存储类:

    语法

    radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS

    示例

    [root@rgw ~]# radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id default-placement --storage-class hot.test
    {
            "key": "default-placement",
            "val": {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "STANDARD",
                    "hot.test"
                ]
            }
        }

  3. 为新存储类提供区放置信息:

    语法

    radosgw-admin zone placement add --rgw-zone default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS --data-pool DATA_POOL

    示例

    [root@rgw ~]# radosgw-admin zone placement add --rgw-zone default --placement-id default-placement --storage-class hot.test --data-pool test.hot.data
    {
               "key": "default-placement",
               "val": {
                   "index_pool": "test_zone.rgw.buckets.index",
                   "storage_classes": {
                       "STANDARD": {
                           "data_pool": "test.hot.data"
                       },
                       "hot.test": {
                           "data_pool": "test.hot.data",
                      }
                   },
                   "data_extra_pool": "",
                   "index_type": 0
               }

    注意

    在创建具有写入一次的冷或归档数据存储池时,请考虑设置 compression_type

  4. 在数据池中启用 rgw 应用程序:

    语法

    ceph osd pool application enable POOL_NAME rgw

    示例

    [root@rgw ~] ceph osd pool application enable test.hot.data rgw
    enabled application 'rgw' on pool 'test.hot.data'

  5. 重新启动所有 rgw 守护进程。
  6. 创建存储桶:

    示例

    [root@rgw ~]# aws s3api create-bucket --bucket testbucket10 --create-bucket-configuration LocationConstraint=default:default-placement --endpoint-url http://1x.7x.2xx.1xx:80

  7. 添加对象:

    示例

    [root@rgw ~]# aws --endpoint=http://1x.7x.2xx.1xx:80 s3api put-object --bucket testbucket10  --key compliance-upload --body /root/test2.txt

  8. 创建第二个数据池:

    语法

    ceph osd pool create POOL_NAME

    示例

    [root@rgw ~]# ceph osd pool create test.cold.data

  9. 添加新存储类:

    语法

    radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS

    示例

    [root@rgw ~]# radosgw-admin zonegroup placement add  --rgw-zonegroup default --placement-id default-placement --storage-class cold.test
    {
            "key": "default-placement",
            "val": {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "STANDARD",
                    "cold.test"
                ]
            }
        }

  10. 为新存储类提供区放置信息:

    语法

    radosgw-admin zone placement add --rgw-zone default --placement-id PLACEMENT_TARGET --storage-class STORAGE_CLASS --data-pool DATA_POOL

    示例

    [root@rgw ~]# radosgw-admin zone placement add --rgw-zone default --placement-id default-placement --storage-class cold.test --data-pool test.cold.data

  11. 在数据池中启用 rgw 应用程序:

    语法

    ceph osd pool application enable POOL_NAME rgw

    示例

    [root@rgw ~] ceph osd pool application enable test.cold.data rgw
    enabled application 'rgw' on pool 'test.cold.data'

  12. 重新启动所有 rgw 守护进程。
  13. 要查看区组群配置,请执行:

    语法

    radosgw-admin zonegroup get
    {
        "id": "3019de59-ddde-4c5c-b532-7cdd29de09a1",
        "name": "default",
        "api_name": "default",
        "is_master": "true",
        "endpoints": [],
        "hostnames": [],
        "hostnames_s3website": [],
        "master_zone": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
        "zones": [
            {
                "id": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
                "name": "default",
                "endpoints": [],
                "log_meta": "false",
                "log_data": "false",
                "bucket_index_max_shards": 11,
                "read_only": "false",
                "tier_type": "",
                "sync_from_all": "true",
                "sync_from": [],
                "redirect_zone": ""
            }
        ],
        "placement_targets": [
            {
                "name": "default-placement",
                "tags": [],
                "storage_classes": [
                    "hot.test",
                    "cold.test",
                    "STANDARD"
                ]
            }
        ],
        "default_placement": "default-placement",
        "realm_id": "",
        "sync_policy": {
            "groups": []
        }
    }

  14. 要查看区配置,请执行:

    语法

    radosgw-admin zone get
    {
        "id": "adacbe1b-02b4-41b8-b11d-0d505b442ed4",
        "name": "default",
        "domain_root": "default.rgw.meta:root",
        "control_pool": "default.rgw.control",
        "gc_pool": "default.rgw.log:gc",
        "lc_pool": "default.rgw.log:lc",
        "log_pool": "default.rgw.log",
        "intent_log_pool": "default.rgw.log:intent",
        "usage_log_pool": "default.rgw.log:usage",
        "roles_pool": "default.rgw.meta:roles",
        "reshard_pool": "default.rgw.log:reshard",
        "user_keys_pool": "default.rgw.meta:users.keys",
        "user_email_pool": "default.rgw.meta:users.email",
        "user_swift_pool": "default.rgw.meta:users.swift",
        "user_uid_pool": "default.rgw.meta:users.uid",
        "otp_pool": "default.rgw.otp",
        "system_key": {
            "access_key": "",
            "secret_key": ""
        },
        "placement_pools": [
            {
                "key": "default-placement",
                "val": {
                    "index_pool": "default.rgw.buckets.index",
                    "storage_classes": {
                        "cold.test": {
                            "data_pool": "test.cold.data"
                        },
                        "hot.test": {
                            "data_pool": "test.hot.data"
                        },
                        "STANDARD": {
                            "data_pool": "default.rgw.buckets.data"
                        }
                    },
                    "data_extra_pool": "default.rgw.buckets.non-ec",
                    "index_type": 0
                }
            }
        ],
        "realm_id": "",
        "notif_pool": "default.rgw.log:notif"
    }

  15. 创建存储桶:

    示例

    [root@rgw ~]# aws s3api create-bucket --bucket testbucket10 --create-bucket-configuration LocationConstraint=default:default-placement --endpoint-url http://1x.7x.2xx.1xx:80

  16. 为生命周期配置创建 JSON 文件:

    示例

    [root@rgw ~]# vi lifecycle.json

  17. 在文件中添加特定的生命周期配置规则:

    示例

    {
        "Rules": [
            {
                "Filter": {
                    "Prefix": ""
                },
                "Status": "Enabled",
                "Transitions": [
                    {
                        "Days": 5,
                        "StorageClass": "hot.test"
                    },
     {
                        "Days": 20,
                        "StorageClass": "cold.test"
                    }
                ],
                "Expiration": {
                    "Days": 365
                },
                "ID": "double transition and expiration"
            }
        ]
    }

    生命周期配置示例显示一个对象,它将在 5 天后从默认 STANDARD 存储类过渡到 hot.test 存储类,在 20 天后过渡到 cold.test 存储类,并在冷 .test 存储类中最终 365 天后过期。

  18. 在存储桶上设置生命周期配置:

    示例

    [root@rgw ~] aws s3api put-bucket-lifecycle-configuration --bucket testbucket20 --lifecycle-configuration file://lifecycle.json

  19. 检索存储桶上的生命周期配置:

    示例

    [root@rgw ~]aws s3api get-bucket-lifecycle-configuration --bucket testbucket20
    {
        "Rules": [
            {
                "Expiration": {
                    "Days": 365
                },
                "ID": "double transition and expiration",
                "Prefix": "",
                "Status": "Enabled",
                "Transitions": [
                    {
                        "Days": 20,
                        "StorageClass": "cold.test"
                    },
                    {
                        "Days": 5,
                        "StorageClass": "hot.test"
                    }
                ]
            }
        ]
    }

其它资源

  • 如需了解有关 存储桶生命周期 的详细信息,请参阅 Red Hat Ceph Storage Developer Guide

3.11. Ceph 对象网关数据布局

虽然 RADOS 仅了解池和对象及其扩展属性(xattrs)和对象映射(OMAP),但概念上 Ceph 对象网关将其数据分为三种不同的类型:

  • metadata
  • bucket 索引
  • data

元数据

元数据有三个部分:

  • 用户 :保存用户信息。
  • bucket :包含 bucket 名称和 bucket 实例 ID 之间的映射。
  • bucket.instance :olds bucket 实例信息。

您可以使用以下命令查看元数据条目:

语法

radosgw-admin metadata get bucket:BUCKET_NAME
radosgw-admin metadata get bucket.instance:BUCKET:BUCKET_ID
radosgw-admin metadata get user:USER
radosgw-admin metadata set user:USER

示例

[root@host01 ~]# radosgw-admin metadata list
[root@host01 ~]# radosgw-admin metadata list bucket
[root@host01 ~]# radosgw-admin metadata list bucket.instance
[root@host01 ~]# radosgw-admin metadata list user

每个元数据条目都保存在单个 RADOS 对象上。

注意

Ceph 对象网关对象可能由多个 RADOS 对象组成,第一个是包含元数据的头头,如清单、Access Control List (ACL)、内容类型、ETag 和用户定义元数据。元数据存储在 xattrs 中。头条还可能包含最多 512 KB 的对象数据,以提高效率和原子性。清单描述各个对象在 RADOS 对象中如何布局。

bucket 索引

它是不同的元数据,单独保存。bucket 索引包含 RADOS 对象中的 key-value 映射。默认情况下,每个存储桶是一个单一 RADOS 对象,但可以跨多个 RADOS 对象对映射进行分片。

映射本身保存在与每个 RADOS 对象关联的 OMAP 中。每个 OMAP 的密钥是对象的名称,值包含该对象的基本元数据,这是列出存储桶时显示的元数据。每个 OMAP 包含一个标头,我们将一些存储桶核算元数据保存在该标头中,如对象数量、总大小,等等。

注意

OMAP 是一个键值存储,与对象关联,其方式类似于与 POSIX 文件关联的扩展属性。对象的 OMAP 不实际位于对象存储中,但其精确的实施对 Ceph 对象网关不可见。

data

对象数据保存在每个 Ceph 对象网关对象的一个或多个 RADOS 对象中。

3.11.1. 对象查找路径

访问对象时,REST API 会出现 Ceph 对象网关,具有三个参数:

  • 帐户信息,它在 Swift 中具有 S3 或帐户名称中的 access 密钥
  • bucket 或容器名称
  • 对象名称或密钥

目前,Ceph 对象网关仅使用帐户信息来查找用户 ID 和 访问控制。它只使用存储桶名称和对象键来对池中的对象进行地址。

帐户信息

Ceph 对象网关中的用户 ID 是一个字符串,通常是来自用户凭证的实际用户名,而不是散列或映射的标识符。

在访问用户数据时,从 default.rgw.meta 池中的 object USER_ID 加载 用户 记录。

bucket 名称

它们用 root 命名空间在 default.rgw.meta 池中表示。bucket 记录被加载,以获取作为 bucket ID 的标记。

对象名称

该对象位于 default.rgw.buckets.data 池中。对象名称为 MARKER_KEY,如 default.7593.4_image.png,其中标记是 default.7593.4,键是 image.png。这些串联的名称没有解析,仅传递到 RADOS。因此,选择分隔符并不重要,这会导致不清。原因相同,在对象名称(如键)中允许斜杠。

3.11.1.1. 多个数据池

可以创建多个数据池,从而默认在不同 RADOS 池中创建不同的用户存储桶,从而提供必要的扩展。这些池的布局和命名通过 策略 设置进行控制。

3.11.2. bucket 和对象列表

属于给定用户的存储桶列在名为 USER_ID.buckets 的 OMAP 中,例如: foo.buckets,在 default.rgw.meta 池中具有 users.uid 命名空间。在列出 bucket 时、更新存储桶内容以及更新和检索 bucket 统计数据(如配额)时,可以访问这些对象。这些列表与 .rgw 池中的 bucket 保持一致。

注意

如需这些 OMAP 条目的值,请参阅用户可见、编码的类 cls_user _bucket 及其嵌套类 cls_user_bucket

属于给定存储桶的对象列在存储桶索引中。索引对象的默认命名是 default.rgw.buckets.index 池中的 .dir.MARKER

其它资源

  • 如需了解更多详细信息,请参阅 Red Hat Ceph Storage Object Gateway 指南中的 配置存储桶分片 部分。

3.12. 对象网关数据布局参数

这是 Ceph 对象网关的数据布局参数列表。

已知池:

.rgw.root
未指定的地区、区域和全局信息记录,每个对象一个。
ZONE.rgw.control
通知。N
ZONE.rgw.meta

具有不同元数据的多个命名空间

Namespace: root

BUCKET .bucket.meta.BUCKET:MARKER # see put_bucket_instance_info()

租户用于模糊的存储桶,但不用于 bucket 实例。

示例

.bucket.meta.prodtx:test%25star:default.84099.6
.bucket.meta.testcont:default.4126.1
.bucket.meta.prodtx:testcont:default.84099.4
prodtx/testcont
prodtx/test%25star
testcont

Namespace:user.uid

包含USER 对象中的 _ both_ per-user 信息(RGWUserInfo),以及 USER.buckets 对象的 omaps 中各个用户 bucket 列表。如果非空,USER 可能会包含租户。

示例

prodtx$prodt
test2.buckets
prodtx$prodt.buckets
test2

Namespace: users.email
unimportant
Namespace: users.keys

47UA98JSTJZ9YAN3OS3O

这使得 Ceph 对象网关在身份验证期间通过其访问密钥来查找用户。

Namespace: users.swift
test:tester
ZONE.rgw.buckets.index
对象名为 .dir.MARKER,各自包含一个 bucket 索引。如果索引被分片,每个分片都会在标记后附加分片索引。
ZONE.rgw.buckets.data

default.7593.4__shadow_.488urDFerTYXavx4yAd-Op8mxehnvTI_1 MARKER_KEY

一个标记示例为 default.16004.1default.7593.4。当前格式为 ZONE.INSTANCE_ID.BUET_ID,但生成后,不会再次解析标记,因此其格式可能会在以后自由地改变。

其它资源

3.13. STS 中基于属性访问控制(ABAC)的会话标签

会话标签是键值对,可在生成用户时传递。它们作为 aws:PrincipalTag 在会话中传递,或者由安全令牌服务(STS)返回的临时凭证。这些主体标签由会话标签组成,这些标签作为 web 令牌的一部分以及附加到所假定角色的标签组成。

注意

目前,会话标签仅支持作为传递给 AssumeRoleWithWebIdentity 的 web 令牌的一部分。

标签必须始终在以下命名空间中指定: https://aws.amazon.com/tags

重要

如果联合用户传递的 web 令牌包含会话标签,则信任策略必须具有 sts:TagSession 权限。否则,AssumeRoleWithWebIdentity 操作会失败。

带有 sts:TagSession 的信任策略示例:

{
        "Version":"2012-10-17",
        "Statement":[
        {
            "Effect":"Allow",
            "Action":["sts:AssumeRoleWithWebIdentity","sts:TagSession"],
            "Principal":{"Federated":["arn:aws:iam:::oidc-provider/localhost:8080/auth/realms/quickstart"]},
            "Condition":{"StringEquals":{"localhost:8080/auth/realms/quickstart:sub":"test"}}
        }]
    }

Properties

以下是会话标签的属性:

  • 会话标签可以是多值。

    注意

    Amazon Web Service (AWS)不支持多值的会话标签。

  • Keycloak 可以设置为最多 50 个会话标签的 OpenID Connect 身份提供程序(IDP)。
  • 允许键的最大大小为 128 个字符。
  • 允许的值是 256 个字符的最大值。
  • 标签或值不能以 aws: 开头。

其它资源

3.13.1. 标签键

以下是可在角色信任策略或角色权限策略中使用的标签键。

aws:RequestTag
Description

将请求中传递的键值对与角色信任策略中的键值对进行比较。

如果 AssumeRoleWithWebIdentity,会话标签可以在角色信任策略中用作 aws:RequestTag。这些会话标签由 web 令牌中的 Keycloak 传递。因此,联合用户可以假定角色。

aws:PrincipalTag
Description

将附加到主体的键值对与策略中的键值对进行比较。

如果 AssumeRoleWithWebIdentity,当一个用户通过身份验证后,会话标签会在临时凭证中显示为主体标签。这些会话标签由 web 令牌中的 Keycloak 传递。在角色权限策略中,它们可以用作 aws:PrincipalTag

iam:ResourceTag
Description

将附加到资源的键值对与策略中的键值对进行比较。

如果 AssumeRoleWithWebIdentity,附加到该角色的标签与信任策略中的标签进行比较,以便用户假定角色。

注意

Ceph 对象网关现在支持 RESTful API 在角色上进行标记、列出标签和取消标记操作。

aws:TagKeys
Description

将请求中的标签与策略中的标签进行比较。

对于 AssumeRoleWithWebIdentity,标签用于检查角色信任策略或权限策略中的标签键,然后再允许用户假定角色。

s3:ResourceTag
Description

将 S3 资源中存在的标签与角色权限策略中的标签进行比较,即 bucket 或对象。

它可用于在 Ceph 对象网关中授权 S3 操作。但是,AWS 中不允许这样做。

它是用于引用附加到对象或 bucket 的标签的关键。可以使用可用于相同功能的 RESTful API,将标签附加到对象或 bucket。

3.13.2. S3 资源标签

下表显示了支持哪些 S3 资源标签类型来授权特定操作。

标签类型:对象类型
操作
GetObject,GetObjectTags,DeleteObjectTags,DeleteObject,PutACLs,InitMultipart , AbortMultipart, 'ListMultipart,GetAttrs,PutObjectRetention,GetObjectRetention,PutObjectLegalHold,GetObjectLegalHold
标签类型:Bucket 标签
操作
PutObjectTags,GetBucketTags,PutBucketTags,DeleteBucketTags,GetBucketReplication,DeleteBucketReplication,GetBucketVersioning,SetBucketVersioning,GetBucketWebsite,SetBucketWebsite,DeleteBucketWebsite, StatBucket,ListBucket,GetBucketLogging,GetBucketLocation,DeleteBucket,GetLC,PutLC,DeleteLC,GetCORS,PutCORS, GetRequestPayment ,GetRequestPayment, SetRequestPayment.PutBucketPolicy,GetBucketPolicy,DeleteBucketPolicy,PutBucketObjectLock,GetBucketObjectLock,GetBucketPolicyStatus,PutBucketPublicAccessBlock,GetBucketPublicAccessBlock,DeleteBucketPublicAccessBlock
标签类型:存储桶 ACL 的 Bucket 标签,对象 ACL 的对象标签
操作
GetACLs,PutACLs
标签类型:源对象的对象标签,目的地存储桶的 Bucket 标签
操作
PutObject,CopyObject

3.14. 优化 Ceph 对象网关的垃圾回收

当新数据对象写入到存储集群中时,Ceph 对象网关会立即为这些新对象分配存储。在删除或覆盖存储集群中的数据对象后,Ceph 对象网关将从存储桶索引中删除这些对象。之后一段时间后,Ceph 对象网关会清除用于存储存储群集中对象的空间。从存储集群中清除已删除对象数据的过程称为 Garbage Collection 或 GC。

垃圾回收操作通常在后台运行。您可以将这些操作配置为持续执行,或者仅在低活动和轻型工作负载期间运行。默认情况下,Ceph 对象网关持续执行 GC 操作。由于 GC 操作是 Ceph 对象网关操作的一个正常部分,因此大部分时间都存在符合垃圾回收条件的已删除对象。

3.14.1. 查看垃圾回收队列

在从存储集群中清除被删除和覆盖对象前,useradosgw-admin 来查看等待垃圾回收的对象。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • Ceph 对象网关的根级别访问权限.

流程

  1. 查看等待垃圾回收的对象队列:

    示例

    [root@rgw ~] radosgw-admin gc list

注意

要列出队列中的所有条目,包括未过期条目,请使用 --include-all 选项。

3.14.2. 为删除密集型工作负载调整垃圾回收

有些工作负载可能会临时或永久超过垃圾收集活动的速度。对于删除密集型工作负载而言,这尤其适用,其中很多对象在短时间内存储,然后会被删除。对于这些类型的工作负载,请考虑增加垃圾回收操作相对于其他操作的优先级。如有关于 Ceph 对象网关粘合的其他问题,请联系红帽支持团队。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 对存储集群中所有节点的根级别访问权限。

流程

  1. 打开 /etc/ceph/ceph.conf 进行编辑。
  2. rgw_gc_max_concurrent_io 的 值设置为 20,将 rgw_gc_max_trim_chunk 的 值设置为 64。

    rgw_gc_max_concurrent_io = 20
    rgw_gc_max_trim_chunk = 64
  3. 重新启动 Ceph 对象网关,以允许更改的设置生效。
  4. 在 GC 活动期间监控存储集群,以验证增加的值不会影响性能。
重要

切勿修改正在运行的集群中的 rgw_gc_max_objs 选项的值。您应该仅在部署 RGW 节点前更改此值。

3.14.3. 查看收集的对象垃圾回收数

您可以使用性能转储中的 gc_retire_object 参数,查看 Ceph 对象网关启动的对象数量。

可监控这个计数器,以确定该 Ceph 对象网关的特定时间段内对象数量之间的 delta,例如,每周、每天或每小时收集的对象数平均数量。这可用于确定每个 Ceph 对象网关的垃圾收集进度。

套接字文件位于 /var/run/ceph 目录中。

先决条件

  • 安装了 Ceph 对象网关运行的 Red Hat Ceph Storage 集群。
  • 对存储集群中所有节点的根级别访问权限。
  • Ceph 监控器上安装的 ceph-common 软件包。

流程

  • 使用 gc_retire_object 计数器的 grep 访问性能计数器数据:

    语法

    ceph --admin-daemon PATH_TO_SOCKET_FILE perf dump | grep gc_retire_object

    示例

    [root@mon ~]# ceph --admin-daemon /var/run/ceph/ceph-client.rgw.f27-h25-000-6048r.rgw0.104.93991732704816.asok perf dump | grep gc_retire_object

其它资源

3.15. 优化 Ceph 对象网关的数据对象存储

bucket 生命周期配置可优化数据存储以提高效率,在整个数据生命周期提供有效的存储。

Ceph 对象网关中的 S3 API 目前支持 AWS bucket 生命周期配置操作的子集:

  • 过期
  • NoncurrentVersionExpiration
  • AbortIncompleteMultipartUpload

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 对存储集群中所有节点的根级别访问权限。

3.15.1. bucket 生命周期并行线程处理

Ceph 对象网关现在允许在多个 Ceph 对象网关实例之间并行处理 bucket 生命周期。增加并行运行的线程数量,使 Ceph 对象网关能够更有效地处理大量工作负载。此外,Ceph 对象网关现在使用数字序列进行索引分片枚举,而不使用顺序编号。

3.15.2. 优化存储桶生命周期

Ceph 配置文件中的两个选项会影响存储桶生命周期处理的效率:

  • rgw_lc_max_worker 指定要并行运行的生命周期 worker 线程数量。这可同时处理存储桶和索引分片。这个选项的默认值为 3。
  • rgw_lc_max_wp_worker 指定每个生命周期 worker 线程工作池中的线程数量。此选项有助于加快每个存储桶的处理。这个选项的默认值为 3。

例如,对于 bucket 数量较多的工作负载,Thoterment 增加了 rgw_lc_max_worker 选项的值

对于 bucket 数量较少但每个 bucket 中数量较多的工作负载,比如在成百上百上千 >-Asconsider 中增加了 rgw_lc_max_wp_worker 选项的值

注意

在增加其中一个选项的值之前,请验证当前存储集群性能和 Ceph 对象网关的利用率。红帽不建议为其中一个选项分配 10 或以上值。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 对存储集群中所有节点的根级别访问权限。

流程

  1. 打开 /etc/ceph/ceph.conf 进行编辑。
  2. 要增加并行运行的线程数量,请将 rgw_lc_max_worker 的值设置为 3 到 9 之间的值:

    语法

    rgw_lc_max_worker = VALUE

    示例

    rgw_lc_max_worker = 7

  3. 要增加每个线程工作池中的线程数量,请将 rgw_lc_max_wp_worker 的值设置为 3 到 9 之间的值:

    语法

    rgw_lc_max_wp_worker = VALUE

    示例

    rgw_lc_max_wp_worker = 7

  4. 重新启动 Ceph 对象网关,以允许更改的设置生效。
  5. 监控存储集群,以验证增加的值不会影响性能。

其它资源

3.15.3. 其它资源

3.16. Ceph 对象网关和多因素身份验证

作为存储管理员,您可以管理 Ceph 对象网关用户的一次性密码(TOTP)令牌。

3.16.1. 多因素身份验证

当为对象版本控制配置存储桶时,您可以选择将存储桶配置为需要多因素身份验证(MFA)来删除请求。使用 MFA 时,基于时间的一次性密码(TOTP)令牌作为密钥传递给 x-amz-mfa 标头。令牌生成有虚拟 MFA 设备(如 Google Authenticator)或硬件 MFA 设备,如 Gemalto 提供的硬件 MFA 设备。

User adosgw-admin,为用户分配基于时间的一次性密码令牌。您必须设置一个 secret seed 和一个串行 ID。您还可以 user adosgw-admin 列出、删除和重新同步令牌。

重要

在多站点环境中,建议将不同的令牌用于不同的区域,因为虽然 MFA ID 在用户的元数据上设置,但实际 MFA 一次密码配置会驻留在本地区域的 OSD 上。

表 3.1. 术语

术语Description

TOTP

基于时间的一次性密码.

令牌串行

代表 TOTP 令牌 ID 的字符串。

令牌 seed

用于计算 TOTP 的 secret。它可以是十六进制或 base32。

TOTP 秒

用于 TOTP 生成的时间解析。

TOTP 窗口

验证令牌时在当前令牌前后检查的 TOTP 令牌数量。

TOTP pin

TOTP 令牌在特定时间的有效值。

3.16.2. 创建用于多因素验证的 seed

要设置多因素身份验证(MFA),您必须创建一个看到的 secret,供一次性密码生成器和后端 MFA 系统使用。

先决条件

  • Linux 系统。
  • 访问命令行 shell.

流程

  1. 从 The urandom Linux 设备文件中生成 30 个字符,并将其存储在 shell 变量 SEED 中:

    示例

    [user@host ~]$ SEED=$(head -10 /dev/urandom | sha512sum | cut -b 1-30)

  2. 通过在 SEED 变量中运行 echo 来打印 seed:

    示例

    [user@host ~]$ echo $SEED
    492dedb20cf51d1405ef6a1316017e

    将一次性密码生成器和后端 MFA 系统配置为使用相同的 seed。

其它资源

3.16.3. 创建新的多因素身份验证 TOTP 令牌

创建一个新的多因素身份验证(MFA)时间密码(TOTP)令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 生成了用于一次性密码生成器和 Ceph 对象网关 MFA 的 secret。

流程

  1. 创建新的 MFA TOTP 令牌:

    语法

    radosgw-admin mfa create --uid=USERID --totp-serial=SERIAL --totp-seed=SEED --totp-seed-type=SEED_TYPE --totp-seconds=TOTP_SECONDS --totp-window=TOTP_WINDOW

    USERID 设置为用户名以设置 MFA on,将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串,并将 SEED 设置为用于计算 TOTP 的十六进制或 base32 值。以下设置是可选的:将 SEED_TYPE 设置为 hexbase32,将 TOTP_SECONDS 设置为超时,或者将 TOTP_WINDOW 设置为验证令牌时要检查的 TOTP 令牌数量。

    示例

    [root@mon ~]# radosgw-admin mfa create --uid=johndoe --totp-serial=MFAtest --totp-seed=492dedb20cf51d1405ef6a1316017e

其它资源

3.16.4. 测试多因素身份验证 TOTP 令牌

测试基于多因素身份验证(MFA)时间的一次性密码(TOTP)令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 使用 radosgw-admin mfa create 创建 MFA TOTP 令牌。

流程

  1. 测试 TOTP 令牌 PIN 以验证 TOTP 是否正常工作:

    语法

    radosgw-admin mfa check --uid=USERID --totp-serial=SERIAL --totp-pin=PIN

    USERID 设置为用户名称 MFA is is on,将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串,然后将 PIN 设置为一次性密码生成器中的最新 PIN。

    示例

    [root@mon ~] # radosgw-admin mfa check  --uid=johndoe --totp-serial=MFAtest --totp-pin=870305
    ok

    如果您是第一次测试 PIN,则可能会失败。如果失败,请重新同步令牌。请参阅《 红帽 Ceph 存储对象网关配置和管理指南 》中的 重新同步多因素身份验证令牌

其它资源

3.16.5. 重新同步多因素身份验证 TOTP 令牌

重新同步多因素验证(MFA)基于时间的一次性密码令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 使用 radosgw-admin mfa create 创建 MFA TOTP 令牌。

流程

  1. 在时间偏移或检查失败时,重新同步多因素验证 TOTP 令牌。

    这需要连续两个 pin:前一个 pin 和当前的 pin。

    语法

    radosgw-admin mfa resync --uid=USERID --totp-serial=SERIAL --totp-pin=PREVIOUS_PIN --totp=pin=CURRENT_PIN

    USERID 设置为用户名称 MFA is is on,将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串,将 PREVIOUS_PIN 设置为用户的先前 PIN,并将 CURRENT_PIN 设置为用户的当前 PIN。

    示例

    radosgw-admin mfa resync --uid=johndoe --totp-serial=MFAtest --totp-pin=802017 --totp-pin=439996

  2. 通过测试新 PIN 验证令牌是否已重新同步:

    语法

    radosgw-admin mfa check --uid=USERID --totp-serial=SERIAL --totp-pin=PIN

    USERID 设置为用户名称 MFA is is on,将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串,并将 PIN 设置为用户的 PIN。

    示例

    [root@mon ~]# radosgw-admin mfa check  --uid=johndoe --totp-serial=MFAtest --totp-pin=870305
    ok

其它资源

3.16.6. 列出多因素身份验证 TOTP 令牌

列出特定用户拥有的所有基于多因素身份验证(MFA)时间的一次性密码(TOTP)令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 使用 radosgw-admin mfa create 创建 MFA TOTP 令牌。

流程

  1. 列出 MFA TOTP 令牌:

    语法

    radosgw-admin mfa list --uid=USERID

    USERID 设置为用户名称 MFA is set on。

    示例

    [root@mon ~]# radosgw-admin mfa list --uid=johndoe
    {
        "entries": [
            {
                "type": 2,
                "id": "MFAtest",
                "seed": "492dedb20cf51d1405ef6a1316017e",
                "seed_type": "hex",
                "time_ofs": 0,
                "step_size": 30,
                "window": 2
            }
        ]
    }

其它资源

3.16.7. 显示多因素身份验证 TOTP 令牌

通过指定串行,显示基于特定多因素验证(MFA)时间的一次性密码(TOTP)令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 使用 radosgw-admin mfa create 创建 MFA TOTP 令牌。

流程

  1. 显示 MFA TOTP 令牌:

    语法

    radosgw-admin mfa get --uid=USERID --totp-serial=SERIAL

    在 上将 USERID 设置为用户名 MFA,并将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串。

其它资源

3.16.8. 删除多因素身份验证 TOTP 令牌

删除基于多因素身份验证(MFA)时间的一次性密码(TOTP)令牌。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 已安装 Ceph 对象网关。
  • 在 Ceph 监控节点上具有 root 访问权限。
  • 使用 radosgw-admin mfa create 创建 MFA TOTP 令牌。

流程

  1. 删除 MFA TOTP 令牌:

    语法

    radosgw-admin mfa remove --uid=USERID --totp-serial=SERIAL

    在 上将 USERID 设置为用户名 MFA,并将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串。

    示例

    [root@mon ~]# radosgw-admin mfa remove --uid=johndoe --totp-serial=MFAtest

  2. 验证 MFA TOTP 令牌是否已删除:

    语法

    radosgw-admin mfa get --uid=_USERID_ --totp-serial=_SERIAL_

    在 上将 USERID 设置为用户名 MFA,并将 SERIAL 设置为代表 TOTP 令牌 ID 的字符串。

    示例

    [root@mon ~]# radosgw-admin mfa get --uid=johndoe --totp-serial=MFAtest
    MFA serial id not found

其它资源

3.17. 使用 Ansible 删除 Ceph 对象网关

若要使用 Ansible 移除 Ceph 对象网关,可使用 shrink-rgw.yml playbook。

先决条件

  • Ansible 管理节点.
  • 由 Ansible 部署运行的 Red Hat Ceph Storage 集群。

流程

  1. 更改到 /usr/share/ceph-ansible/ 目录。

    [user@admin ~]$ cd /usr/share/ceph-ansible
  2. 对于 裸机和 容器部署,请运行 shrink-rgw.yml Ansible playbook:

    语法

    ansible-playbook infrastructure-playbooks/shrink-rgw.yml -e rgw_to_kill=HOSTNAME.rgw_INSTANCE_NAME_ -u ANSIBLE_USER_NAME -i hosts

    替换:

    • HOSTNAME,带有 Ceph 对象网关节点的短主机名。每次 playbook 运行时,您只能移除一个 Ceph 对象网关。
    • ANSIBLE_USER_NAME,使用 Ansible 用户的名称

    示例

    [user@admin ceph-ansible]$ ansible-playbook infrastructure-playbooks/shrink-rgw.yml -e rgw_to_kill=node03.rgw0 -u admin -i hosts

  3. 从存储集群中的所有 Ceph 配置文件移除 Ceph 对象网关条目。
  4. 确保 Ceph 对象网关已成功移除:

    [root@mon ~]# ceph -s

其它资源

第 4 章 配置参考

以下设置可以添加到 Ceph 配置文件(通常是 ceph.conf)的 [client. rgw.<instance_name>] 部分下。设置中可以包含默认值。如果不在 Ceph 配置文件中指定每个设置,则会自动设置默认值。

[client.rgw.<instance_name>] 部分下设置的配置变量不会应用到 rgw or radosgw -admin 命令,但未在命令中指定的 instance_name 的情况下,将不适用于 rgw orradosgw-admin 命令。因此,要应用到所有 Ceph 对象网关实例或 all radosgw-admin 命令的变量可以放在 [global][client] 部分中,以避免指定 instance_name

4.1. 常规设置

Name描述类型默认

rgw_data

设置 Ceph 对象网关的数据文件的位置。

字符串

/var/lib/ceph/radosgw/$cluster-$id

rgw_enable_apis

启用指定的 API。

字符串

s3, s3website, swift, swift_auth, admin, sts, iam, pubsub

rgw_cache_enabled

是否启用 Ceph 对象网关缓存。

布尔值

true

rgw_cache_lru_size

Ceph 对象网关缓存中的条目数。

整数

10000

rgw_socket_path

域套接字的套接字路径。FastCgiExternalServer 使用这个套接字。如果不指定套接字路径,Ceph 对象网关将不会作为外部服务器运行。此处指定的路径必须与 rgw.conf 文件中指定的路径相同。

字符串

N/A

rgw_host

Ceph 对象网关实例的主机。可以是 IP 地址或主机名.

字符串

0.0.0.0

rgw_port

实例侦听请求的端口。如果未指定,Ceph 对象网关将运行外部 FastCGI。

字符串

rgw_dns_name

服务域的 DNS 名称。另请参阅 zone group 中的主机名设置

字符串

rgw_script_uri

如果请求中没有设置 SCRIPT_URI 的备用值。

字符串

rgw_request_uri

REQUEST _URI( 如果请求中没有设置)的备用值。

字符串

rgw_print_continue

如果运行 启用 100 继续。

布尔值

true

rgw_remote_addr_param

远程地址参数.例如,如果反向代理正常运行,包含远程地址的 HTTP 字段或 X-Forwarded-For 地址。

字符串

REMOTE_ADDR

rgw_op_thread_timeout

打开线程的超时时间(以秒为单位)。

整数

600

rgw_op_thread_suicide_timeout

Ceph 对象网关进程结束前的时间 超时,以秒为单位。如果设置为 0,则禁用。

整数

0

rgw_thread_pool_size

线程池的大小。

整数

512 个线程.

rgw_num_control_oids

用于不同 rgw 实例之间缓存同步的通知对象数量。

整数

8

rgw_init_timeout

Ceph 对象网关在初始化时放弃之前的秒数。

整数

30

rgw_mime_types_file

MIME 类型的路径和位置。用于 Swift 自动检测对象类型.

字符串

/etc/mime.types

rgw_gc_max_objs

在一个垃圾收集周期内可由垃圾回收处理的最大对象数量。

整数

32

rgw_gc_obj_min_wait

对象移除并通过垃圾回收处理处理前的最短等待时间。

整数

2 * 3600

rgw_gc_processor_max_time

两个连续垃圾回收处理周期开始之间的最长时间。

整数

3600

rgw_gc_processor_period

垃圾回收处理的周期时间。

整数

3600

rgw_s3 success_create_obj_status

create-obj 的替代成功状态响应。

整数

0

rgw_resolve_cname

rgw 是否应该使用请求主机名字段的 DNS CNAME 记录(如果主机名不等于 rgw_dns name)。

布尔值

false

rgw_object_stripe_size

Ceph 对象网关对象分条的大小。

整数

4 << 20

rgw_extended_http_attrs

添加可以在对象上设置的新属性集合。在放置对象时,可以通过 HTTP 标头字段设置这些额外属性。如果设置,这些属性将在对象上执行 GET/HEAD 时返回为 HTTP 字段。

字符串

none.例如:"content_foo, content_bar"

rgw_exit_timeout_secs

在无条件退出之前等待进程的秒数。

整数

120

rgw_get_obj_window_size

单个对象请求的窗口大小,以字节为单位。

整数

16 << 20

rgw_get_obj_max_req_size

发送到 Ceph 存储群集的单个 get 操作的最大请求大小。

整数

4 << 20

rgw_relaxed_s3_bucket_names

为 zone group bucket 启用松散的 S3 存储桶规则。

布尔值

false

rgw_list buckets_max_chunk

列出用户 bucket 时,在单个操作中检索的最大 bucket 数量。

整数

1000

rgw_override_bucket_index_max_shards

bucket 索引对象的分片数量。值 0 表示没有分片。红帽不建议设置太大的值(例如 1000),因为它会增加存储桶列表的成本。

该变量应在 [client] 或 [ global] 部分中设置,以使其自动应用到 radosgw-admin 命令。

整数

0

rgw_curl_wait_timeout_ms

某些 curl 调用的超时时间(毫秒)。

整数

1000

rgw_copy_obj_progress

在长时间复制操作期间启用对象进度输出。

布尔值

true

rgw_copy_obj_progress_every_bytes

复制进度输出之间的最小字节数。

整数

1024 * 1024

rgw_admin_entry

管理请求 URL 的入口点。

字符串

admin

rgw_content_length_compat

启用 FCGI 请求的兼容性,同时设置了 CONTENT_LENGTH AND HTTP_CONTENT_LENGTH。

布尔值

false

rgw_bucket_default_quota_max_objects

每个 bucket 的默认最大对象数量。如果未指定任何其他配额,则在新用户上设置这个值。它对现有用户没有影响。

该变量应在 [client] 或 [ global] 部分中设置,以使其自动应用到 radosgw-admin 命令。

整数

-1

rgw_bucket_quota_ttl

缓存的配额信息的时间(以秒为单位)是可信的。超时后,配额信息将从集群中重新获取。

整数

600

rgw_user_quota_bucket_sync_interval

在与集群同步前,收集存储桶配额信息的时间(以秒为单位)。在这段时间中,其他 RGW 实例不会看到来自此实例的操作的 bucket 配额统计的更改。

整数

180

rgw_user_quota_sync_interval

在同步集群前,会先累计用户配额信息的时间(以秒为单位)。在这段时间中,其他 RGW 实例不会看到此实例的操作中用户配额统计的更改。

整数

3600 * 24

log_meta

一个 zone 参数,用于决定网关是否记录元数据操作。

布尔值

false

log_data

一个 zone 参数,用于决定网关是否记录数据操作。

布尔值

false

sync_from_all

用于设置或取消设置所有 zonegroup 对等区同步的 radosgw-admin 命令。

布尔值

false

4.2. 关于池

Ceph zone 映射到一系列 Ceph 存储群集池。

手动创建池与.生成池

如果 Ceph 对象网关的用户密钥包含写入功能,则网关能够自动创建池。这对入门来说非常方便。但是,Ceph 对象存储群集使用 PG 默认值,除非已在 Ceph 配置文件中进行了设置。此外,Ceph 将使用默认的 CRUSH 层次结构。这些设置 不是 生产系统的理想选择。

要设置生产系统,请参阅红帽 Ceph 存储 4 的 Ceph 对象网关生产 指南。有关存储策略,请参阅 Ceph Object Gateway for Production 指南中的开发 存储策略 一节。

Ceph 对象网关默认区的池包括:

  • .rgw.root
  • .default.rgw.control
  • .default.rgw.meta
  • .default.rgw.log
  • .default.rgw.buckets.index
  • .default.rgw.buckets.data
  • .default.rgw.buckets.non-ec

Ceph 对象网关基于每个区域创建池。如果手动创建池,请预先填充区域名称。系统池存储与系统控制、日志记录、用户信息等相关的对象。按照惯例,这些池名称的前置为池名称的区域名称。

  • .<zone-name>.rgw.control :控制池。
  • .<zone-name>.log :日志池包含所有存储桶/容器的日志,以及创建、读取、更新和删除对象操作的日志。
  • .<zone-name>.rgw.buckets.index :此池存储 buckes 的索引。
  • .<zone-name>.rgw.buckets.data :此池存储存储桶的数据。
  • .<zone-name>.rgw.meta :元数据池存储 user_keys 和其他关键元数据。
  • .<zone-name>.meta:users.uid :用户 ID 池包含唯一用户 ID 的映射。
  • .<zone-name>.meta:users.keys :密钥池包含每个用户 ID 的访问密钥和 secret 密钥。
  • .<zone-name>.meta:users.email :电子邮件池包含与用户 ID 关联的电子邮件地址。
  • .<zone-name>.meta:users.swift :Swift 池包含用户 ID 的 Swift 子用户信息。

Ceph 对象网关存储放置池中 bucket 索引(index_pool)和 bucket 数据(data_pool)的数据。它们可能会重叠;即,您可以对索引和数据使用相同的池。默认放置的索引池是 {zone-name}.rgw.buckets.index,默认放置的数据池是 {zone-name}.rgw.buckets

Name描述类型默认

rgw_zonegroup_root_pool

用于存储所有 zone group 特定信息的池。

字符串

.rgw.root

rgw_zone_root_pool

用于存储特定区域信息的池。

字符串

.rgw.root

4.3. 生命周期设置

作为存储管理员,您可以为 Ceph 对象网关设置各种 bucket 生命周期选项。这些选项包含默认值。如果没有指定每个选项,则会自动设置默认值。

若要为这些选项设置特定值,可使用 ceph config set client.rgw OPTION VALUE 命令更新配置数据库。

Name描述类型默认

rgw_lc_debug_interval

对于开发人员,仅通过将过期规则从天缩减间隔来调试生命周期规则(以秒为单位)。红帽建议不要在生产环境中使用这个选项。

整数

-1

rgw_lc_lock_max_time

Ceph 对象网关内部使用的超时值。

整数

90

rgw_lc_max_objs

控制 RADOS 网关内部生命周期工作队列的分片,并且应仅设置为有意重新划分工作流的一部分。红帽建议不要在集群设置后更改此设置,而无需首先联系红帽支持。

整数

32

rgw_lc_max_rules

每个存储桶、生命周期配置文档的一个生命周期规则数量。Amazon Web Service(AWS)限制为 1000 规则。

整数

1000

rgw_lc_max_worker

并行、处理存储桶和索引分片运行的生命周期 worker 线程数量。红帽不推荐在不联系红帽支持的情况下设置大于 10 的值。

整数

3

rgw_lc_max_wp_worker

每个生命周期 worker 线程可以并行处理的存储桶数量。红帽不推荐在不联系红帽支持的情况下设置大于 10 的值。

整数

3

rgw_lc_thread_delay

可以在多个时间点上注入到分片处理延迟(以毫秒为单位)。默认值为 0。将值设为 100 ms 会降低 RADOS 网关实例的 CPU 使用率,如果观察到饱和,则减少了与最接近生命周期线程的工作负载容量。

整数

0

4.4. Swift 设置

Name描述类型默认

rgw_enforce_swift_acls

强制实施 Swift 访问控制列表(ACL)设置。

布尔值

true

rgw_swift_token_expiration

到期 Swift 令牌的时间(以秒为单位)。

整数

24 * 3600

rgw_swift_url

Ceph 对象网关 Swift API 的 URL。

字符串

rgw_swift_url_prefix

Swift API 的 URL 前缀(例如 http://fqdn.com/swift)。

swift

N/A

rgw_swift_auth_url

用于验证 v1 身份验证令牌的默认 URL(如果不使用内部 Swift auth)。

字符串

rgw_swift_auth_entry

Swift 身份验证 URL 的入口点。

字符串

auth

4.5. 日志记录设置

Name描述类型默认

rgw_log_nonexistent_bucket

启用 Ceph 对象网关,以记录对不存在的 bucket 的请求。

布尔值

false

rgw_log_object_name

对象名称的日志格式。有关格式指定程序的详细信息,请参阅 man page 日期。

Date

%Y-%m-%d-%H-%i-%n

rgw_log_object_name_utc

记录的对象名称是否包含 UTC 时间。如果为 false,它将使用本地时间。

布尔值

false

rgw_usage_max_shards

使用日志记录的最大分片数量。

整数

32

rgw_usage_max_user_shards

用于单个用户使用日志记录的最大分片数量。

整数

1

rgw_enable_ops_log

为每个成功的 Ceph 对象网关操作启用日志记录。

布尔值

false

rgw_enable_usage_log

启用用量日志。

布尔值

false

rgw_ops_log_rados

操作日志是否应写入 Ceph 存储群集后端。

布尔值

true

rgw_ops_log_socket_path

用于编写操作日志的 Unix 域套接字。

字符串

rgw_ops_log_data-backlog

写入 Unix 域套接字的操作日志的最大数据大小。

整数

5 << 20

rgw_usage_log_flush_threshold

在异步清空前,用量日志中脏合并条目的数量。

整数

1024

rgw_usage_log_tick_interval

n 秒刷新待使用日志数据。

整数

30

rgw_intent_log_object_name

有意的日志对象名称的日志格式。有关格式指定程序的详细信息,请参阅 man page 日期。

Date

%Y-%m-%d-%i-%n

rgw_intent_log_object_name_utc

意图日志对象名称是否包含 UTC 时间。如果为 false,它将使用本地时间。

布尔值

false

rgw_data_log_window

数据日志条目窗口(以秒为单位)。

整数

30

rgw_data_log_changes_size

要保存的数据更改日志的内存中条目数量。

整数

1000

rgw_data_log_num_shards

要保留数据更改日志的分片(对象)的数量。

整数

128

rgw_data_log_obj_prefix

数据日志的对象名称前缀。

字符串

data_log

rgw_replica_log_obj_prefix

副本日志的对象名称前缀。

字符串

replica log

rgw_md_log_max_shards

元数据日志的最大分片数量。

整数

64

4.6. Keystone 设置

Name描述类型默认

rgw_keystone_url

Keystone 服务器的 URL。

字符串

rgw_keystone_admin_token

Keystone admin 令牌(共享机密)。

字符串

rgw_keystone_accepted_roles

角色需要服务请求。

字符串

成员,管理员

rgw_keystone_token_cache_size

每个 Keystone 令牌缓存中条目的最大数量。

整数

10000

rgw_keystone_revocation_interval

令牌撤销检查间隔秒数。

整数

15 * 60

4.7. LDAP 设置

Name描述类型示例

rgw_ldap_uri

以 URI 格式的以空格分隔的 LDAP 服务器列表。

字符串

ldaps://<ldap.your.domain>

rgw_ldap_searchdn

LDAP 搜索域名,也称为基域。

字符串

cn=users,cn=accounts,dc=example,dc=com

rgw_ldap_binddn

网关将与此 LDAP 条目绑定(用户匹配)。

字符串

uid=admin,cn=users,dc=example,dc=com

rgw_ldap_secret

包含 rgw_ldap_binddn凭证的文件

字符串

/etc/openldap/secret

rgw_ldap_dnattr

包含 Ceph 对象网关用户名的 LDAP 属性(以构成 binddns)。

字符串

uid

第 5 章 多站点

单个区域配置通常由一个 zone group 和一个或多个 ceph-radosgw 实例组成,您可以在实例之间负载平衡网关客户端请求。在单一区域配置中,通常多个网关实例指向单个 Ceph 存储集群。但是,红帽支持几个用于 Ceph 对象网关的多站点配置选项:

  • 多 zone: 更高级的配置包含一个 zone group 和多个 zone,每个 zone 都有一个或多个 ceph-radosgw 实例。每个 zone 都由自己的 Ceph 存储群集支持。一个 zone group 中的多个 zone 为 zone group 提供灾难恢复,如果其中一个 zone 发生重大故障。每个区域都处于活动状态,可能会收到写操作。除了灾难恢复之外,多个活动区也可以充当内容交付网络的基础。要配置多个区域而无需复制,请参阅 第 5.12 节 “在不使用复制的情况下配置多个区域”
  • multi-zone-group: 称为"regions",Ceph 对象网关还可以支持多个 zone group,每个 zone group 含有一个或多个 zone。存储在同一域中的 zone group 的对象共享全局命名空间,确保 zone group 和 zone 之间唯一对象 ID。
  • 多域: Ceph 对象网关支持 realm 的概念,可以是单一 zone group 或多个 zone group,并且是该域的全局唯一命名空间。多个域提供支持大量配置和命名空间的功能。
网关域

5.1. 要求和假设

多站点配置要求至少两个 Ceph 存储集群,至少需要两个 Ceph 对象网关实例,每个 Ceph 存储集群一个。

本指南假定地理上至少有两个 Ceph 存储群集,但配置可以在同一物理站点工作。本指南还假设四台 Ceph 对象网关服务器分别名为 rgw1rgw2rgw3rgw4

多站点配置需要 master zone group 和 master zone。另外,每个 zone group 都需要一个 master zone。zone group 可能具有一个或多个次要或非主控机区域。

重要

域的 master zone group 中的 master zone 负责存储域元数据的主副本,包括用户、配额和 bucket(由 radosgw-admin CLI 创建)。此元数据会自动同步到 second zone 和 second zone group。使用 theradosgw-admin CLI MUST 在 master zone group 的 master zone 的主机上执行的元数据操作,以确保它们同步到 second zone group 和 zone。目前,可以对 second zone 和 zone group 执行 元数据操作,但不建议这样做,因为它们 WILL 未同步,从而导致元数据碎片。

在以下示例中,rgw 1 主机将充当 master zone group 的 master zone;rg w2 主机将充当 master zone group 的 second zone;rg w3 主机将充当 second zone group 的 master zone;rg w4 主机将充当 second zone group 的 second zone。

5.2. 池

红帽建议使用 Ceph 放置组的每个池计算要创建 的池的适当 PG 数量。在 Ceph 配置文件中将计算的值设置为默认值。例如:

osd pool default pg num = 50
osd pool default pgp num = 50
注意

对存储群集上的 Ceph 配置文件进行此更改;然后,对配置进行运行时更改,以便在网关实例创建池时使用该默认值。

或者,也可手动创建池。有关创建 的详细信息,请参阅 存储策略 指南中的池章节。

特定于区域的池名称遵循命名约定 {zone-name}.pool-name。例如,名为 us-east 的区域将具有以下池:

  • .rgw.root
  • us-east.rgw.control
  • us-east.rgw.meta
  • us-east.rgw.log
  • us-east.rgw.buckets.index
  • us-east.rgw.buckets.data
  • us-east.rgw.buckets.non-ec
  • us-east.rgw.meta:users.keys
  • us-east.rgw.meta:users.email
  • us-east.rgw.meta:users.swift
  • us-east.rgw.meta:users.uid

5.3. 安装对象网关

若要安装 Ceph 对象网关,请参见《 红帽 Ceph 存储安装指南》 以了解详细信息。

所有 Ceph 对象网关节点都必须遵循 安装红帽 Ceph 存储要求 一节中列出的任务。

Ansible 可以安装和配置 Ceph 对象网关,以用于 Ceph 存储集群。对于多站点和多站点组部署,您应该具有每个区域的 Ansible 配置。

如果使用 Ansible 安装 Ceph 对象网关,Ansible playbook 将为您处理初始配置。要使用 Ansible 安装 Ceph 对象网关,请将您的主机添加到 /etc/ansible/hosts 文件中。在 [rgws] 部分下添加 Ceph 对象网关主机,以将其角色标识到 Ansible。如果您的主机有顺序命名,您可以使用范围。例如:

[rgws]
<rgw-host-name-1>
<rgw-host-name-2>
<rgw-host-name[3..10]>

添加主机后,您可以重新运行 Ansible playbook。

注意

Ansible 将确保您的网关正在运行,因此可能需要手动删除默认区域和池。本指南提供这些步骤。

当使用异步更新更新现有多站点集群时,请按照安装说明进行更新。然后,重新启动网关实例。

注意

在重启实例时不需要按照一定顺序进行。红帽建议先重启 master zone group 和 master zone,然后重启 second zone group 和 second zone。

5.4. 建立多站点域

群集中的所有网关都具有配置。在多站点域中,这些网关可能驻留在不同的 zone group 和 zone 中。然而,它们必须在此领域中协同工作。在多站点域中,所有网关实例 MUST 从 master zone group 和 master zone 中主机上的 ceph-radosgw 守护进程检索其配置。

因此,创建多站点集群的第一步是建立 realm、master zone group 和 master zone。要在多站点配置中配置网关,可选择一个 ceph-radosgw 实例,它将存放 realm 配置、master zone group 和 master zone。

5.4.1. 创建 Realm

realm 包含 zone group 和 zone 的多站点配置,也服务于在该域中强制实施全局唯一的命名空间。

通过在 master zone group 和 zone 中标识服务的主机上打开命令行界面,为多站点配置创建一个新域。然后执行以下操作:

[root@master-zone]# radosgw-admin realm create --rgw-realm={realm-name} [--default]

例如:

[root@master-zone]# radosgw-admin realm create --rgw-realm=movies --default

如果集群有一个域,请指定 --default 标志。如果指定了 --defaultradosgw-admin 将默认使用此域。如果没有指定 --default,添加 zone-groups 和区域需要指定 --rgw-realm 标志或 --realm -id 标志,以便在添加 zone group 和 zone 时标识域。

在创建了 realm 后,radosgw-admin 将回显 realm 配置。例如:

{
    "id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62",
    "name": "movies",
    "current_period": "1950b710-3e63-4c41-a19e-46a715000980",
    "epoch": 1
}
注意

Ceph 为 realm 生成唯一 ID,允许在需要时重命名域。

5.4.2. 创建主区组

realm 必须至少有一个 zone group,它将充当该域的 master zone group。

通过在 master zone group 和 zone 中服务的主机中打开命令行界面,为多站点配置创建一个新的 master zone group。然后执行以下操作:

[root@master-zone]# radosgw-admin zonegroup create --rgw-zonegroup={name} --endpoints={url} [--rgw-realm={realm-name}|--realm-id={realm-id}] --master --default

例如:

[root@master-zone]# radosgw-admin zonegroup create --rgw-zonegroup=us --endpoints=http://rgw1:80 --rgw-realm=movies --master --default

如果 realm 只有一个 zone group,请指定 --default 标志。如果指定了 --default则在添加新区域时,radosgw-admin 将默认使用此 zone group。如果没有指定 --default,添加区域将要求 --rgw-zonegroup 标志或 --zonegroup-id 标志在添加或修改区域时识别 zone group。

创建 master zone group 后,radosgw-admin 将回显 zone group 配置。例如:

{
    "id": "f1a233f5-c354-4107-b36c-df66126475a6",
    "name": "us",
    "api_name": "us",
    "is_master": "true",
    "endpoints": [
        "http:\/\/rgw1:80"
    ],
    "hostnames": [],
    "hostnames_s3webzone": [],
    "master_zone": "",
    "zones": [],
    "placement_targets": [],
    "default_placement": "",
    "realm_id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62"
}

5.4.3. 创建主区域

重要

必须在位于 区域内的 Ceph 对象网关节点上创建区域。

通过在 master zone group 和 zone 中标识的主机上打开命令行界面,为多站点配置创建一个 master zone。然后执行以下操作:

[root@master-zone]# radosgw-admin zone create
                            --rgw-zonegroup={zone-group-name} \
                            --rgw-zone={zone-name} \
                            --master --default \
                            --endpoints={http://fqdn:port}[,{http://fqdn:port}]

例如:

[root@master-zone]# radosgw-admin zone create --rgw-zonegroup=us \
                            --rgw-zone=us-east \
                            --master --default \
                            --endpoints={http://fqdn:port}[,{http://fqdn:port}]
注意

未指定 --access-key--secret。下一节中创建用户后,这些设置将添加到区域。

5.4.4. 删除 Default Zone Group 和 Zone

删除 默认 区域(如果存在)。确保首先将其从 default zone group 中删除。

重要

以下步骤假设使用新安装的系统(尚未存储数据)进行多站点配置。如果您已经 使用默认 zonegroup、zone 及其池来存储数据,则不要删除它,或者数据将被删除并不可恢复。

要访问默认区域和 zonegroup 中的旧数据,请在 radosgw-admin 命令中使用 --rgw-zone default --rgw-zonegroup default

  1. 删除 zonegroup 和 zone:

    示例

    [root@master-zone]# radosgw-admin zonegroup remove --rgw-zonegroup=default --rgw-zone=default
    [root@master-zone]# radosgw-admin zone delete --rgw-zone=default
    [root@master-zone]# radosgw-admin zonegroup delete --rgw-zonegroup=default

  2. 如果集群处于多站点配置中,请更新并提交周期:

    示例

    [root@master-zone]# radosgw-admin period update --commit

  3. 删除 Ceph 存储集群 中的默认 池(如果存在)。

    示例

    [root@master-zone]# ceph osd pool delete default.rgw.control default.rgw.control --yes-i-really-really-mean-it
    [root@master-zone]# ceph osd pool delete default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
    [root@master-zone]# ceph osd pool delete default.rgw.log default.rgw.log --yes-i-really-really-mean-it
    [root@master-zone]# ceph osd pool delete default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it

    重要

    删除池后,重新启动 Ceph 对象网关流程。

5.4.5. 创建系统用户

ceph-radosgw 守护进程必须在拉取域和句点信息之前进行身份验证。在 master 区域中,创建一个系统用户来帮助在后台程序之间进行身份验证。

[root@master-zone]# radosgw-admin user create --uid="{user-name}" --display-name="{Display Name}" --system

例如:

[root@master-zone]# radosgw-admin user create --uid="synchronization-user" --display-name="Synchronization User" --system

记录 access_keysecret_key,因为次要区域将需要它们与 master 区域进行身份验证。

最后,将系统用户添加到 master 区域。

[root@master-zone]# radosgw-admin zone modify --rgw-zone=us-east --access-key={access-key} --secret={secret}
[root@master-zone]# radosgw-admin period update --commit

5.4.6. 更新 Period

在更新 master zone 配置后,更新 period。

# radosgw-admin period update --commit
注意

更新 period 将更改 epoch,并确保其他区域接收更新的配置。

5.4.7. 更新 Ceph 配置文件

通过添加 rgw_zone 配置选项和 master zone 的名称到实例条目,更新 master zone 主机上的 Ceph 配置文件。

[client.rgw.{instance-name}]
...
rgw_zone={zone-name}

例如:

[client.rgw.rgw1.rgw0]
host = rgw1
rgw frontends = "civetweb port=80"
rgw_zone=us-east

5.4.8. 启动网关

在对象网关主机上,启动并启用 Ceph 对象网关服务:

# systemctl start ceph-radosgw@rgw.`hostname -s`.rgw0
# systemctl enable ceph-radosgw@rgw.`hostname -s`.rgw0

如果服务已在运行,重启该服务而不是启动和启用它:

# systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0

5.5. 建立第二个区域

zone group 中的区域复制所有数据,以确保每个 zone 有相同的数据。在创建 second zone 时,在标识为 second zone 服务的主机上执行 ALL of theradosgw-admin zone 操作。

注意

要添加其他区域,请遵循与添加 second zone 相同的步骤。使用不同的区域名称。

重要

您必须在 master zonegroup 的 master zone 中的主机上执行元数据操作,如用户创建和配额。master zone 和 second zone 可以从 RESTful API 接收 bucket 操作,但 second zone 将存储桶操作重定向到 master zone。如果 master zone 停机,则存储桶操作将失败。如果使用 theradosgw-admin CLI 创建存储桶,则必须在 master zone group 的 master zone 中的主机上执行,否则存储桶不会同步到其他 zone group 和 zone。

5.5.1. 拉取 Realm

使用 master zone group 中 master zone 的 URL 路径、访问密钥和机密,将域拉取到主机。若要拉取非默认域,可使用 --rgw-realm 或 --realm- id 配置选项来指定域。

# radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}

如果此 realm 是默认域或唯一的域,请将 realm 设为默认域。

# radosgw-admin realm default --rgw-realm={realm-name}

5.5.2. 拉取 Period

使用 master zone group 中 master zone 的 URL 路径、access key 和 secret,将 period 拉取到主机。若要从非默认域拉取句点,可使用 --rgw-realm 或 --realm- id 配置选项指定域。

# radosgw-admin period pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}
注意

拉取 period 将检索该域的最新版本 zone group 和 zone 配置。

5.5.3. 创建第二个区域

重要

必须在位于 区域内的 Ceph 对象网关节点上创建区域。

通过在标记为为 second zone 的主机上打开命令行界面,为多站点配置创建一个 second zone。指定 zone group ID、新 zone 名称和 zone 的端点。不要 使用 --master 或 --default 标志。所有区域都默认以主动-主动配置运行;即,网关客户端可以将数据写入任何区域,区域会将数据复制到 zone group 中的所有其他 zone。如果 second zone 不接受写操作,请指定 --read-only 标志,以在 master zone 和 second zone 之间创建主动-被动配置。另外,为存储在 master zone group 的 master zone 中的生成的系统用户提供 access _key 和 secret_key。执行以下命令:

语法

[root@second-zone]# radosgw-admin zone create \
                           --rgw-zonegroup={zone-group-name}\
                           --rgw-zone={zone-name} \
                           --access-key={system-key} --secret={secret}\
                           --endpoints=http://{fqdn}:80 \
                           [--read-only]

示例

[root@second-zone]# radosgw-admin zone create
                            --rgw-zonegroup=us \
                            --rgw-zone=us-west \
                            --access-key={system-key} --secret={secret} \
                            --endpoints=http://rgw2:80

重要

以下步骤假设使用新安装的系统(这些系统没有存储数据)进行多站点配置。如果您已在使用默认区域及其池来存储数据,请勿对 默认 区域及其池进行 DELETE,否则数据将会丢失并不可恢复。

删除默认区域(如果需要)。

[root@second-zone]# radosgw-admin zone delete --rgw-zone=default

最后,根据需要删除 Ceph 存储集群中的默认池。

# ceph osd pool delete default.rgw.control default.rgw.control --yes-i-really-really-mean-it
# ceph osd pool delete default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
# ceph osd pool delete default.rgw.log default.rgw.log --yes-i-really-really-mean-it
# ceph osd pool delete default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
重要

删除池后,重新启动 RGW 流程。

5.5.4. 更新 Period

在更新 master zone 配置后,更新 period。

# radosgw-admin period update --commit
注意

更新 period 将更改 epoch,并确保其他区域接收更新的配置。

5.5.5. 更新 Ceph 配置文件

通过将 rgw_zone 配置选项和 second zone 的名称添加到实例条目,更新 second zone 主机上的 Ceph 配置文件。

[client.rgw.{instance-name}]
...
rgw_zone={zone-name}

例如:

[client.rgw.rgw2.rgw0]
host = rgw2
rgw frontends = "civetweb port=80"
rgw_zone=us-west

5.5.6. 启动网关

在对象网关主机上,启动并启用 Ceph 对象网关服务:

# systemctl start ceph-radosgw@rgw.`hostname -s`.rgw0
# systemctl enable ceph-radosgw@rgw.`hostname -s`.rgw0

如果服务已在运行,重启该服务而不是启动和启用它:

# systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0

5.6. 配置存档同步模块(技术预览)

存档同步模块利用 Ceph 对象网关中 S3 对象的版本控制功能来拥有存档区域。archive 区域具有 S3 对象的版本历史记录,只能通过与存档区域关联的网关删除。它捕获所有数据更新和元数据,将它们整合为 S3 对象的版本。

重要

归档同步模块只是一个技术预览功能。技术预览功能不包括在红帽生产服务级别协议(SLA)中,且其功能可能并不完善。因此,红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。如需了解更多详细信息,请参阅红帽技术预览功能的支持范围。

先决条件

  • 正在运行的 Red Hat Ceph Storage 集群。
  • rootsudo 访问权限.
  • 安装 Ceph 对象网关.

流程

  1. 在创建新区时使用归档层配置 归档 同步模块:

语法

radosgw-admin zone create --rgw-zonegroup={ZONE_GROUP_NAME} --rgw-zone={ZONE_NAME} --endpoints={http://fqdn:port}[,{http://fqdn:port] --tier-type=archive

示例

[root@master-zone]# radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east --endpoints={http://fqdn:port}[,{http://fqdn:port}] --tier-type=archive

5.7. 故障切换和灾难恢复

如果 master zone 失败,请切换到 second zone 进行灾难恢复。

  1. 将 second zone 设置为 master 和 default zone。例如:

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default

    默认情况下,Ceph 对象网关在主动-主动配置中运行。如果集群配置为以主动-被动配置运行,则 second zone 是只读区域。删除 --read-only 状态,以允许区域接收写入操作。例如:

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default --read-only=false
  2. 更新 period 以使更改生效。

    # radosgw-admin period update --commit
  3. 重新启动 Ceph 对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0

如果前一个 master zone 恢复,请恢复该操作。

  1. 从恢复的区域中,从当前 master 区域中拉取 realm。

    # radosgw-admin realm pull --url={url-to-master-zone-gateway} \
                                --access-key={access-key} --secret={secret}
  2. 将恢复的区域设为 master 和 default 区域。

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default
  3. 更新 period 以使更改生效。

    # radosgw-admin period update --commit
  4. 在恢复的区域中重启 Ceph 对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0
  5. 如果 second zone 需要是只读配置,请更新 second zone。

    # radosgw-admin zone modify --rgw-zone={zone-name} --read-only
  6. 更新 period 以使更改生效。

    # radosgw-admin period update --commit
  7. 在 second zone 中重新启动 Ceph 对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0

5.8. 将单一站点系统迁移到多站点

要从带有 默认 区组和区的单一站点系统迁移到多站点系统,请使用以下步骤:

  1. 创建 realm。将 <name> 替换为 realm 名称。

    [root@master-zone]# radosgw-admin realm create --rgw-realm=<name> --default
  2. 重命名默认区域和 zonegroup。将 <name> 替换为 zonegroup 或 zone name。

    [root@master-zone]# radosgw-admin zonegroup rename --rgw-zonegroup default --zonegroup-new-name=<name>
    [root@master-zone]# radosgw-admin zone rename --rgw-zone default --zone-new-name us-east-1 --rgw-zonegroup=<name>
  3. 配置 master zonegroup。将 <name> 替换为 realm 或 zonegroup 名称。将 <fqdn> 替换为 zonegroup 中的完全限定域名。

    [root@master-zone]# radosgw-admin zonegroup modify --rgw-realm=<name> --rgw-zonegroup=<name> --endpoints http://<fqdn>:80 --master --default
  4. 配置 master zone。将 <name> 替换为 realm、zonegroup 或 zone name。将 <fqdn> 替换为 zonegroup 中的完全限定域名。

    [root@master-zone]# radosgw-admin zone modify --rgw-realm=<name> --rgw-zonegroup=<name> \
                                --rgw-zone=<name> --endpoints http://<fqdn>:80 \
                                --access-key=<access-key> --secret=<secret-key> \
                                --master --default
  5. 创建系统用户.将 <user-id> 替换为用户名。将 <display-name> 替换为显示名称。它可以包含空格。

    [root@master-zone]# radosgw-admin user create --uid=<user-id> \
                                --display-name="<display-name>" \
                                --access-key=<access-key> --secret=<secret-key> \ --system
  6. 提交更新的配置。

    # radosgw-admin period update --commit
  7. 重新启动 Ceph 对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`.rgw0

完成此步骤后,继续建立第二个 区域,以在 master zone group 中创建 second zone。

5.9. 多站点命令行使用

5.9.1. realm

realm 代表一个全局唯一的命名空间,它由一个或多个 zone group 组成,包含一个或多个 zone,以及包含 bucket 的区域,后者又包含对象。域允许 Ceph 对象网关在同一硬件上支持多个命名空间及其配置。

域中包含句点的概念。每个 period 代表 zone group 和 zone 配置的状态。每次您更改一个 zonegroup 或 zone zone 时,更新 period 并提交。

默认情况下,Ceph 对象网关版本 2 不创建域,以向后兼容版本 1.3 及更早的版本。但是,作为一种最佳实践,红帽建议为新集群创建域。

5.9.1.1. 创建 Realm

若要创建域,可执行 realm create 并指定 realm 名称。如果 realm 是默认值,指定 --default

[root@master-zone]# radosgw-admin realm create --rgw-realm={realm-name} [--default]

例如:

[root@master-zone]# radosgw-admin realm create --rgw-realm=movies --default

通过指定 --default,域将通过 each radosgw-admin 调用隐式调用,除非明确提供了 --rgw-realm 和 realm 名称。

5.9.1.2. 将 Realm 设置为默认值

realm 列表中的一个域应为默认域。可能只有一个默认域。如果只有一个域,但没有在创建时指定为默认域,则使其成为默认域。或者,要更改哪个域是默认域,请执行:

[root@master-zone]# radosgw-admin realm default --rgw-realm=movies
注意

当 realm 为 default 时,命令行假设 --rgw-realm=<realm-name> 作为参数。

5.9.1.3. 删除 Realm

若要删除域,可执行 realm delete 并指定 realm 名称。

[root@master-zone]# radosgw-admin realm delete --rgw-realm={realm-name}

例如:

[root@master-zone]# radosgw-admin realm delete --rgw-realm=movies

5.9.1.4. 获取域

若要获取域,可执行 realm get 并指定 realm 名称。

# radosgw-admin realm get --rgw-realm=<name>

例如:

# radosgw-admin realm get --rgw-realm=movies [> filename.json]

CLI 将回显具有 realm 属性的 JSON 对象。

{
    "id": "0a68d52e-a19c-4e8e-b012-a8f831cb3ebc",
    "name": "movies",
    "current_period": "b0c5bbef-4337-4edd-8184-5aeab2ec413b",
    "epoch": 1
}

使用 > 和输出文件名将 JSON 对象输出到文件中。

5.9.1.5. 设置 Realm

若要设置 realm,可执行 realm 设置,使用输入文件名指定 realm 名称和 --infile=

[root@master-zone]# radosgw-admin realm set --rgw-realm=<name> --infile=<infilename>

例如:

[root@master-zone]# radosgw-admin realm set --rgw-realm=movies --infile=filename.json

5.9.1.6. 列出 Realms

若要列出 realm,可执行 realm list

# radosgw-admin realm list

5.9.1.7. 列出 Realm Periods

若要列出 realm period,可执行 realm list-periods

# radosgw-admin realm list-periods

5.9.1.8. 拉取域

若要将含有 master zone group 和 master zone 的节点的域拉取到包含 second zone group 或 zone 的节点,请在将接收 realm 配置的节点上执行 realm pull

# radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key} --secret={secret}

5.9.1.9. 重命名域

realm 不是该 period 的一部分。因此,仅在本地应用重命名域,且不会通过 realm pull 来拉取。重命名具有多个区域的域时,在每个区域上运行 命令。要重命名域,请执行以下操作:

# radosgw-admin realm rename --rgw-realm=<current-name> --realm-new-name=<new-realm-name>
注意

不要使用 realm set 来更改 name 参数。这仅更改内部名称。指定 --rgw-realm 仍然会使用旧的域名。

5.9.2. zone group

Ceph 对象网关利用 zone group 的概念来支持多站点部署和全局命名空间。zone group 以前称为地区,它定义一个或多个 zone 中一个或多个 Ceph 对象网关实例的地理位置。

配置 zone group 与典型的配置过程不同,因为并非所有设置都最终在 Ceph 配置文件中。您可以列出 zone group、获取 zone group 配置并设置 zone group 配置。

注意

The radosgw-admin zonegroup 操作可以在域内的任何节点上执行,因为更新该周期的步骤会在整个集群中传播更改。但是,radosgw-admin 区域 在区域内的主机上执行 MUST

5.9.2.1. 创建区组

创建 zone group 包括指定 zone group name。创建区假设它将存在于默认域中,除非指定了 --rgw-realm=<realm-name>。如果 zonegroup 是默认 zonegroup,请指定 --default 标志。如果 zonegroup 是 master zonegroup,请指定 --master 标志。例如:

# radosgw-admin zonegroup create --rgw-zonegroup=<name> [--rgw-realm=<name>][--master] [--default]
注意

使用 zonegroup 修改 --rgw-zonegroup=<zonegroup-name> 来修改现有 zone group 的设置。

5.9.2.2. 将区组设为默认值

zonegroups 列表中有一个 zonegroup 应当是 default zonegroup。可能只有一个默认 zonegroup。如果只有一个 zonegroup,并且它没有在创建时指定为默认 zonegroup,则使其成为默认 zonegroup。另外,要更改哪个 zonegroup 是默认 zonegroup,请执行:

# radosgw-admin zonegroup default --rgw-zonegroup=comedy
注意

当 zonegroup 为 default 时,命令行假设 --rgw-zonegroup=<zonegroup-name> 作为参数。

然后,更新周期:

# radosgw-admin period update --commit

5.9.2.3. 在区组中添加一个区

若要向 zonegroup 添加区域,您必须在区域中的 主机上执行 此步骤。要在 zonegroup 中添加区,请执行以下操作:

# radosgw-admin zonegroup add --rgw-zonegroup=<name> --rgw-zone=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.9.2.4. 从区组中删除区

要从 zonegroup 中删除区,请执行以下操作:

# radosgw-admin zonegroup remove --rgw-zonegroup=<name> --rgw-zone=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.9.2.5. 重命名一个区组

要重命名 zonegroup,请执行以下操作:

# radosgw-admin zonegroup rename --rgw-zonegroup=<name> --zonegroup-new-name=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.9.2.6. 删除区组

要删除 zonegroup,请执行以下操作:

# radosgw-admin zonegroup delete --rgw-zonegroup=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.9.2.7. 列出区组

Ceph 集群包含 zone group 的列表。要列出区组,请执行:

# radosgw-admin zonegroup list

The radosgw-admin 返回一个 JSON 格式的 zone group 列表。

{
    "default_info": "90b28698-e7c3-462c-a42d-4aa780d24eda",
    "zonegroups": [
        "us"
    ]
}

5.9.2.8. 获取区组

要查看 zone group 的配置,请执行:

# radosgw-admin zonegroup get [--rgw-zonegroup=<zonegroup>]

zone group 配置类似如下:

{
    "id": "90b28698-e7c3-462c-a42d-4aa780d24eda",
    "name": "us",
    "api_name": "us",
    "is_master": "true",
    "endpoints": [
        "http:\/\/rgw1:80"
    ],
    "hostnames": [],
    "hostnames_s3website": [],
    "master_zone": "9248cab2-afe7-43d8-a661-a40bf316665e",
    "zones": [
        {
            "id": "9248cab2-afe7-43d8-a661-a40bf316665e",
            "name": "us-east",
            "endpoints": [
                "http:\/\/rgw1"
            ],
            "log_meta": "true",
            "log_data": "true",
            "bucket_index_max_shards": 11,
            "read_only": "false"
        },
        {
            "id": "d1024e59-7d28-49d1-8222-af101965a939",
            "name": "us-west",
            "endpoints": [
                "http:\/\/rgw2:80"
            ],
            "log_meta": "false",
            "log_data": "true",
            "bucket_index_max_shards": 11,
            "read_only": "false"
        }
    ],
    "placement_targets": [
        {
            "name": "default-placement",
            "tags": []
        }
    ],
    "default_placement": "default-placement",
    "realm_id": "ae031368-8715-4e27-9a99-0c9468852cfe"
}

5.9.2.9. 设置区组

定义 zone group 包括创建 JSON 对象,至少指定所需的设置:

  1. name :zone group 的名称。必需。
  2. api_name :zone group 的 API 名称。可选。
  3. is_master :确定 zone group 是 master zone group。必需。注意: 您只能有一个 master zone group。
  4. endpoint :zone group 中所有端点的列表。例如,您可以使用多个域名来引用同一 zone group。记住转义正斜杠(\/)。您还可以为每个端点指定一个端口(fqdn:port)。可选。
  5. hostnames :zone group 中所有主机名的列表。例如,您可以使用多个域名来引用同一 zone group。可选。rgw dns name 设置将自动包含在此列表中。您应在更改此设置后重新启动网关守护进程。
  6. master_zone : zone group 的 master zone。可选。如果未指定,则使用默认区域。注意: 每个 zone group 中只能有一个 master zone。
  7. zones:zone group 中所有 zone 的列表。每个区域都有一个名称(必需),一个端点列表(可选),以及网关是否记录元数据和数据操作(默认为false)。
  8. placement_targets :放置目标列表(可选)。每个放置目标都包含放置目标的名称(必需)和一个标签列表(可选),以便只有具有标签的用户才能使用放置目标(例如,用户 info 中的 placement_tags 字段)。
  9. default_placement :对象索引和对象数据的默认放置目标。默认设置为 default-placement。您还可以在用户信息中为每个用户设置默认放置位置。

要设置 zone group,创建一个由所需字段组成的 JSON 对象,将对象保存到文件中(如 zonegroup.json);然后执行以下命令:

# radosgw-admin zonegroup set --infile zonegroup.json

其中 zonegroup.json 是您创建的 JSON 文件。

重要

默认 zone group is_master 设置默认为 true。如果您创建新 zone group 并希望使其成为 master zone group,您必须将 default zone group is_master 设置设置为 false,或删除 default zone group。

最后,更新周期:

# radosgw-admin period update --commit

5.9.2.10. 设置区组映射

设置 zone group map 包括创建一个由一个或多个 zone group 组成的 JSON 对象,并为集群设置 master_zonegroup。zone group map 中的每个 zone group 由一个键/值对组成,其中 设置等同于单个 zone group 配置的 name 设置,而 val 则是由单个 zone group 配置组成的 JSON 对象。

您只能有一个 zone group is_master 等于 true,它必须指定为 zone group map 末尾的 master_zonegroup。以下 JSON 对象是默认 zone group map 的示例:

{
    "zonegroups": [
        {
            "key": "90b28698-e7c3-462c-a42d-4aa780d24eda",
            "val": {
                "id": "90b28698-e7c3-462c-a42d-4aa780d24eda",
                "name": "us",
                "api_name": "us",
                "is_master": "true",
                "endpoints": [
                    "http:\/\/rgw1:80"
                ],
                "hostnames": [],
                "hostnames_s3website": [],
                "master_zone": "9248cab2-afe7-43d8-a661-a40bf316665e",
                "zones": [
                    {
                        "id": "9248cab2-afe7-43d8-a661-a40bf316665e",
                        "name": "us-east",
                        "endpoints": [
                            "http:\/\/rgw1"
                        ],
                        "log_meta": "true",
                        "log_data": "true",
                        "bucket_index_max_shards": 11,
                        "read_only": "false"
                    },
                    {
                        "id": "d1024e59-7d28-49d1-8222-af101965a939",
                        "name": "us-west",
                        "endpoints": [
                            "http:\/\/rgw2:80"
                        ],
                        "log_meta": "false",
                        "log_data": "true",
                        "bucket_index_max_shards": 11,
                        "read_only": "false"
                    }
                ],
                "placement_targets": [
                    {
                        "name": "default-placement",
                        "tags": []
                    }
                ],
                "default_placement": "default-placement",
                "realm_id": "ae031368-8715-4e27-9a99-0c9468852cfe"
            }
        }
    ],
    "master_zonegroup": "90b28698-e7c3-462c-a42d-4aa780d24eda",
    "bucket_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    },
    "user_quota": {
        "enabled": false,
        "max_size_kb": -1,
        "max_objects": -1
    }
}

要设置区组映射,请执行以下操作:

# radosgw-admin zonegroup-map set --infile zonegroupmap.json

其中 zonegroupmap.json 是您创建的 JSON 文件。确保为 zone group map 中指定的区域创建了区域。最后,更新周期。

# radosgw-admin period update --commit

5.9.3. Zones

Ceph 对象网关支持区域的概念。zone 定义由一个或多个 Ceph 对象网关实例组成的逻辑组。

配置区域与典型配置过程有所不同,因为并非所有设置都最终在 Ceph 配置文件中。您可以列出区、获取区配置和设置区域配置。

重要

All radosgw-admin 区域 在运行 或 区域的主机上执行 MUST

5.9.3.1. 创建区域

要创建区域,请指定区域名称。如果是一个 master 区域,指定 --master 选项。zone group 中只有一个 zone 可以是 master zone。要将区域添加到 zonegroup,请使用 zonegroup 名称指定 --rgw-zonegroup 选项。

重要

必须在位于 区域内的 Ceph 对象网关节点上创建区域。

[root@zone] radosgw-admin zone create --rgw-zone=<name> \
                [--zonegroup=<zonegroup-name]\
                [--endpoints=<endpoint:port>[,<endpoint:port>] \
                [--master] [--default] \
                --access-key $SYSTEM_ACCESS_KEY --secret $SYSTEM_SECRET_KEY

然后,更新周期:

# radosgw-admin period update --commit

5.9.3.2. 删除区

若要删除区域,首先将其从 zonegroup 中删除。

# radosgw-admin zonegroup remove --rgw-zonegroup=<name>\
                                 --rgw-zone=<name>

然后,更新周期:

# radosgw-admin period update --commit

接下来,删除该区域。

重要

此过程必须在 区域内的主机上执行。

执行以下命令:

[root@zone]# radosgw-admin zone delete --rgw-zone<name>

最后,更新周期:

# radosgw-admin period update --commit
重要

不要先从 zone group 中删除区域。否则,更新周期将失败。

如果已删除区域的池不会在其他任何位置使用,请考虑删除池。将以下示例 中的 <del-zone> 替换为已删除区的名称。

重要

当 Ceph 删除 zone 池后,它会以无法恢复的方式删除其中的所有数据。仅当 Ceph 客户端不再需要池内容时,仅删除 zone 池。

重要

在多域集群中,删除 .rgw.root 池以及 zone 池将移除群集的所有域信息。在删除 .rgw.root 池之前,确保. rgw.root 不包含其他活动域。

# ceph osd pool delete <del-zone>.rgw.control <del-zone>.rgw.control --yes-i-really-really-mean-it
# ceph osd pool delete <del-zone>.rgw.data.root <del-zone>.rgw.data.root --yes-i-really-really-mean-it
# ceph osd pool delete <del-zone>.rgw.log <del-zone>.rgw.log --yes-i-really-really-mean-it
# ceph osd pool delete <del-zone>.rgw.users.uid <del-zone>.rgw.users.uid --yes-i-really-really-mean-it
重要

删除池后,重新启动 RGW 流程。

5.9.3.3. 修改区域

若要修改区域,请指定区域名称和您要修改的参数。

重要

应在位于 区域内的 Ceph 对象网关节点上修改区域。

[root@zone]# radosgw-admin zone modify [options]

--access-key=<key> --secret/-secret-key=<key> --master --default --endpoints=<list>

然后,更新周期:

# radosgw-admin period update --commit

5.9.3.4. 列出区域

root 用户身份列出集群中的区域,请执行:

# radosgw-admin zone list

5.9.3.5. 获取区域

root 身份获取区配置,请执行:

# radosgw-admin zone get [--rgw-zone=<zone>]

默认 区类似如下:

{ "domain_root": ".rgw",
  "control_pool": ".rgw.control",
  "gc_pool": ".rgw.gc",
  "log_pool": ".log",
  "intent_log_pool": ".intent-log",
  "usage_log_pool": ".usage",
  "user_keys_pool": ".users",
  "user_email_pool": ".users.email",
  "user_swift_pool": ".users.swift",
  "user_uid_pool": ".users.uid",
  "system_key": { "access_key": "", "secret_key": ""},
  "placement_pools": [
      {  "key": "default-placement",
         "val": { "index_pool": ".rgw.buckets.index",
                  "data_pool": ".rgw.buckets"}
      }
    ]
  }

5.9.3.6. 设置区域

配置区域涉及指定一系列 Ceph 对象网关池。为保持一致性,我们建议使用与区域名称相同的池前缀。有关配置池的详细信息,请参阅 Pools_。

重要

区域应在位于 区域内的 Ceph 对象网关节点上设置。

要设置区,创建一个由池组成的 JSON 对象,将对象保存到文件中(如 zone.json);然后执行以下命令,将 {zone-name} 替换为区名称:

[root@zone]# radosgw-admin zone set --rgw-zone={zone-name} --infile zone.json

其中 zone.json 是您创建的 JSON 文件。

然后,以 root 用户身份更新周期:

# radosgw-admin period update --commit

5.9.3.7. 重命名区域

要重命名区域,请指定区域名称和新区域名称。在区中的主机上执行以下内容:

[root@zone]# radosgw-admin zone rename --rgw-zone=<name> --zone-new-name=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.10. zone group 和 zone 配置设置

在配置默认 zone group 和 zone 时,池名称中包含 zone 名称。例如:

  • default.rgw.control

若要更改默认值,可在 Ceph 配置文件中的每个 [client.rgw.{instance-name}] 实例下包含下列设置。

Name描述类型默认

rgw_zone

网关实例的区域名称。

字符串

rgw_zonegroup

网关实例 zone group 的名称。

字符串

rgw_zonegroup_root_pool

zone group 的根池。

字符串

.rgw.root

rgw_zone_root_pool

区域的根池。

字符串

.rgw.root

rgw_default_zone_group_info_oid

存储默认 zone group 的 OID。我们不建议更改此设置。

字符串

default.zonegroup

5.11. 使用多站点手动 Resharding Bucket

要在多站点集群中手动重新定义存储桶,请使用以下步骤:

注意

手动重新划分过程非常昂贵,特别是对于保证手动重新划分的大型存储桶。每个 second zone 删除所有对象,然后从 master zone 重新同步它们。

先决条件

  • 停止所有 Ceph 对象网关实例。

流程

  1. 在 master zone group 的 master zone 区的一个节点中执行以下命令:

    语法

    # radosgw-admin bucket sync disable --bucket=BUCKET_NAME

    等待 所有区域的同步状态 报告数据 同步为最新版本。

  2. ALL 区域中 停止所有 ceph-radosgw 守护进程。
  3. 在 master zone group 的 master zone 的一个节点上,重新定义存储桶。

    语法

    # radosgw-admin bucket reshard --bucket=BUCKET_NAME --num-shards=NEW_SHARDS_NUMBER

  4. On EACH second zone 执行以下操作:

    语法

    # radosgw-admin bucket rm --purge-objects --bucket=BUCKET_NAME

  5. ALL 区域中 重启所有 ceph-radosgw 守护进程。
  6. 在 master zone group 的 master zone 区的一个节点中执行以下命令:

    语法

    # radosgw-admin bucket sync enable --bucket=BUCKET_NAME

元数据同步过程将获取更新的 bucket 入口点和 bucket 实例元数据。数据同步过程将执行完全同步。

5.12. 在不使用复制的情况下配置多个区域

您可以配置多个不会相互复制的区域。例如,您可以为公司中的每个团队创建一个专用区。

先决条件

  • 安装了 Ceph 对象网关的 Ceph 存储群集。

流程

  1. 创建 realm。

    radosgw-admin realm create --rgw-realm=realm-name [--default]

    例如:

    [root@master-zone]# radosgw-admin realm create --rgw-realm=movies --default
    {
        "id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62",
        "name": "movies",
        "current_period": "1950b710-3e63-4c41-a19e-46a715000980",
        "epoch": 1
    }
  2. 创建 zone group。

    radosgw-admin zonegroup create --rgw-zonegroup=zone-group-name --endpoints=url [--rgw-realm=realm-name|--realm-id=realm-id] --master --default

    例如:

    [root@master-zone]# radosgw-admin zonegroup create --rgw-zonegroup=us --endpoints=http://rgw1:80 --rgw-realm=movies --master --default
    {
        "id": "f1a233f5-c354-4107-b36c-df66126475a6",
        "name": "us",
        "api_name": "us",
        "is_master": "true",
        "endpoints": [
            "http:\/\/rgw1:80"
        ],
        "hostnames": [],
        "hostnames_s3webzone": [],
        "master_zone": "",
        "zones": [],
        "placement_targets": [],
        "default_placement": "",
        "realm_id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62"
    }
  3. 根据您的用例,创建一个或多个区域。

    radosgw-admin zone create
                 --rgw-zonegroup=zone-group-name \
                 --rgw-zone=zone-name \
                 --master --default \
                 --endpoints=http://fqdn:port[,http://fqdn:port]

    例如:

    [root@master-zone]# radosgw-admin zone create --rgw-zonegroup=us \
                                                  --rgw-zone=us-east \
                                                  --master --default \
                                                  --endpoints=http://rgw1:80
  4. 使用 zone group 的配置获取 JSON 文件。

    radosgw-admin zonegroup get --rgw-zonegroup=zone-group-name > zonegroup.json

    例如:

    [root@master-zone]# radosgw-admin zonegroup get --rgw-zonegroup=us > zonegroup.json
  5. 在 文件中,将 log_metalog_datasync_from_all 参数设置为 false

        {
            "id": "72f3a886-4c70-420b-bc39-7687f072997d",
            "name": "default",
            "api_name": "",
            "is_master": "true",
            "endpoints": [],
            "hostnames": [],
            "hostnames_s3website": [],
            "master_zone": "a5e44ecd-7aae-4e39-b743-3a709acb60c5",
            "zones": [
                {
                    "id": "975558e0-44d8-4866-a435-96d3e71041db",
                    "name": "testzone",
                    "endpoints": [],
                    "log_meta": "false",
                    "log_data": "false",
                    "bucket_index_max_shards": 11,
                    "read_only": "false",
                    "tier_type": "",
                    "sync_from_all": "false",
                    "sync_from": []
                },
                {
                    "id": "a5e44ecd-7aae-4e39-b743-3a709acb60c5",
                    "name": "default",
                    "endpoints": [],
                    "log_meta": "false",
                    "log_data": "false",
                    "bucket_index_max_shards": 11,
                    "read_only": "false",
                    "tier_type": "",
                    "sync_from_all": "false",
                    "sync_from": []
                }
            ],
            "placement_targets": [
                {
                    "name": "default-placement",
                    "tags": []
                }
            ],
            "default_placement": "default-placement",
            "realm_id": "2d988e7d-917e-46e7-bb18-79350f6a5155"
        }
  6. 使用更新的 JSON 文件。

    radosgw-admin zonegroup set --rgw-zonegroup=zone-group-name --infile=zonegroup.json

    例如:

    [root@master-zone]# radosgw-admin zonegroup set --rgw-zonegroup=us --infile=zonegroup.json
  7. 更新 period。

    # radosgw-admin period update --commit

5.13. 在同一存储集群中配置多个域

本节讨论如何在同一存储集群中配置多个域。这是用于多站点的更高级用例。在同一存储集群中配置多个域,您可以使用本地域来处理本地 Ceph 对象网关客户端流量,以及用于要复制到次要站点的数据的复制域。

注意

红帽建议每个域具有自己的 Ceph 对象网关。

先决条件

流程

  1. 在存储集群的第一个数据中心上创建一个本地域:

    语法

    radosgw-admin realm create --rgw-realm=REALM_NAME --default

    示例

    [root@rgw1 ~]# radosgw-admin realm create --rgw-realm=ldc1 --default

  2. 在第一个数据中心上创建一个本地 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpoints=http://RGW_NODE_NAME:80 --rgw-realm=REALM_NAME --master --default

    示例

    [root@rgw1 ~]# radosgw-admin zonegroup create --rgw-zonegroup=ldc1zg --endpoints=http://rgw1:80 --rgw-realm=ldc1 --master --default

  3. 在第一个数据中心创建一个本地区:

    语法

    radosgw-admin zone create --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME --master --default --endpoints=HTTP_FQDN[,HTTP_FQDN]

    示例

    [root@rgw1 ~]# radosgw-admin zone create --rgw-zonegroup=ldc1zg --rgw-zone=ldc1z --master --default --endpoints=http://rgw.example.com

  4. 提交周期:

    示例

    [root@rgw1 ~]# radosgw-admin period update --commit

  5. 使用 rgw_realm、rgw_ zonegroup 和 rgw_zone 名称更新 ceph.conf

    语法

    rgw_realm = REALM_NAME
    rgw_zonegroup = ZONE_GROUP_NAME
    rgw_zone = ZONE_NAME

    示例

    rgw_realm = ldc1
    rgw_zonegroup = ldc1zg
    rgw_zone = ldc1z

  6. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  7. 在存储集群中的第二个数据中心上创建一个本地域:

    语法

    radosgw-admin realm create --rgw-realm=REALM_NAME --default

    示例

    [root@rgw2 ~]# radosgw-admin realm create --rgw-realm=ldc2 --default

  8. 在第二个数据中心上创建一个本地 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpoints=http://RGW_NODE_NAME:80 --rgw-realm=REALM_NAME --master --default

    示例

    [root@rgw2 ~]# radosgw-admin zonegroup create --rgw-zonegroup=ldc2zg --endpoints=http://rgw2:80 --rgw-realm=ldc2 --master --default

  9. 在第二个数据中心创建一个本地区:

    语法

    radosgw-admin zone create --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME --master --default --endpoints=HTTP_FQDN[, HTTP_FQDN]

    示例

    [root@rgw2 ~]# radosgw-admin zone create --rgw-zonegroup=ldc2zg --rgw-zone=ldc2z --master --default --endpoints=http://rgw.example.com

  10. 提交周期:

    示例

    [root@rgw2 ~]# radosgw-admin period update --commit

  11. 使用 rgw_realm、rgw_ zonegroup 和 rgw_zone 名称更新 ceph.conf

    语法

    rgw_realm = REALM_NAME
    rgw_zonegroup = ZONE_GROUP_NAME
    rgw_zone = ZONE_NAME

    示例

    rgw_realm = ldc2
    rgw_zonegroup = ldc2zg
    rgw_zone = ldc2z

  12. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  13. 在存储集群的第一个数据中心上创建一个复制的域:

    语法

    radosgw-admin realm create --rgw-realm=REPLICATED_REALM_1 --default

    示例

    [user@rgw1 ~] radosgw-admin realm create --rgw-realm=rdc1 --default

    使用 --default 标志在主站点上进行复制的域默认。

  14. 为第一个数据中心创建一个 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=RGW_ZONE_GROUP --endpoints=http://_RGW_NODE_NAME:80 --rgw-realm=_RGW_REALM_NAME --master --default

    示例

    [root@rgw1 ~]# radosgw-admin zonegroup create --rgw-zonegroup=rdc1zg --endpoints=http://rgw1:80 --rgw-realm=rdc1 --master --default

  15. 在第一个数据中心上创建一个 master zone:

    语法

    radosgw-admin zone create --rgw-zonegroup=RGW_ZONE_GROUP --rgw-zone=_MASTER_RGW_NODE_NAME --master --default --endpoints=HTTP_FQDN[,HTTP_FQDN]

    示例

    [root@rgw1 ~]# radosgw-admin zone create --rgw-zonegroup=rdc1zg --rgw-zone=rdc1z --master --default --endpoints=http://rgw.example.com

  16. 创建复制/同步化用户,并将系统用户添加到 master 区以进行多站点:

    语法

    radosgw-admin user create --uid="r_REPLICATION_SYNCHRONIZATION_USER_" --display-name="Replication-Synchronization User" --system
    radosgw-admin zone modify --rgw-zone=RGW_ZONE --access-key=ACCESS_KEY --secret=SECRET_KEY

    示例

    [root@rgw1 ~]# radosgw-admin zone modify --rgw-zone=rdc1zg --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8

  17. 提交周期:

    语法

    radosgw-admin period update --commit

  18. 使用第一个数据中心的 rgw_realm、rg w_zonegrouprgw_zone 名称更新 ceph.conf

    语法

    rgw_realm = REALM_NAME
    rgw_zonegroup = ZONE_GROUP_NAME
    rgw_zone = ZONE_NAME

    示例

    rgw_realm = rdc1
    rgw_zonegroup = rdc1zg
    rgw_zone = rdc1z

  19. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  20. 在第二个数据中心上拉取复制域:

    语法

    radosgw-admin realm pull --url=https://tower-osd1.cephtips.com --access-key=ACCESS_KEY --secret-key=SECRET_KEY

    示例

    radosgw-admin realm pull --url=https://tower-osd1.cephtips.com --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8

  21. 从第一个数据中心拉取 period:

    语法

    radosgw-admin period pull --url=https://tower-osd1.cephtips.com --access-key=ACCESS_KEY --secret-key=SECRET_KEY

    示例

    radosgw-admin period pull --url=https://tower-osd1.cephtips.com --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8

  22. 在第二个数据中心中创建 second zone:

    语法

    radosgw-admin zone create --rgw-zone=RGW_ZONE --rgw-zonegroup=RGW_ZONE_GROUP --endpoints=https://tower-osd4.cephtips.com --access-key=_ACCESS_KEY --secret-key=SECRET_KEY

    示例

    [root@rgw2 ~]# radosgw-admin zone create --rgw-zone=rdc2z --rgw-zonegroup=rdc1zg --endpoints=https://tower-osd4.cephtips.com --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8

  23. 提交周期:

    语法

    radosgw-admin period update --commit

  24. 使用第二个数据中心的 rgw_realm、rg w_zonegrouprgw_zone 名称更新 ceph.conf

    语法

    rgw_realm = REALM_NAME
    rgw_zonegroup = ZONE_GROUP_NAME
    rgw_zone = ZONE_NAME

    示例

    rgw realm = rdc1
    rgw zonegroup = rdc1zg
    rgw zone = rdc2z

  25. 重启 Ceph 对象网关守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  26. 登录到第二个数据中心并验证 master 域的同步状态:

    语法

    radosgw-admin sync status

    示例

    [root@rgw2 ~]# radosgw-admin sync status
              realm 59762f08-470c-46de-b2b1-d92c50986e67 (ldc2)
          zonegroup 7cf8daf8-d279-4d5c-b73e-c7fd2af65197 (ldc2zg)
               zone 034ae8d3-ae0c-4e35-8760-134782cb4196 (ldc2z)
      metadata sync no sync (zone is master)

  27. 登录到第一个数据中心,并验证 replication-synchronization 域的同步状态:

    语法

    radosgw-admin sync status --rgw-realm RGW_REALM_NAME

    示例

    [root@rgw1 ~]# radosgw-admin sync status --rgw-realm rdc1
              realm 73c7b801-3736-4a89-aaf8-e23c96e6e29d (rdc1)
          zonegroup d67cc9c9-690a-4076-89b8-e8127d868398 (rdc1zg)
               zone 67584789-375b-4d61-8f12-d1cf71998b38 (rdc2z)
      metadata sync syncing
                    full sync: 0/64 shards
                    incremental sync: 64/64 shards
                    metadata is caught up with master
          data sync source: 705ff9b0-68d5-4475-9017-452107cec9a0 (rdc1z)
                            syncing
                            full sync: 0/128 shards
                            incremental sync: 128/128 shards
                            data is caught up with source
              realm 73c7b801-3736-4a89-aaf8-e23c96e6e29d (rdc1)
          zonegroup d67cc9c9-690a-4076-89b8-e8127d868398 (rdc1zg)
               zone 67584789-375b-4d61-8f12-d1cf71998b38 (rdc2z)
      metadata sync syncing
                    full sync: 0/64 shards
                    incremental sync: 64/64 shards
                    metadata is caught up with master
          data sync source: 705ff9b0-68d5-4475-9017-452107cec9a0 (rdc1z)
                            syncing
                            full sync: 0/128 shards
                            incremental sync: 128/128 shards
                            data is caught up with source

  28. 要在本地站点中存储和访问数据,请为本地域创建用户:

    语法

    radosgw-admin user create --uid="LOCAL_USER" --display-name="Local user" --rgw-realm=_REALM_NAME --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME

    示例

    [root@rgw2 ~]# radosgw-admin user create --uid="local-user" --display-name="Local user" --rgw-realm=ldc1 --rgw-zonegroup=ldc1zg --rgw-zone=ldc1z

重要

默认情况下,会在 default 域下创建用户。要使用户访问本地域中数据的用户,radosgw-admin 命令需要 --rgw-realm 参数。