Red Hat Training

A Red Hat training course is available for Red Hat Ceph Storage

Ubuntu 对象网关指南

Red Hat Ceph Storage 3

在 Ubuntu 上安装、配置和管理 Ceph 存储对象网关

摘要

本文档提供有关在 AMD64 和 Intel 64 架构上运行的 Ubuntu 14.04 上安装、配置和管理 Ceph 存储对象网关的说明。

第 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. CivetWeb 前端

默认情况下,Ceph 对象网关利用 CivetWeb Web 服务器通过 HTTP 公开其 RESTful 接口。Civetweb 是可嵌入的 C/C++ 嵌入式 Web 服务器。

2.2. 更改 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 存储 3 的支持方式是使用 ceph-ansible,因此端口 8080 被视为红帽 Ceph 存储 3 文档中的默认端口。

先决条件

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

流程

  1. 在网关节点上,打开 /etc/ceph/ 目录中的 Ceph 配置文件。
  2. 找到类似以下示例的 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 对象网关服务,使新端口设置生效:

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

    $ sudo iptables --list
  6. 如果没有打开端口,请添加端口:

    $ sudo iptables -I INPUT 1 -i iface -p tcp -s IP_address/netmask --dport 80 -j ACCEPT

    ifaceIP_addressnetmask 替换为 Ceph 对象网关节点的相关值。

    示例

    $ sudo iptables -I INPUT 1 -i eth0 -p tcp -s 192.168.122.199/255.255.255.0 --dport 80 -j ACCEPT

  7. 使更改持久,使其在 Ceph 对象网关节点重启时生效:

    $ sudo apt-get install iptables-persistent
  8. 在终端 UI 中,选择 yes 作为提示将当前 IPv4 iptables 规则保存到 /etc/iptables/rules.v4 和当前 IPv6 iptables 规则到 /etc/iptables/rules.v6
  9. 可选: 如果在安装 iptables -persistent 后添加新的 IPv4 iptables 规则,请将它添加到规则文件中。在这种情况下,以 root 用户身份 执行以下命令:

    $ iptables-save > /etc/iptables/rules.v4

其它资源

2.3. 将 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.4. Civetweb 配置选项

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

选项描述默认

access_log_file

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

error_log_file

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

num_threads

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

512

request_timeout_ms

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

30000

重要

如果设置 num_threads,它将覆盖 rgw_thread_pool_size。因此,可以将两者都设置为相同的值,或者仅设置 rgw_thread_pool_size 且不设置 num_threads。默认情况下,ceph -ansible 将两个变量都设为 512

以下是设置了其中一些选项的 /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

2.5. 使用 Beast 前端

Ceph 对象网关将 CivetWeb 和 Beast 嵌入式 HTTP 服务器作为前端提供。Beast 前端使用 Boost.Beast 库进行 HTTP 解析,Beast 前端将 Boost.Asio 库用于异步网络 I/O。由于 CivetWeb 是默认的前端,因此使用 Beast 前端在红帽 Ceph 存储 配置文件中的 rgw_frontends 参数中指定它。

先决条件

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

流程

  1. 修改管理服务器上的 /etc/ceph/ceph.conf 配置文件:

    1. 添加一个标题为 [client.rgw.<gateway-node>] 的部分,将 <gateway-node> 替换为 Ceph 对象网关节点的短节点名称。
    2. 使用 hostname -s 检索主机的短名称。
    3. 例如,如果网关节点名称是 gateway-node1,请在 /etc/ceph/ceph.conf 文件的 [global] 部分后添加如下部分:

      [client.rgw.gateway-node1]
      rgw frontends = beast endpoint=192.168.0.100:80
  2. 将更新的配置文件复制到 Ceph 对象网关节点和其他 Ceph 节点。

    # scp /etc/ceph/ceph.conf <ceph-node>:/etc/ceph
  3. 重启 Ceph 对象网关以启用 Beast 前端:

    # systemctl restart ceph-radosgw.target
  4. 确保节点的防火墙上已打开配置的端口。如果未打开,请添加端口并重新加载防火墙配置。例如,在 Ceph 对象网关节点上执行:

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

其它资源

2.6. Past 配置选项

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

选项描述默认

endpointssl_endpoint

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

ssl_certificate

用于启用 SSL 端点的 SSL 证书文件路径。

ssl_private_key

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

使用 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>

其它资源

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]
...
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 rgw = 20
debug civetweb = 20

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

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

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

有关日志记录和调试的一般详情,请参阅《红帽 Ceph 存储 3 配置指南》 中的日志配置 参考 一章。有关特定于 Ceph 对象网关的日志记录的详细信息,请参阅本指南的日志 配置参考 一章中的 Ceph 对象网关 章节。

2.9. S3 API Server-side Encryption

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

注意

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

重要

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

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

客户提供的密钥

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

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

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

密钥管理服务

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

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

重要

目前,唯一经过测试的密钥管理实施使用 OpenStack Barbican。但是,尚未全面支持使用 OpenStack Barbican。在生产中使用它的唯一方法是获得支持例外。有关更多信息,请联系 技术支持

2.10. 测试网关

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

2.10.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.10.2. 创建 Swift 用户

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

注意

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

先决条件

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

流程

  1. 创建 Swift 用户:

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

    使用 Swift 用户名替换 name 例如:

    [root@master-zone]# 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@master-zone]# 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.10.3. 测试 S3 访问

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

执行以下步骤:

  1. 启用 common 存储库。

    # subscription-manager repos --enable=rhel-7-server-rh-common-rpms
  2. 安装 python-boto 软件包。

    sudo yum install python-boto
  3. 创建 Python 脚本:

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

    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,
    )
    1. <zone> 替换为您配置网关服务的主机的区域名称。也就是说,网关主机。确保 主机 设置通过 DNS 解析。将 <port> 替换为网关的端口号。
    2. $access$secret 替换为 Create an S3 User 部分中的 access _key 和 secret_key 值。
  5. 运行脚本:

    python s3test.py

    输出结果类似如下:

    my-new-bucket 2015-02-16T17:09:10.000Z

2.10.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.11. 配置 HAProxy/keepalived

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

HAProxy 和 keepalived 的另一个用例是在 HAProxy 服务器上终止 HTTPS。红帽 Ceph 存储(RHCS)1.3.x 使用 Civetweb,而 RHCS 1.3.x 中的实施不支持 HTTPS。您可以使用 HAProxy 服务器在 HAProxy 服务器上终止 HTTPS,并在 HAProxy 服务器和 Civetweb 网关实例之间使用 HTTP。

2.11.1. HAProxy/keepalived 先决条件

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

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

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

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

2.11.2. 准备 HAProxy 节点

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

  1. 安装 RHEL 7.x.
  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

2.11.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.11.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 *: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.11.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.12. 为静态 Web 托管配置网关

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

2.12.1. 静态 Web 托管假设

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

注意

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

2.12.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.12.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.12.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.12.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.13. 将命名空间导出到 NFS-Ganesha

在 Red Hat Ceph Storage 3 中,Ceph 对象网关通过将 NFS 版本 3 和 NFS 版本 4.1 用于生产系统来导出 S3 对象命名空间。

注意

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

其实施符合 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. 确保 rpcbind 服务正在运行:

    # systemctl start rpcbind
    注意

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

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

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

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

配置 NFS-Ganesha 实例

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

    $ sudo apt-get 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
  • .rgw.control
  • .rgw.gc
  • .log
  • .intent-log
  • .usage
  • .users
  • .users.email
  • .users.swift
  • .users.uid

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

另请参阅 每个池 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 3 的存储策略 指南。

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

  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": 5
    	}],
    	"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. 创建无索引 Bucket

可以在创建的存储桶不使用存储桶索引来存储对象索引时配置放置目标,即无索引存储桶。不使用数据复制或列表的放置目标可能会实现无索引存储桶。

Indexless bucket 提供了一种机制,其中的放置目标不会跟踪特定存储桶中的对象。这消除了每当发生对象写入时发生的资源争用,并减少 Ceph 对象网关对 Ceph 存储集群进行的往返次数。这可能会对并发操作和小对象写入性能产生积极的影响。

要将放置目标指定为无索引,请使用以下步骤:

  1. 获取 zone.json 的配置:

    $ radosgw-admin zone get --rgw-zone=<zone> > zone.json
  2. 通过添加新的放置目标或修改现有目标使其具有 "index_type": 1 来修改 zone.json,例如:

    "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": 1,
            "compression": ""
          }
        },
        {
          "key": "indexless",
          "val": {
            "index_pool": "default.rgw.buckets.index",
            "data_pool": "default.rgw.buckets.data",
            "data_extra_pool": "default.rgw.buckets.non-ec",
            "index_type": 1
          }
        }
      ],
  3. 设置 zone.json 的配置:

    $ radosgw-admin zone set --rgw-zone=<zone> --infile zone.json
  4. 如果您创建了新的放置目标,请确保 zonegroup 引用新的放置目标:

    $ radosgw-admin zonegroup get --rgw-zonegroup=<zonegroup> > zonegroup.json
  5. 设置 zonegroup 的 default_placement

    $ radosgw-admin zonegroup placement default --placement-id indexless
  6. 根据 需要修改 zonegroup.json。例如:

      "placement_targets": [
        {
          "name": "default-placement",
          "tags": []
        },
        {    "name": "indexless",
    		     "tags": []
        }
      ],
      "default_placement": "default-placement",
    $ radosgw-admin zonegroup set --rgw-zonegroup=<zonegroup> < zonegroup.json
  7. 如果集群处于多站点配置中,请更新并提交周期:

    $ radosgw-admin period update --commit

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

重要

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

注意

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

注意

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

3.4. 配置 Bucket 划分

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

当每个存储 桶允许大量对象时,bucket 索引分片 有助于防止性能瓶颈。

您可以为新存储桶配置存储桶索引分片,或者更改现有存储桶的存储桶索引。

配置存储桶索引分片:

重新定义存储桶:

3.4.1. bucket 划分限制

重要

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

  • 在需要分片前,一个存储桶中的最大对象数量: 红帽建议每个存储桶索引分片最多 102,400 个对象。为充分利用分片,请在 Ceph 对象网关 bucket 索引池中提供足够数量的 OSD 来获取最大并行性。
  • 使用分片时的最大对象数量: 基于之前的测试,当前支持的存储桶索引分片数量为 65521。红帽质量保证未对存储桶分片执行完整的可扩展性测试。

3.4.2. 在简单配置中配置 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 = 10
    • 要为 Ceph 对象网关的所有实例配置 bucket 索引分片,请在 [global] 部分下添加 rgw_override_bucket_index_max_shards
    • 要仅为 Ceph 对象网关的特定实例配置 bucket 索引分片,请在实例下添加 rgw_override_bucket_index_max_shards
  3. 重启 Ceph 对象网关:

    $ sudo service radosgw restart id=rgw.hostname

    使用运行 Ceph 对象网关的节点的短 主机名替换 hostname

3.4.3. 在多站点配置中配置 Bucket Index Sharding

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

  • 0 禁用存储桶索引分片。这是默认值。
  • 值大于 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 = 10
  4. 重置 zone group:

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

    $ radosgw-admin period update --commit

3.4.4. 动态 Bucket Index Resharding

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

重要

目前,红帽不支持在多站点配置中重新划分动态存储桶。要在此类配置中重新定义存储桶索引,请参阅使用多站点手动 Resharding Buckets

先决条件

流程

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

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

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

    radosgw-admin reshard add --bucket BUCKET_NAME --num-shards NUMBER

    替换:

    • BUCKET_NAME,带有要重新shard 的存储桶的名称。
    • NUMBER,使用新分片数。

    例如:

    $ radosgw-admin reshard add --bucket data --num-shards 10

  • 列出重新划分队列:

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

    radosgw-admin reshard status --bucket BUCKET_NAME

    替换:

    • BUCKET_NAME,带有要重新shard的存储桶的名称

    例如:

    $ radosgw-admin reshard status --bucket data

    注意

    The radosgw-admin reshard status 命令将显示以下状态标识符之一:

    • not-resharding
    • in-progress
    • done
  • 立即处理重新划分队列中的条目:

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

    radosgw-admin reshard cancel --bucket BUCKET_NAME

    替换:

    • BUCKET_NAME,待处理 bucket 的名称。

    例如:

    $ radosgw-admin reshard cancel --bucket data

    重要

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

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

3.4.5. 手动 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,带有要重新shard的存储桶的名称

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

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

    radosgw-admin bucket reshard --bucket=BUCKET --num-shards=NUMBER

    替换:

    • BUCKET,带有要重新shard的存储桶的名称
    • 使用新分片数量的 NUMBER

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

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

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

在红帽 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})。

# radosgw-admin user info --uid=janedoe

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"
    }

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

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

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

    # radosgw-admin user rename --uid=test$user1 --new-uid=test$user2
    
    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 rm --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 Quotas

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

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

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

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>

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.8.3. 查找机构对象

通常,在健康的存储集群中,您不应有任何泄漏对象,但在某些情况下可能会发生泄漏的对象。例如,如果 RADOS 网关在某一操作的中间发生,这可能会导致一些 RADOS 对象变得孤立。另外,未知的错误可能导致这些孤立对象发生。The radosgw-admin 命令为您提供一个工具,用于搜索这些孤立对象并对其进行清理。通过 --pool 选项,您可以指定要扫描泄漏的 RADOS 对象的池。使用 --num-shards 选项,您可以指定用来保留临时扫描数据的分片数量。

  1. 创建新日志池:

    示例

    # rados mkpool .log

  2. 搜索孤立对象:

    语法

    # radosgw-admin orphans find --pool=<data_pool> --job-id=<job_name> [--num-shards=<num_shards>] [--orphan-stale-secs=<seconds>]

    示例

    # radosgw-admin orphans find --pool=.rgw.buckets --job-id=abc123

  3. 清理搜索数据:

    语法

    # radosgw-admin orphans finish --job-id=<job_name>

    示例

    # radosgw-admin orphans finish --job-id=abc123

3.9. bucket 管理

作为存储管理员,在使用 Ceph 对象网关时,您可以通过在用户之间移动 bucket 并将它们重命名来管理存储桶。

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. 其它资源

3.10. 优化 Ceph 对象网关的垃圾回收

当新数据对象写入到存储集群中时,Ceph 对象网关会立即为这些新对象分配存储。在删除或覆盖存储集群中的数据对象后,Ceph 对象网关将从存储桶索引中删除这些对象。之后一段时间后,Ceph 对象网关会清除用于存储存储群集中对象的空间。从存储集群中清除已删除对象数据的过程称为 Garbage Collection 或 GC。

垃圾回收操作通常在后台运行。您可以将这些操作配置为持续执行,或者仅在低活动和轻型工作负载期间运行。默认情况下,Ceph 对象网关持续执行 GC 操作。由于 GC 操作是 Ceph 对象网关操作的一个正常部分,因此大部分时间都存在符合垃圾回收条件的已删除对象。

3.10.1. 查看垃圾回收队列

在从存储集群中清除被删除和覆盖对象前,useradosgw-admin 来查看等待垃圾回收的对象。

先决条件

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

流程

  1. 查看等待垃圾回收的对象队列:

    示例

    [root@rgw ~] radosgw-admin gc list

注意

要列出队列中的所有条目,包括未过期条目,请使用 --include-all 选项。

3.10.2. 为删除密集型工作负载调整垃圾回收

某些工作负载可能会临时或永久超过垃圾回收率(GC)活动的速度。对于删除密集型工作负载而言,这尤其适用,其中很多对象在短时间内存储,然后会被删除。对于这些类型的工作负载,请考虑增加垃圾回收操作相对于其他操作的优先级。如有关于 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. 保存并关闭该文件。
  4. 重新启动 Ceph 对象网关,以允许更改的设置生效。
  5. 在 GC 活动期间监控存储集群,以验证增加的值不会影响性能。
重要

切勿修改正在运行的集群中的 rgw_gc_max_objs 选项的值。您应该仅在部署 RGW 节点前更改此值。

第 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. 常规设置

名称描述类型默认

rgw_data

设置 Ceph 对象网关的数据文件的位置。

字符串

/var/lib/ceph/radosgw/$cluster-$id

rgw_enable_apis

启用指定的 API。

字符串

s3, swift, swift_auth, admin all API.

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

线程池的大小。如果设置,则此变量将被 num_threads 覆盖。如需更多信息,请参阅 Civetweb 配置选项

整数

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_num_zone_opstate_shards

保存 zonegroup 复制进度信息的最大分片数量。

整数

128

rgw_opstate_ratelimit_sec

一次上传时 opstate 更新之间的最小时间。0 可禁用速率限制。

整数

30

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

4.2. 关于池

Ceph zone 映射到一系列 Ceph 存储群集池。

手动创建池与.生成池

如果 Ceph 对象网关的用户密钥包含写入功能,则网关能够自动创建池。这对入门来说非常方便。但是,Ceph 对象存储群集使用 PG 默认值,除非已在 Ceph 配置文件中进行了设置。此外,Ceph 将使用默认的 CRUSH 层次结构。这些设置 不是 生产系统的理想选择。

要设置生产系统,请参阅红帽 Ceph 存储 3 的 Ceph 对象网关生产 指南。有关存储策略,请参阅 Ceph Object Gateway for Production 指南中的开发 存储策略 一节。

Ceph 对象网关默认区的池包括:

  • .rgw.root
  • .default.rgw.control
  • .default.rgw.gc
  • .default.log
  • .default.intent-log
  • .default.usage
  • .default.users
  • .default.users.email
  • .default.users.swift
  • .default.users.uid

Ceph 对象网关基于每个区域创建池。如果手动创建池,请预先填充区域名称。系统池存储与系统控制、垃圾收集、日志记录、用户信息、使用情况等相关的对象。按照惯例,这些池名称的前置为池名称的区域名称。

  • .<zone-name>.rgw.control :控制池。
  • .<zone-name>.rgw.gc :垃圾回收池,其中包含要删除对象的散列存储桶。
  • .<zone-name>.log :日志池包含所有存储桶/容器的日志,以及创建、读取、更新和删除对象操作的日志。
  • .<zone-name>.intent-log :意图日志池包含对象更新请求的副本,以便在请求失败时协助撤销/恢复。
  • .<zone-name>.users.uid :用户 ID 池包含唯一用户 ID 的映射。
  • .<zone-name>.users.keys :密钥池包含每个用户 ID 的访问密钥和密钥。
  • .<zone-name>.users.email :电子邮件池包含与用户 ID 关联的电子邮件地址。
  • .<zone-name>.users.swift :Swift 池包含用户 ID 的 Swift 子用户信息。
  • .<zone-name>.usage :使用池包含每个用户的使用情况日志。

Ceph 对象网关存储放置池中 bucket 索引(index_pool)和 bucket 数据(data_pool)的数据。它们可能会重叠;即,您可以对索引和数据使用相同的池。默认放置的索引池是 {zone-name}.rgw.buckets.index,默认放置的数据池是 {zone-name}.rgw.buckets

名称描述类型默认

rgw_zonegroup_root_pool

用于存储所有 zone group 特定信息的池。

字符串

.rgw.root

rgw_zone_root_pool

用于存储特定区域信息的池。

字符串

.rgw.root

4.3. Swift 设置

名称描述类型默认

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.4. 日志记录设置

名称描述类型默认

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

副本日志的对象名称前缀。

字符串

副本日志

rgw_md_log_max_shards

元数据日志的最大分片数量。

整数

64

4.5. Keystone 设置

名称描述类型默认

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.6. LDAP 设置

名称描述类型示例

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 发生重大故障。在 Red Hat Ceph Storage 2 及更高版本中,每个区域都处于活动状态,可能会收到写操作。除了灾难恢复之外,多个活动区也可以充当内容交付网络的基础。要配置多个区域而无需复制,请参阅 第 5.11 节 “在不使用复制的情况下配置多个区域”
  • multi-zone-group: 称为"regions",Ceph 对象网关也可以支持多个 zone group,每个 zone group 都有一个或多个 zone。存储在同一域中的 zone group 的对象共享全局命名空间,确保 zone group 和 zone 之间唯一对象 ID。
  • 多个 Realms: 在红帽 Ceph 存储 2 及更新的版本中,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.data.root
  • us-east.rgw.gc
  • us-east.rgw.log
  • us-east.rgw.intent-log
  • us-east.rgw.usage
  • us-east.rgw.users.keys
  • us-east.rgw.users.email
  • us-east.rgw.users.swift
  • us-east.rgw.users.uid
  • us-east.rgw.buckets.index
  • us-east.rgw.buckets.data

5.3. 安装对象网关

要安装 Ceph 对象网关,请参阅 Ubuntu 的红帽 Ceph 存储 3 安装指南

所有 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。下一节中创建用户后,这些设置将添加到区域。

重要

以下步骤假设使用新安装的系统(这些系统尚未存储数据)进行多站点配置。如果您已在使用默认区域及其池来存储数据,请勿对 默认 区域及其池进行 DELETE,否则数据将被删除并不可恢复。

5.4.4. 删除 Default Zone Group 和 Zone

删除 默认 区域(如果存在)。确保首先将其从 default zone group 中删除。

[root@master-zone]# radosgw-admin zonegroup remove --rgw-zonegroup=default --rgw-zone=default
[root@master-zone]# radosgw-admin period update --commit
[root@master-zone]# radosgw-admin zone delete --rgw-zone=default
[root@master-zone]# radosgw-admin period update --commit
[root@master-zone]# radosgw-admin zonegroup delete --rgw-zonegroup=default
[root@master-zone]# radosgw-admin period update --commit

最后,如果 Ceph 存储集群 中的默认 池存在,请删除它们。

重要

以下步骤假设使用新安装的系统进行多站点配置,这些系统当前并未存储数据。如果您已在 使用默认 zone group 存储数据,请不要对其执行 DELETE。

要访问默认区域和 zonegroup 中的旧数据,请在 radosgw-admin 命令中使用 --rgw-zone default --rgw-zonegroup default

# rados rmpool default.rgw.control default.rgw.control --yes-i-really-really-mean-it
# rados rmpool default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
# rados rmpool default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
# rados rmpool default.rgw.log default.rgw.log --yes-i-really-really-mean-it
# rados rmpool default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it

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]
host = rgw1
rgw frontends = "civetweb port=80"
rgw_zone=us-east

5.4.8. 启动网关

在对象网关主机上,启动并启用 Ceph 对象网关服务:

$ sudo systemctl start ceph-radosgw@rgw.`hostname -s`
$ sudo systemctl enable ceph-radosgw@rgw.`hostname -s`

如果服务已在运行,重启该服务而不是启动和启用它:

$ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`

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 标志。在红帽 Ceph 存储 2 中,默认情况下,所有区域都以主动-主动配置运行;即,网关客户端可能会将数据写入任何区域,区域会将数据复制到 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} --endpoints={url} \
                           --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 存储集群中的默认池。

# rados rmpool default.rgw.control default.rgw.control --yes-i-really-really-mean-it
# rados rmpool default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-it
# rados rmpool default.rgw.gc default.rgw.gc --yes-i-really-really-mean-it
# rados rmpool default.rgw.log default.rgw.log --yes-i-really-really-mean-it
# rados rmpool default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it

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]
host = rgw2
rgw frontends = "civetweb port=80"
rgw_zone=us-west

5.5.6. 启动网关

在对象网关主机上,启动并启用 Ceph 对象网关服务:

$ sudo systemctl start ceph-radosgw@rgw.`hostname -s`
$ sudo systemctl enable ceph-radosgw@rgw.`hostname -s`

如果服务已在运行,重启该服务而不是启动和启用它:

$ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`

5.6. 故障切换和灾难恢复

如果 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
  2. 更新 period 以使更改生效。

    # radosgw-admin period update --commit
  3. 最后,重新启动 Ceph 对象网关。

    $ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`

如果前一个 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 对象网关。

    $ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`
  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 对象网关。

    $ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`

5.7. 将单一站点系统迁移到多站点

要从带有 默认 区组和区的单一站点系统迁移到多站点系统,请使用以下步骤:

  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 对象网关。

    $ sudo systemctl restart ceph-radosgw@rgw.`hostname -s`

完成此步骤后,继续建立第二个 区域,以在 master zone group 中创建 second zone。

5.8. 多站点命令行使用

5.8.1. realm

realm 代表一个全局唯一的命名空间,它由一个或多个 zone group 组成,包含一个或多个 zone,以及包含 bucket 的区域,后者又包含对象。域允许 Ceph 对象网关在同一硬件上支持多个命名空间及其配置。

域中包含句点的概念。每个 period 代表 zone group 和 zone 配置的状态。每次您更改一个 zonegroup 或 zone zone 时,更新 period 并提交。

默认情况下,Ceph 对象网关版本 2 不创建域,以向后兼容版本 1.3 及更早的版本。但是,作为一种最佳实践,红帽建议为新集群创建域。

5.8.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.8.1.2. 将 Realm 设置为默认值

realm 列表中的一个域应为默认域。可能只有一个默认域。如果只有一个域,但没有在创建时指定为默认域,则使其成为默认域。或者,要更改哪个域是默认域,请执行:

[root@master-zone]# radosgw-admin realm default --rgw-realm=movies
注意

当 realm 为 default 时,命令行假设 --rgw-realm=<realm-name> 作为参数。

5.8.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.8.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.8.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.8.1.6. 列出 Realms

若要列出 realm,可执行 realm list

# radosgw-admin realm list

5.8.1.7. 列出 Realm Periods

若要列出 realm period,可执行 realm list-periods

# radosgw-admin realm list-periods

5.8.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.8.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.8.2. zone group

Ceph 对象网关利用 zone group 的概念来支持多站点部署和全局命名空间。zone group 以前称为红帽 Ceph 存储 1.3 中的地区,它定义一个或多个 zone 中一个或多个 Ceph 对象网关实例的地理位置。

配置 zone group 与典型的配置过程不同,因为并非所有设置都最终在 Ceph 配置文件中。您可以列出 zone group、获取 zone group 配置并设置 zone group 配置。

注意

The radosgw-admin zonegroup 对 realm内的任何主机上执行 MAY 操作,因为更新 period 的步骤会在整个集群中传播更改。但是,radosgw-admin 区域 在区域内的主机上执行 MUST

5.8.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.8.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.8.2.3. 在区组中添加一个区

若要向 zonegroup 添加区域,您必须在区域中的 主机上执行 此步骤。要在 zonegroup 中添加区,请执行以下操作:

# radosgw-admin zonegroup add --rgw-zonegroup=<name> --rgw-zone=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.8.2.4. 从区组中删除区

要从 zonegroup 中删除区,请执行以下操作:

# radosgw-admin zonegroup remove --rgw-zonegroup=<name> --rgw-zone=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.8.2.5. 重命名一个区组

要重命名 zonegroup,请执行以下操作:

# radosgw-admin zonegroup rename --rgw-zonegroup=<name> --zonegroup-new-name=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.8.2.6. 删除区组

要删除 zonegroup,请执行以下操作:

# radosgw-admin zonegroup delete --rgw-zonegroup=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.8.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.8.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": 0,
            "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": 0,
            "read_only": "false"
        }
    ],
    "placement_targets": [
        {
            "name": "default-placement",
            "tags": []
        }
    ],
    "default_placement": "default-placement",
    "realm_id": "ae031368-8715-4e27-9a99-0c9468852cfe"
}

5.8.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.8.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": 0,
                        "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": 0,
                        "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.8.3. Zones

Ceph 对象网关支持区域的概念。zone 定义由一个或多个 Ceph 对象网关实例组成的逻辑组。

配置区域与典型配置过程有所不同,因为并非所有设置都最终在 Ceph 配置文件中。您可以列出区、获取区配置和设置区域配置。

重要

All radosgw-admin 区域 在运行 或 区域的主机上执行 MUST

5.8.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.8.3.2. 删除区

若要删除区域,首先将其从 zonegroup 中删除。

# radosgw-admin zonegroup remove --zonegroup=<name>\
                                 --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 不包含其他活动域。

# rados rmpool <del-zone>.rgw.control <del-zone>.rgw.control --yes-i-really-really-mean-it
# rados rmpool <del-zone>.rgw.data.root <del-zone>.rgw.data.root --yes-i-really-really-mean-it
# rados rmpool <del-zone>.rgw.gc <del-zone>.rgw.gc --yes-i-really-really-mean-it
# rados rmpool <del-zone>.rgw.log <del-zone>.rgw.log --yes-i-really-really-mean-it
# rados rmpool <del-zone>.rgw.users.uid <del-zone>.rgw.users.uid --yes-i-really-really-mean-it

5.8.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.8.3.4. 列出区域

root 用户身份列出集群中的区域,请执行:

$ sudo radosgw-admin zone list

5.8.3.5. 获取区域

root 身份获取区配置,请执行:

$ sudo 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.8.3.6. 设置区域

配置区域涉及指定一系列 Ceph 对象网关池。为保持一致性,我们建议使用与区域名称相同的池前缀。有关配置池的详细信息,请参阅 Pools_。

重要

区域应在位于 区域内的 Ceph 对象网关节点上设置。

要设置区,创建一个由池组成的 JSON 对象,将对象保存到文件中(如 zone.json);然后执行以下命令,将 {zone-name} 替换为区名称:

[root@zone]$ sudo radosgw-admin zone set --rgw-zone={zone-name} --infile zone.json

其中 zone.json 是您创建的 JSON 文件。

然后,以 root 用户身份更新周期:

$ sudo radosgw-admin period update --commit

5.8.3.7. 重命名区域

要重命名区域,请指定区域名称和新区域名称。在区中的主机上执行以下内容:

[root@zone]# radosgw-admin zone rename --rgw-zone=<name> --zone-new-name=<name>

然后,更新周期:

# radosgw-admin period update --commit

5.9. zone group 和 zone 配置设置

在配置默认 zone group 和 zone 时,池名称中包含 zone 名称。例如:

  • default.rgw.control

若要更改默认值,可在 Ceph 配置文件中的每个 [client.rgw.{instance-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

rgw_num_zone_opstate_shards

用于保持区间组同步进度的分片的最大数量。

整数

128

5.10. 使用多站点手动 Resharding Bucket

{storage-product} DOES 不支持 多站点集群的动态存储桶重新划分。您可以使用以下步骤在多站点集群中手动重新定义存储桶。

备注
手动重新划分过程非常昂贵,特别是对于保证手动重新划分的大型存储桶。每个 second zone 删除所有对象,然后从 master zone 重新同步它们。

先决条件

  • 停止所有对象网关实例。

流程

  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.11. 在不使用复制的情况下配置多个区域

您可以配置多个不会相互复制的区域。例如,您可以为公司中的每个团队创建一个专用区。

先决条件

  • 安装了 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": 0,
                    "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": 0,
                    "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.12. 在同一存储集群中配置多个域

本节讨论如何在同一存储集群中配置多个域。这是多站点更高级的使用案例。在同一个存储集群中配置多个域可让您使用本地域来处理本地 RGW 客户端流量,以及复制到辅助站点的数据的复制域。

注意

红帽建议每个域具有自己的 Ceph 对象网关。

先决条件

流程

  1. 创建同步用户:

    语法

    radosgw-admin user create --uid="SYNCHRONIZATION_USER" --display-name="Synchronization User" --system

  2. 在存储集群的第一个数据中心上创建一个本地域:

    语法

    radosgw-admin realm create --rgw-realm=REALM_NAME --default

    示例

    [user@rgw1]$ radosgw-admin realm create --rgw-realm=ldc1 --default

  3. 在第一个数据中心上创建一个本地 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpoints=http://RGW_NODE_NAME:80 --rgw-realm=REALM_NAME --master --default

    示例

    [user@rgw1]$ radosgw-admin zonegroup create --rgw-zonegroup=ldc1zg --endpoints=http://rgw1:80 --rgw-realm=ldc1 --master --default

  4. 在第一个数据中心创建一个本地区:

    语法

    radosgw-admin zone create --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME --master --default --endpoints=HTTP_FQDN[,HTTP_FQDN]

    示例

    [user@rgw1]$ radosgw-admin zone create --rgw-zonegroup=ldc1zg --rgw-zone=ldc1z --master --default --endpoints=http://rgw.example.com

  5. 提交周期:

    示例

    [user@rgw1]$ radosgw-admin period update --commit

  6. 使用 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

  7. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  8. 在存储集群中的第二个数据中心上创建一个本地域:

    语法

    radosgw-admin realm create --rgw-realm=REALM_NAME --default

    示例

    [user@rgw2]$ radosgw-admin realm create --rgw-realm=ldc2 --default

  9. 在第二个数据中心上创建一个本地 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpoints=http://RGW_NODE_NAME:80 --rgw-realm=REALM_NAME --master --default

    示例

    [user@rgw2]$ radosgw-admin zonegroup create --rgw-zonegroup=ldc2zg --endpoints=http://rgw2:80 --rgw-realm=ldc2 --master --default

  10. 在第二个数据中心创建一个本地区:

    语法

    radosgw-admin zone create --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME --master --default --endpoints=HTTP_FQDN[, HTTP_FQDN]

    示例

    [user@rgw2]$ radosgw-admin zone create --rgw-zonegroup=ldc2zg --rgw-zone=ldc2z --master --default --endpoints=http://rgw.example.com

  11. 提交周期:

    示例

    [user@rgw2]$ radosgw-admin period update --commit

  12. 使用 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

  13. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  14. 创建复制/同步用户:

    语法

    radosgw-admin user create --uid="r_REPLICATION_SYNCHRONIZATION_USER_" --display-name="Replication-Synchronization User" --system

  15. 在存储集群的第一个数据中心上创建一个复制的域:

    语法

    radosgw-admin realm create --rgw-realm=REPLICATED_REALM_1

    示例

    [user@rgw1] radosgw-admin realm create --rgw-realm=rdc1

  16. 为第一个数据中心创建一个 master zonegroup:

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=RGW_ZONE_GROUP --endpoints=http://_RGW_NODE_NAME:80 --rgw-realm=_RGW_REALM_NAME --master --default

    示例

    [user@rgw1] radosgw-admin zonegroup create --rgw-zonegroup=rdc1zg --endpoints=http://rgw1:80 --rgw-realm=rdc1 --master --default

  17. 在第一个数据中心上创建一个 master zone:

    语法

    radosgw-admin zone create --rgw-zonegroup=RGW_ZONE_GROUP --rgw-zone=_MASTER_RGW_NODE_NAME --master --default --endpoints=HTTP_FQDN[,HTTP_FQDN]

    示例

    [user@rgw1] radosgw-admin zone create --rgw-zonegroup=rdc1zg --rgw-zone=rdc1z --master --default --endpoints=http://rgw.example.com

  18. 提交周期:

    语法

    radosgw-admin period update --commit

  19. 使用第一个数据中心的 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

  20. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  21. 在第二个数据中心上拉取复制域:

    语法

    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

  22. 从第一个数据中心拉取 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

  23. 在第二个数据中心中创建 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

    示例

    [user@rgw2] radosgw-admin zone create --rgw-zone=rdc2z --rgw-zonegroup=rdc1zg --endpoints=https://tower-osd4.cephtips.com --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8

  24. 提交周期:

    语法

    radosgw-admin period update --commit

  25. 使用第二个数据中心的 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

  26. 重启 RGW 守护进程:

    语法

    systemctl restart ceph-radosgw@rgw.$(hostname -s).rgw0.service

  27. root 用户身份登录第二个数据中心的端点。
  28. 验证 master 域上的同步状态:

    语法

    radosgw-admin sync status

    示例

    [root@tower-osd4 ceph-ansible]# 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)

  29. root 用户身份登录第一个数据中心的端点。
  30. 验证 replication-synchronization 域的同步状态:

    语法

    radosgw-admin sync status --rgw-realm RGW_REALM_NAME

    例如:

    [root@tower-osd4 ceph-ansible]# [root@tower-osd4 ceph-ansible]# 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
  31. 要在本地站点中存储和访问数据,请为本地域创建用户:

    语法

    radosgw-admin user create --uid="LOCAL_USER" --display-name="Local user" --rgw-realm=_REALM_NAME --rgw-zonegroup=ZONE_GROUP_NAME --rgw-zone=ZONE_NAME

    示例

    [user@rgw2] #radosgw-admin user create --uid="local-user" --display-name="Local user" --rgw-realm=ldc1 --rgw-zonegroup=ldc1zg --rgw-zone=ldc1z

重要

默认情况下,用户被添加到多站点配置中。对于访问本地区域中数据的用户,radosgw-admin 命令需要 --rgw-realm arument。