Red Hat Training

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

Red Hat Enterprise Linux的对象网关指南

红帽Ceph存储 3

在 Red Hat Enterprise Linux 上配置和管理 Ceph 存储对象网关。

摘要

本文档提供了在 AMD64 和 Intel 64 架构上运行的 Red Hat Enterprise Linux 7 上配置和管理 Ceph 存储对象网关的说明。

第 1 章 概述

Ceph对象网关又称RADOS网关(RGW),是建立在librados 上的对象存储接口,为应用程序提供一个RESTful网关到Ceph存储集群。Ceph对象网关支持两个接口。

  1. S3-compatible: 提供对象存储功能,其接口与Amazon S3 RESTful API的一大子集兼容。
  2. Swift-compatible: 提供对象存储功能,其接口与OpenStack Swift API的大部分子集兼容。

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

gateway
警告

不要在 RGW 使用的池上使用 RADOS 快照。这样做可能会引入不良的数据不一致。

第 2 章 配置

2.1. CivetWeb前端

默认情况下,Ceph对象网关通过HTTP使用CivetWeb网络服务器暴露其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 上进行监听,而安装Red Hat Ceph Storage 3的支持方式是使用ceph-ansible ,在Red Hat Ceph Storage 3文档中,端口8080 被认为是默认端口。

先决条件

  • 一个正在运行的Red Hat Ceph Storage 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存储集群客户端,其中客户端类型为Ceph对象网关,由rgw ,节点名称为gateway-node1

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

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

    确保在 port=port-number rgw_frontends 键/值对中。

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

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

    # systemctl restart ceph-radosgw.target。
  5. 确保每个网关节点的防火墙上配置的端口是开放的。

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

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

其他资源

2.3. 使用SSL与Civetweb

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

重要

生产部署MUST ,使用HAProxy和keepalived在HAProxy终止SSL连接。对于中小型的test and pre-production ,建议使用SSL与Civetweb一起部署ONLY

要在Civetweb中使用SSL,需要从与网关节点的主机名相匹配的证书颁发机构(CA)获得证书。Red Hat 建议从有subject alternate name 字段和通配符的 CA 处获取证书,以便与 S3 风格的子域一起使用。

Civetweb需要将密钥、服务器证书和任何其他证书机构或中间证书放在一个.pem 文件中。

重要

一个.pem 文件包含秘钥。保护.pem 文件,防止未经授权的访问。

要为SSL配置端口,请将端口号添加到rgw_frontends ,并在端口号后附加s ,以表明这是一个安全端口。另外,在ssl_certificate 后加上.pem 文件的路径。例如

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

2.4. Civetweb配置选项

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

选项说明默认

access_log_file

访问日志文件的路径。可以是完整路径,也可以是相对于当前工作目录的路径。如果没有(默认),则不记录访问日志。

error_log_file

错误日志文件的路径。可以是完整路径,也可以是相对于当前工作目录的路径。如果没有(默认),则不记录错误。

num_threads

工作线程的数量。Civetweb会在一个单独的线程中处理每一个连接,因此这个选项的值就是Civetweb可以处理的并发HTTP连接数。因此,这个选项的值实际上就是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. 使用"野兽"前端

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

先决条件

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

流程

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

    1. 增加一个标题为[client.rgw.<gateway-node>] 的部分,用Ceph对象网关节点的简短节点名称代替<gateway-node>
    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. 魔兽配置选项

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

选项说明默认

endpointssl_endpoint

设置监听地址,格式为address[:port] ,其中地址是点阵十进制形式的 IPv4 地址字符串,或用方括号包围的十六进制符号表示的 IPv6 地址。可选端口默认为endpoint80ssl_endpoint443 。它可以被多次指定,如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 ,添加一个通配符到ceph-radosgw 守护进程用来解析域名的DNS服务器的DNS记录中。

对于dnsmasq ,添加以下地址设置,并在主机名前加上一个点(.)。

地址=/.{主机名或fqdn}/{主机-ip-address}。

例如:

address=/.gateway-node1/192.168.122.75

对于bind ,在DNS记录中添加一个通配符。例如:"",在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服务器在本地机器上,你可能需要修改/etc/resolv.conf ,添加一个本地机器的名称服务器条目。

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

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

作为最佳实践,在一个集中的位置(如admin节点或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

关于日志记录和调试的一般细节,请参见 Logging Configuration ReferenceConfiguration Guide 章节。有关 Ceph 对象网关特有的日志记录的详细信息,请参见 Red Hat Ceph Storage 3 中的 The Ceph Object Gateway在本指南Logging Configuration Reference 一章中的"我的"一节。

2.9. S3 API服务器端加密

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

注意

Red Hat不支持S3对象加密的SLO(Static Large Object)和DLO(Dynamic Large Object)。

重要

要使用加密,客户端请求MUST ,通过SSL连接发送请求。除非 Ceph 对象网关使用 SSL,否则 Red Hat 不支持来自客户端的 S3 加密。然而,出于测试目的,管理员可以在测试期间禁用SSL,方法是在运行时将rgw_crypt_require_ssl 配置设置为false ,在Ceph配置文件中设置为false ,并重新启动网关实例,或者在Ansible配置文件中设置为false ,并重新播放Ceph对象网关的Ansible playbooks。

加密密钥的管理有两种选择。

客户提供的钥匙

当使用客户提供的密钥时,S3客户端在每次请求读取或写入加密数据时都会传递一个加密密钥。管理这些密钥是客户的责任。客户必须记住Ceph对象网关用于加密每个对象的密钥。

Ceph Object Gateway根据Amazon SSE-C规范在S3 API中实现客户提供的密钥行为。

由于客户处理密钥管理,S3客户端将密钥传递给Ceph对象网关,所以Ceph对象网关不需要特殊配置就可以支持这种加密模式。

钥匙管理服务

当使用密钥管理服务时,安全密钥管理服务存储密钥,Ceph对象网关根据需求检索密钥,以服务于加密或解密数据的请求。

Ceph Object Gateway根据Amazon SSE-KMS规范在S3 API中实现了密钥管理服务行为。

重要

目前,唯一经过测试的密钥管理实现使用OpenStack Barbican。然而,使用OpenStack Barbican还不完全支持。在生产中使用它的唯一方法是获得支持异常。更多信息,请联系技术支持

2.10. 测试网关

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

2.10.1. 创建一个S3用户

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

注意

在多站点部署中,总是在主区组的主区中的主机上创建一个用户。

先决条件

  • 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转义字符。
    • 手动指定密钥和秘密。

    不要去掉前斜杠/ ,因为这是一个有效的字符。

2.10.2. 创建一个Swift用户

要测试Swift界面,请创建一个Swift子用户。创建Swift用户是一个两步的过程。第一步是创建用户。第二步是创建秘钥。

注意

在多站点部署中,总是在主区组的主区中的主机上创建一个用户。

先决条件

  • 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. 创建秘钥。

    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并列出所有bucket。aws_access_key_idaws_secret_access_key 的值取自radosgw_admin 命令返回的access_keysecret_key 的值。

执行以下步骤:

  1. 启用通用存储库。

    # 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> 。也就是说,gateway host 。确保host 设置用 DNS 解析。将<port> 替换为网关的端口号。
    2. 创建S3用户部分的access_keysecret_key 值替换$access$secret
  5. 运行脚本。

    脚本

    输出将是类似以下的东西。

    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 -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 命令的输出值代替。用你在Civetweb使用的端口号代替{port}(例如,默认为8080 )。如果不替换端口,则默认为80

例如:

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

输出应该是:

我的新篮子

2.11. 配置HAProxy/keepalived。

Ceph对象网关允许你将对象网关的许多实例分配到一个区域,这样你就可以随着负载的增加而扩展,也就是同一个区域组和区域;但是,你不需要一个联合架构来使用HAProxy/keepalived 。由于每个对象网关实例都有自己的IP地址,所以你可以使用HAProxy和keepalived 来平衡Ceph对象网关服务器之间的负载。

HAProxy和keepalived 的另一个用例是在HAProxy服务器上终止HTTPS。Red Hat Ceph Storage(RHCS)1.3.x使用Civetweb,而RHCS 1.3.x中的实现不支持HTTPS。你可以使用HAProxy服务器在HAProxy服务器终止HTTPS,在HAProxy服务器和Civetweb网关实例之间使用HTTP。

2.11.1. HAProxy/keepalived前提条件

要用Ceph对象网关设置HA代理,你必须具备: 1:

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

本节假设你至少有两台Ceph Object Gateway服务器在运行,当你通过端口80 运行测试脚本时,你会从每台服务器得到有效的响应。

有关 HAProxy 和keepalived 的详细讨论,请参见Load Balancer Administration

2.11.2. 准备HAProxy节点

下面的设置假设两个名为haproxyhaproxy2 的 HAProxy 节点和两个名为rgw1rgw2 的 Ceph Object Gateway 服务器。你可以使用任何你喜欢的命名惯例。在你的至少两个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. 根据需要安装管理工具(如:wgetvim ,等)。
  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. 在两个HAProxy节点上配置keepalived

    [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

    主负载均衡器节点

    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生成密钥。如果没有证书,可以使用自签证书。要生成密钥,请参见 Generating a New Key and Certificate System Administrator’s Guide 中的 Red Hat Enterprise 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

    globaldefaults 可以保持不变。在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. 启用/启动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服务器,当内容不动态变化时,它可以低效地使用资源。Ceph Object Gateway可以在S3 buckets中托管静态网站--即不使用PHP、servlet、数据库、nodejs等服务器端服务的网站。这种方法比为每个网站设置虚拟机与网站服务器要经济得多。

2.12.1. 静态主机的假设

静态网站托管需要至少一个运行中的Ceph存储集群,静态网站需要至少两个Ceph对象网关实例。Red Hat 假设每个区域将有多个网关实例,由 HAProxy/keepalived 负载平衡。

有关HAProxy/keepalived的更多详情,请参见配置HAProxy/keepalived。

注意

Red HatDOES NOT 支持使用 Ceph Object Gateway 实例同时部署标准 S3/Swift API 和静态 Web 托管。

2.12.2. 静态网站托管要求

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

  1. S3静态网站托管使用Ceph对象网关实例,该实例与用于标准S3/Swift API用例的实例是分开的、不同的。
  2. 托管S3静态网站的网关实例应该有独立的、与标准S3/Swift API网关实例不重叠的域名。
  3. 托管S3静态网站的网关实例应该使用独立于标准S3/Swift API网关实例的面向公众的IP地址。
  4. 托管S3静态网站的网关实例使用HAProxy/keepalived进行负载平衡,必要时终止SSL。

2.12.3. 静态主机网关设置

要启用静态网站托管的网关,编辑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 的设置必须是truergw_enable_apis 设置必须启用s3website API。rgw_dns_namergw_dns_s3website_name 设置必须提供其完全合格的域名。如果网站将使用规范的名称扩展,则将rgw_resolve_cname 设置为true

重要

rgw_dns_namergw_dns_s3website_name MUST NOT 的 FQDN 重叠。

2.12.4. 静态主机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对象网关,请考虑使用路由解决方案将流量路由到最接近客户端的网关。

亚马逊网络服务(AWS)需要静态的网络主机桶来匹配主机名。Ceph提供了几种不同的方式来配置DNS,以及HTTPS will work if the proxy has a matching certificate.

主机名到子域上的水桶上

要使用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支持将域名映射到桶,而不需要在请求中包含桶名,这对Ceph对象网关来说是独一无二的。要使用域名来访问一个桶,请将域名映射到桶名。一个DNS条目可能看起来像下面这样。

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

其中桶名为bucket2

按以下方式访问水桶。

http://www.example.com

主机名转CNAME长桶

AWS通常要求桶名与域名相匹配。要使用CNAME为静态虚拟主机配置DNS,DNS条目可能会像下面这样。

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

按以下方式访问水桶。

http://www.example.com

主机名转为不含CNAME的长桶

如果DNS名称包含其他非CNAME记录,如SOA,NS,MXTXT, DNS记录必须将域名直接映射到IP地址。比如说: , , 或 , 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. 创建一个静态主机网站

要创建一个静态网站,请执行以下步骤。

  1. 创建一个S3 bucket。bucket名称可以和网站的域名相同。例如,mysite.com 可以有一个mysite.com 的 bucket 名称。这对 AWS 是必需的,但对 Ceph 不是必需的。请参阅DNS 设置了解详情。
  2. 将静态网站内容上传到桶中。内容可能包括HTML、CSS、客户端JavaScript、图像、音频/视频内容和其他可下载文件。一个网站必须有一个index.html 文件,可以有error.html 文件。
  3. 验证网站的内容。此时,只有 bucket 的创建者才能访问内容。
  4. 设置文件的权限,使其可以公开阅读。

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

在Red Hat Ceph Storage 3中,Ceph对象网关提供了通过使用NFS版本3和NFS版本4.1为生产系统导出S3对象命名空间的能力。

注意

NFS Ganesha功能并不是一般使用,而是只用于迁移到S3云。

该实现符合亚马逊网络服务(AWS)分层命名空间约定,将UNIX风格的路径名映射到S3桶和对象上。附属命名空间的顶层从属于NFSv4伪根(如果存在的话),由Ceph对象网关S3桶组成,其中桶被表示为NFS目录。一个桶内的对象按照S3惯例,以NFS文件和目录层次结构的形式呈现。支持创建文件和目录的操作。

注意

不支持创建或删除硬链接或软链接。不支持通过 NFS 在桶或目录上执行重命名操作,但支持在目录内和目录之间以及在文件系统和 NFS 挂载之间对文件进行重命名。通过NFS进行文件重命名操作的成本较高,因为这些操作会改变目标目录,通常会强制全readdir ,以刷新目录。

注意

不支持通过NFS挂载编辑文件。

注意

Ceph对象网关要求应用程序从偏移量0到文件末尾依次写入。试图不按顺序写入会导致上传操作失败。要解决这个问题,在将文件复制到NFS空间时,请使用cpcat ,或rsync 等实用程序。始终使用sync 选项进行挂载。

Ceph Object Gateway with NFS是基于Gateway服务器的进程库封装和NFS-Ganesha NFS服务器的文件系统抽象层(FSAL)命名空间驱动。在运行时,Ceph Object Gateway daemon with NFS的实例在一个进程中结合了一个完整的Ceph Object Gateway daemon(尽管没有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 Object Gateway 实例在同一主机上共同定位。

在您开始之前

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

    # subscription-manager repos --enable=rhel-7-server-rhceph-3-tools-rpms。
  3. 确保rpcbind 服务正在运行。

    # systemctl start rpcbind
    注意

    通常默认安装提供rpcbindrpcbind 包。如果不是这样,请先安装这个包。

    有关 NFS 如何使用rpcbind 的详细信息,请参见 Red Hat Enterprise Linux 7 的《存储管理指南》中的《所需服务》部分。

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

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

配置NFS-Ganesha实例。

  1. 安装nfs-ganesha-rgw 包。

    # yum install nfs-ganesha-rgw。
  2. 将Ceph Monitor节点的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,keyring, 或rgw_frontends 。如果导出的 Swift 容器不符合有效的 S3 bucket 命名要求,请在 Ceph 配置文件的[client.rgw] 部分将rgw_relaxed_s3_bucket_names 设置为true 。例如,如果 Swift 容器名称包含下划线,它就不是有效的 S3 bucket 名称,除非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. EXPORT 部分配置一个FSAL (文件系统抽象层)块。提供一个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的命名空间所管理的文件系统内的位置。对于其他FSAL,它可能是该FSAL的命名空间管理的文件系统内的位置。例如,如果Ceph FSAL用于导出整个CephFS卷,Path 将是/

    Pseudo 选项指示 Ganesha 在 NFS v4 的伪文件系统命名空间内将导出文件放置在哪里。NFS v4规定服务器可以构造一个伪命名空间,这个伪命名空间可能不对应出口的任何实际位置,而且这个伪文件系统的部分可能只存在于NFS服务器的领域内,不对应任何物理目录。此外,NFS v4服务器将其所有的出口置于一个单一的命名空间内。可以将单个导出作为伪文件系统的根目录,但将多个导出放置在伪文件系统中则更为常见。在传统的VFS中,往往Pseudo 的位置和Path 的位置是一样的。回到CephFS导出的例子,以/ 作为Path ,如果需要多个导出,导出很可能会有其他东西作为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-native NFS 4.1客户端的NFS客户端通常会看到一个由目标服务器的pseudofs root定义的导出文件系统的联合命名空间。任何数量的这些都可以是Ceph对象网关导出。

    每个导出都有自己的元组nameUser_IdAccess_Key ,和Secret_Access_Key ,并创建一个指定用户可见的对象命名空间的代理。

    ganesha.conf 中的导出也可以包含一个NFSV4 块。Red Hat Ceph Storage 支持Allow_Numeric_OwnersOnly_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客户端

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

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

配置NFS GaneshaEXPORT blockProtocols 设置为版本3,如果挂载将使用版本3与UDP,则Transports 设置为UDP。

由于NFSv3不向文件服务器传达客户端的OPEN和CLOSE操作,RGW NFS不能使用这些操作来标记文件上传事务的开始和结束。取而代之的是,当第一次写入偏移量为0的文件时,RGW NFS尝试开始一个新的上传,并在一段时间内没有看到新的文件写入时完成上传--默认情况下,为10秒。要改变这个值,请在Ceph配置文件的RGW部分设置一个rgw_nfs_write_completion_interval_s

第 3 章 行政管理

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

3.1. 行政数据存储

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

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

您应该考虑手动创建这些池,以便您可以设置 CRUSH 规则集和放置组的数量。在典型的配置中,存储 Ceph Object Gateway 的管理数据的池通常会使用相同的 CRUSH 规则集并使用较少的放置组,因为管理数据有 10 个池。请参阅Poolsand the Storage StrategiesRed Hat Ceph Storage 3 的指南,以了解更多详情。

有关安置组计算的详细信息,还请参见Ceph每池安置组(PGs)计算器mon_pg_warn_max_per_osd 设置警告您,如果给一个池分配太多放置组(即默认情况下为 300)。您可以调整该值以适应您的需求和硬件的能力,其中n 是每个 OSD 的最大 PG 数量。

mon_pg_warn_max_per_osd = n。

3.2. 创建存储策略

Ceph Object Gateway通过识别放置目标来存储客户桶和对象数据,并将桶和对象存储在与放置目标相关联的池中。如果您没有在实例的区域配置中配置放置目标并将其映射到池中,Ceph Object Gateway将使用默认的目标和池,例如,default_placement

存储策略给Ceph对象网关客户端提供了一种访问存储策略的方式,也就是针对特定类型的存储,例如,SSD、SAS硬盘、SATA硬盘。确保耐久性、复制、擦除编码等的特定方式。详细内容请看 Storage StrategiesRed Hat Ceph Storage 3的指南。

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

  1. 用所需的存储策略创建一个新的池.rgw.buckets.special 。例如,用擦除编码、特定的CRUSH规则集、复制数以及pg_numpgp_num 计数来定制的池。
  2. 获取区组配置并将其存储在一个文件中,例如,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 下增加一个special-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. 用修改后的zonegroup.json 文件设置区组。

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

    [root@master-zone]# radosgw-admin zone get > zone.json。
  6. 编辑zone文件,并在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. 更新区组图。

    [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-Authent-Token:AUTH_rgwtxxxxxx"

3.3. 创建无索引桶

可以配置一个放置目标,其中创建的桶不使用桶索引来存储对象索引;也就是无索引桶。不使用数据复制或列表的放置目标可以实现无索引桶。

无索引桶提供了一种机制,在这种机制中,放置目标不跟踪特定桶中的对象。这消除了每当对象写入发生时的资源争夺,减少了Ceph对象网关需要到Ceph存储集群的往返次数。这对并发操作和小对象写入性能有积极影响。

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

  1. 获取配置为zone.json

    $ radosgw-admin zone get --rgw-zone=<zone> > zone.json。
  2. 修改zone.json ,增加一个新的放置目标,或者修改现有的放置目标,使其具有"index_type": 1 ,例如。

    "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=- YRFFGUNA-zone> --infile zone.json。
  4. 如果您创建了新的安置目标,请确保zonegroup 指的是新的安置目标。

    $ radosgw-admin zonegroup get --rgw-zonegroup=<zonegroup> > zonegroup.json。
  5. 设置区域组的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" 目标中创建的 buckets 将是无索引 buckets。

重要

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

注意

使用无索引桶可以消除单个桶中对象的最大数量限制。

注意

不能从NFS中列出无索引桶中的对象。

3.4. 配置桶式共享

Ceph对象网关将桶索引数据存储在索引池(index_pool)中,默认为.rgw.buckets.index 。当客户端将许多对象--几十万到几百万个对象放在一个桶中,而没有为每个桶的最大对象数量设置配额时,索引池就会出现明显的性能下降。

Bucket index sharding ,当允许每个桶有大量对象时,有助于防止性能瓶颈。

您可以为新的 bucket 配置 bucket index sharding,或者在已有的 bucket 上更改 bucket index。

要配置 bucket index sharding。

要重新硬一桶。

3.4.1. 桶式共享限制

重要

谨慎地使用以下限制。你的硬件选择会带来一些影响,所以你应该始终与你的 Red Hat 账户团队讨论这些要求。

  • Maximum number of objects in one bucket before it needs sharding: Red Hat 建议每个桶索引shard最多可容纳102,400个对象。为了充分利用sharding的优势,在Ceph Object Gateway bucket索引池中提供足够数量的OSD以获得最大的并行性。
  • Maximum number of objects when using sharding: 根据之前的测试,目前支持的桶索引碎片数量为65521。Red Hat 质量保证没有对 bucket sharding 进行全面的可扩展性测试。

3.4.2. 在简单配置中配置桶索引共享

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

  • 0 ,以禁用 bucket index sharding。这是默认值。
  • 大于0 ,可以启用桶式分片,并设置最大分片数。

先决条件

流程

  1. 计算推荐的碎片数量。为此,请使用以下公式:

    桶内预期物体数/100,000个

    请注意,最大的碎片数是65521。

  2. 在Ceph配置文件中添加rgw_override_bucket_index_max_shards

    rgw_override_bucket_index_max_shards =.value

    例如,用上一步计算出的推荐碎片数代替value

    rgw_override_bucket_index_max_shards = 10。
    • 要为 Ceph Object Gateway 的所有实例配置 bucket index sharding,请在[global] 部分下添加rgw_override_bucket_index_max_shards
    • 要只为Ceph对象网关的特定实例配置 bucket index sharding,请在实例下添加rgw_override_bucket_index_max_shards
  3. 重新启动Ceph对象网关。

    # systemctl restart ceph-radosgw.target。

3.4.3. 在多站点配置中配置桶索引共享

在多站点配置中,每个区域可以有不同的index_pool 设置来管理故障转移。要为一个区组中的区配置一致的碎片数,请在该区组的配置中设置rgw_override_bucket_index_max_shards 。将该参数设置为

  • 0 ,以禁用 bucket index sharding。这是默认值。
  • 大于0 ,可以启用桶式分片,并设置最大分片数。
注意

将索引池(适用于每个区域)映射到基于 SSD 的 OSD 的 CRUSH 规则集,也可能有助于提高桶索引的性能。

先决条件

流程

  1. 计算推荐的碎片数量。为此,请使用以下公式:

    桶内预期物体数/100,000个

    请注意,最大的碎片数是65521。

  2. 将区组配置提取到zonegroup.json 文件中。

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

    rgw_override_bucket_index_max_shards =.value

    例如,用上一步计算出的推荐碎片数代替value

    rgw_override_bucket_index_max_shards = 10。
  4. 重置区组。

    $ radosgw-admin zonegroup set < zonegroup.json
  5. 更新时期。

    $ radosgw-admin period update --commit

3.4.4. 动态桶指数重新编码

动态 bucket 重置的过程会定期检查所有 Ceph Object Gateway bucket 并检测需要重置的 bucket。如果一个 bucket 的大小已经大于rgw_max_objs_per_shard 参数中指定的值,Ceph Object Gateway 就会在后台动态重装该 bucket。rgw_max_objs_per_shard 的默认值是每个 shard 的 100k 对象。

重要

目前,Red Hat 不支持多站点配置中的动态 bucket 重置。要在这样的配置中重新arding bucket index,请参见 Manually Resharding Buckets with Multi-site.

先决条件

流程

  • 要启用动态桶索引重arding

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

      • rgw_reshard_num_logs :重新arding 日志的碎片数量。默认值为16
      • rgw_reshard_bucket_lock_duration :重新arding期间 bucket 上的锁定时间。默认值是120 秒。
      • rgw_dynamic_resharding: 启用或禁用动态重arding。默认值为true
      • rgw_max_objs_per_shard :每个shard的最大对象数量。默认值是每个shard的100000 对象。
      • rgw_reshard_thread_interval: reshard线程处理的最大轮次间隔时间。默认值是600 秒。
  • 要添加一个桶到重新arding队列中。

    radosgw-admin reshard add --bucketBUCKET_NAME --num-shards。NUMBER

    替换:

    • BUCKET_NAME ,并附上桶的名称,以备重新洗牌。
    • NUMBER ,新的碎片数量。

    例如:

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

  • 列出重新arding队列。

    $ radosgw-admin reshard list
  • 检查桶的重新arding状态。

    radosgw-admin reshard状态 --bucketBUCKET_NAME

    替换:

    • BUCKET_NAME ,并附上桶的名称,以便重新安装。

    例如:

    $ radosgw-admin reshard status --bucket data.

    注意

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

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

    $ radosgw-admin reshard process
  • 取消待定的铲斗重定。

    radosgw-admin reshard 取消 --bucketBUCKET_NAME

    替换:

    • BUCKET_NAME ,并注明挂桶名称。

    例如:

    $ radosgw-admin reshard cancel --bucket data.

    重要

    您只能取消pending 重置操作。不要取消ongoing 重置操作。

  • 如果您使用 Red Hat Ceph Storage 3.1 和以前的版本,请按照在 Red Hat Ceph Storage 3.1 和以前的版本中所描述的删除陈旧的 bucket 项。 Cleaning stale instances after resharding节。

3.4.5. 手动铲斗索引重封

如果bucket的大小已经超过了初始配置的优化范围,请使用radosgw-admin bucket reshard 命令重新hard bucket索引池。这个命令。

  • 为指定的 bucket 创建一组新的 bucket 索引对象。
  • 将对象条目分布在这些桶索引对象上。
  • 创建一个新的 bucket 实例。
  • 将新的bucket实例与bucket链接起来,这样所有新的索引操作都会经过新的bucket索引。
  • 将旧的和新的桶ID打印到命令输出中。
重要

仅在简单配置中使用此步骤。要在多站点配置中重新安装桶,请参见 Manually Resharding Buckets with Multi-site.

先决条件

流程

  1. 备份原来的水桶指数。

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

    替换:

    • BUCKET ,并附上桶的名称,以便重新安装。

    例如,对于名为data 的桶,输入。

    $ radosgw-admin bi list --bucket=data > data.list.backup。
  2. 重新硬化桶指数。

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

    替换:

    • BUCKET ,并附上桶的名称,以便重新安装。
    • NUMBER ,有新的碎片数量。

    例如,对于一个名为data ,所需碎片数量为100 的桶,输入。

    $ radosgw-admin bucket reshard --bucket=data --num-shards=100。
  3. 如果您使用 Red Hat Ceph Storage 3.1 和以前的版本,请按照在 Red Hat Ceph Storage 3.1 和以前的版本中所描述的删除陈旧的 bucket 项。 Cleaning stale instances after resharding节。

3.4.6. 重置磁盘后清理陈旧实例

在 Red Hat Ceph Storage 3.1 和以前的版本中,重新arding 过程不会自动清理 bucket 项的陈旧实例。如果不手动清理,这些陈旧的实例会影响集群的性能。

重要

仅在简单配置中使用此程序,而不是在多站点集群中使用。

先决条件

  • 安装Ceph对象网关。

流程

  1. 列出陈旧的实例。

    $ radosgw-admin reshard stal-instances list
  2. 清理陈旧的实例。

    $ radosgw-admin reshard stale-instances rm

3.5. 启用压缩

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

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

snappyzstd 压缩插件是技术预览版功能,因此它们还没有得到完全支持,因为 Red Hat 还没有完成对它们的质量保证测试。

配置

要在zone的放置目标上启用压缩,请为radosgw-admin zone placement modify 命令提供--compression=<type> 选项。压缩type ,指的是写入新对象数据时要使用的压缩插件的名称。

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

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

要在zone的放置目标上禁用压缩,请向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 Object Gateway 创建一个default 区域和一组池。对于生产部署,请参见 Ceph Object Gateway for Production指南,更具体地说,就是 Creating a Realm节为先。另见多站点

统计数据

虽然所有现有的命令和 API 都会继续根据未压缩的数据报告对象和桶的大小,但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_utilizedsize_kb_utilized 字段分别代表压缩数据的总大小,单位为字节和千字节。

3.6. 用户管理

Ceph Object Storage用户管理指的是作为Ceph Object Storage服务的客户端应用的用户;而不是作为Ceph Storage Cluster的客户端应用的Ceph Object Gateway。您必须创建一个用户、访问密钥和秘密,以使客户端应用程序能够与Ceph对象网关服务交互。

有两种用户类型。

  • User: "用户"一词反映的是S3界面的用户。
  • Subuser: 术语"子用户"反映了Swift界面的用户。一个子用户与一个用户相关联。

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

重要

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

除了创建用户和子用户ID,还可以为用户添加显示名称和电子邮件地址。您可以指定一个密钥和秘密,或者自动生成一个密钥和秘密。当生成或指定密钥时,请注意用户 ID 对应 S3 密钥类型,子用户 ID 对应 swift 密钥类型。Swift 密钥的访问级别也有readwritereadwritefull

用户管理命令行语法一般遵循user <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. 多重租约

在Red Hat Ceph Storage 2及以后的版本中,Ceph对象网关支持S3和Swift API的多租户,其中每个用户和桶都位于一个"租户"之下。多租户可以防止当多个租户使用共同的桶名时,比如"test/"、"main/"等,发生命名空间冲突。

每个用户和桶都在一个租户之下。为了向后兼容,我们添加了一个空名的"legacy/"租户。无论何时,在没有特别指定租户的情况下引用一个桶时,Swift API都会使用"legacy/"租户。现有的用户也会被存储在 legacy 租户下,所以他们将以与早期版本相同的方式访问 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. 创建一个用户

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

[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": []}
重要

检查键输出。有时,radosgw-admin 会生成一个 JSON 转义字符 (\),有些客户端不知道如何处理 JSON 转义字符。补救措施包括删除JSON转义字符(\)、将字符串用引号封装、重新生成密钥并确保其没有JSON转义字符或手动指定密钥和秘密。

3.6.3. 创建一个子用户

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

注意

full 不是readwrite ,因为它还包括访问控制政策。

[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. 获取用户信息

要获取用户的信息,必须指定user info 和用户ID (--uid={username})。

# radosgw-admin用户信息 --uid=janedoe。

3.6.5. 修改用户信息

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

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

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

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

3.6.6. 启用和暂停用户

当您创建一个用户时,该用户默认为启用。但是,您可以暂停用户权限,并在以后重新启用。要暂停用户,请指定user suspend 和用户ID。

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

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

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

禁用该用户可禁用子用户。

3.6.7. 移除一个用户

当您删除一个用户时,该用户和子用户将从系统中删除。但是,如果您愿意,也可以只删除子用户。删除用户(和子用户)时,请指定user 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

如果只删除子用户,请指定subuser rm 和子用户名称。

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

选项包括:

  • Purge Data: --purge-data 这个选项可以清除所有与UID相关的数据。
  • Purge Keys: --purge-keys 选项会清除与UID相关联的所有密钥。

3.6.8. 移除一个子用户

当您删除一个子用户时,您将删除对Swift界面的访问。该用户将保留在系统中。Ceph 对象网关 要删除子用户,请指定subuser rm 和子用户 ID。

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

选项包括:

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

3.6.9. 重新命名一个用户

要更改用户的名称,请使用radosgw-admin user rename 命令。这个命令所需的时间取决于用户拥有的桶和对象的数量。如果数量很多,Red Hat 建议使用screen 软件包提供的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"
    }

    如果用户在租户里面,使用tenant$user-name 格式。

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

    例如,在test 租户内将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用户信息 --uid=new-user-name

    例如:

    # radosgw-admin用户信息 --uid=user2

    如果用户在租户里面,使用tenant$user-name 格式。

    radosgw-admin 用户信息 --uid=tenant$。new-user-name
    # radosgw-admin用户信息 --uid=test$user2

其他资源

  • screen(1) 手册页面

3.6.10. 创建一个密钥

要为用户创建密钥,必须指定key create 。对于用户,必须指定用户ID和s3 密钥类型。要为子用户创建密钥,必须指定子用户ID和swift 密钥类型。比如说,为用户创建密钥,必须指定用户ID和 密钥类型。

[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接口。当你创建一个用户或子用户,但没有指定访问密钥和秘密时,密钥和秘密会自动生成。你可以创建一个密钥并指定或生成访问密钥和/或秘密。您也可以删除一个访问密钥和秘密。选项包括:

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

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

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

你也可以指定一个密钥和一个秘密。

要删除一个访问密钥,需要指定用户和密钥。

  1. 找到特定用户的访问密钥。

    [root@master-zone]# radosgw-admin 用户信息 --uid=<testid>。

    例如,访问键是输出中的"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="[用户|桶|元数据|使用区]=[*|读|写|读,写]/"

例如:

[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 选项允许您指定用户拥有的桶的配额。
  • Maximum Objects: --max-objects 设置允许您指定对象的最大数量。负值则禁用此设置。
  • Maximum Size: --max-size 选项允许您指定最大字节数的配额。负值则禁用此设置。
  • Quota Scope: --quota-scope 选项设置了配额的范围。选项是bucketuser 。Bucket 配额适用于用户拥有的 bucket。用户配额适用于一个用户。
重要

拥有大量对象的桶会导致严重的性能问题。一个桶中推荐的最大对象数量是100,000。要增加这个数量,请配置 bucket index sharding。详情请参见第 3.4 节 “配置桶式共享”

3.7.1. 设置用户配额

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

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

例如:

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

num对象和/或最大尺寸的负值意味着特定配额属性检查被禁用。

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. 设置桶式定额

桶配额适用于指定uid.所拥有的桶。它们与用户无关。

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

num对象和/或最大尺寸的负值意味着特定配额属性检查被禁用。

3.7.4. 启用和禁用水桶配额

设置好了水桶配额后,就可以启用了。比如说

[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用户信息 --uid=<uid>。

3.7.6. 更新配额统计

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

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

3.7.7. 获取用户配额使用统计

要查看一个用户消耗了多少配额,请执行以下命令。

# radosgw-admin用户统计 --uid=<uid>。
注意

你应该执行radosgw-admin user stats ,并选择--sync-stats ,以获得最新的数据。

3.7.8. 配额缓存

配额统计是为每个Ceph Gateway实例缓存的。如果有多个实例,那么缓存可以使配额不被完美执行,因为每个实例将有不同的配额视图。控制这个的选项是rgw bucket quota ttlrgw user quota bucket sync intervalrgw user quota sync interval 。这些值越高,配额操作的效率就越高,但多个实例会越不同步。这些值越低,多实例就越接近完美执行。如果这三个值都为0,那么配额缓存就会被有效地禁用,多个实例将实现完美的配额执行。有关这些选项的详细信息,请参见第 4 章 配置参考

3.7.9. 阅读和写作全球定额

您可以在区域组地图中读取和写入配额设置。要获得一个分区组地图。

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

全局配额设置可以通过global quota 对应的quota set,quota enable, 和quota disable 命令进行操作,例如。

[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
注意

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

3.8. 使用方法

Ceph对象网关记录每个用户的使用情况。您也可以在日期范围内跟踪用户使用情况。

选项包括:

  • Start Date: --start-date 选项允许您从特定的开始日期(format: yyyy-mm-dd[HH:MM:SS] )过滤使用统计。
  • End Date: --end-date 选项允许你过滤到特定日期的使用情况(format: yyyy-mm-dd[HH:MM:SS] )。
  • Log Entries: --show-log-entries 选项允许您指定是否将日志条目与使用统计一起包含(选项:true |false )。
注意

您可以用分和秒来指定时间,但它是以1小时的分辨率来存储的。

3.8.1. 显示用法

要显示使用情况统计,请指定usage show 。要显示某个特定用户的使用情况,必须指定一个用户ID,还可以指定开始日期、结束日期以及是否显示日志条目。您还可以指定开始日期、结束日期以及是否显示日志条目。

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

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

# radosgw-admin用法显示 --show-log-entries=false

3.8.2. 修剪用途

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

[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对象成为孤儿。另外,未知的bug也可能导致这些孤儿对象的发生。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. 水桶管理

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

3.9.1. 移动桶

radosgw-admin bucket 实用程序提供了在用户之间移动桶的功能。要做到这一点,请将 bucket 链接到新用户,并将 bucket 的所有权改为新用户。

你可以移动桶。

3.9.1.1. 先决条件

  • 一个正在运行的Red Hat Ceph存储集群
  • 安装Ceph对象网关
  • 各种租赁和非租赁用户

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

radosgw-admin bucket chown 命令提供了将桶的所有权及其包含的所有对象从一个用户变更到另一个用户的能力。要做到这一点,可以将一个桶从当前用户中解开链接,将其链接到一个新用户,然后将桶的所有权改为新用户。

流程

  1. 将桶链接到一个新用户。

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

    Replace:

    • user ,并附上用户的用户名,以便将该桶链接到
    • bucket ,并注明桶的名称

    例如,要将data 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

    Replace:

    • user ,用用户的用户名将桶的所有权改为
    • bucket ,并注明桶的名称

    例如,将data bucket的所有权改为user2

    # radosgw-admin bucket chown --uid=user2 --bucket=data
  4. 通过检查以下命令输出中的owner 行,验证data bucket 的所有权是否已经成功改变。

    # radosgw-admin bucket list --bucket=data(数据)

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

你可以在一个租户之间移动桶到另一个租户。

流程

  1. 将桶链接到一个新用户。

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

    Replace

    • current-tenant ,并注明该桶的租户名称。
    • bucket 与桶的名称进行链接
    • new-tenant ,并注明新用户所在的租户名称。
    • user 与新用户的用户名

    例如,要将test 租户中的data bucket 链接到test2 租户中名为user2 的用户。

    # 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

    Replace:

    • bucket 与桶的名称进行链接
    • new-tenant ,并注明新用户所在的租户名称。
    • user 与新用户的用户名

    例如,将data bucket的所有权改为test2 tenant里面的user2

    # radosgw-admin bucket chown --bucket='test2/data' --uid='test$tuser2'
  4. 通过检查以下命令输出中的owner 行,验证data bucket 的所有权是否已经成功改变。

    # 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 Object Gateway。

    # swift list

    或使用s3cmd

    # s3cmd ls

    来自外部租户的首次访问会创建一个等价的Ceph对象网关用户。

  2. 将一个桶移动到一个租户。

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

    Replace

    • bucket ,并注明桶的名称
    • tenant ,并注明新用户所在的租户名称。
    • user 与新用户的用户名

    例如,要把data 桶移到test 租户里面的tenanted-user

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

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

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

    Replace

    • bucket ,并注明桶的名称
    • tenant ,并注明新用户所在的租户名称。
    • user 与新用户的用户名

    例如,要把data bucket的所有权改为test tenant里面的tenanted-user

    # radosgw-admin bucket chown --bucket='test/data' --uid='test$tenanted-user'。
  5. 通过检查以下命令输出中的owner 行,验证data bucket 的所有权是否已经成功改变。

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

3.9.2. 重命名桶

你可以重新命名桶。

先决条件

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

流程

  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 bucket重命名为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. 其他资源

第 4 章 配置参考

以下设置可以添加到Ceph配置文件中,也就是通常的ceph.conf ,在[client.rgw.<instance_name>] 部分下。这些设置可能包含默认值。如果你没有在Ceph配置文件中指定每个设置,默认值将被自动设置。

[client.rgw.<instance_name>] 部分下设置的配置变量将不适用于rgwradosgw-admin 命令中没有指定instance_name 的命令。因此,意在应用于所有 Ceph Object Gateway 实例或所有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 所有API。

rgw_cache_enabled

是否启用Ceph对象网关缓存。

布尔型

true

rgw_cache_lru_size

Ceph对象网关缓存中的条目数。

整数

10000

rgw_socket_path

域套接字的套接字路径。FastCgiExternalServer 使用这个套接字。如果你没有指定套接字路径,Ceph Object Gateway将不会作为外部服务器运行。你在这里指定的路径必须与rgw.conf 文件中指定的路径相同。

字符串

不适用

rgw_host

Ceph对象网关实例的主机。可以是一个IP地址或主机名。

字符串

0.0.0.0

rgw_port

实例监听请求的端口。如果没有指定,Ceph对象网关运行外部FastCGI。

字符串

rgw_dns_name

所服务域名的DNS名称。也请参见区组内的hostnames 设置。

字符串

rgw_script_uri

如果在请求中没有设置SCRIPT_URI ,则为备用值。

字符串

rgw_request_uri

如果在请求中没有设置REQUEST_URI ,则为备选值。

字符串

rgw_print_continue

启用100-continue ,如果它正在运行。

布尔型

true

rgw_remote_addr_param

远程地址参数。例如,包含远程地址的HTTP字段,如果反向代理正在运行,则为X-Forwarded-For 地址。

字符串

REMOTE_ADDR

rgw_op_thread_timeout

打开线程的超时时间,以秒为单位。

整数

600

rgw_op_thread_suicide_timeout

Ceph对象网关进程死亡前的时间timeout ,单位为秒。如果设置为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头字段来设置。如果设置了,这些属性将作为HTTP字段在对象上进行GET/HEAD时返回。

字符串

无。例如:"content_foo, content_bar/"content_foo, content_bar"

rgw_exit_timeout_secs

进程无条件退出前等待的秒数。

整数

120

rgw_get_obj_window_size

单个对象请求的窗口大小,单位为字节。

整数

16 << 20

rgw_get_obj_max_req_size

发送给Ceph存储集群的单次获取操作的最大请求大小。

整数

4 << 20

rgw_relaxed_s3_bucket_names

启用放宽的S3桶名规则,用于区域组桶。

布尔型

false

rgw_list buckets_max_chunk

列表用户桶时,单次操作中要检索的最大桶数。

整数

1000

rgw_override_bucket_index_max_shards

bucket索引对象的碎片数量。值为0 表示没有分片。Red Hat 不推荐设置一个太大的值(例如1000 ),因为它会增加 bucket 列表的成本。

这个变量应该在[client][global] 部分设置,这样它就会自动应用到radosgw-admin 命令中。

整数

0

rgw_num_zone_opstate_shards

用于保存区组间副本进度信息的最大碎片数。

整数

128

rgw_opstate_ratelimit_sec

单次上传的opstate更新之间的最小时间间隔。0 ,禁用rateelimit。

整数

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和HTTP_CONTENT_LENGTH。

布尔型

false

rgw_bucket_default_quota_max_objects

每个桶的默认最大对象数量。如果没有指定其他配额,则对新用户设置该值。它对现有用户没有影响。

这个变量应该在[client][global] 部分设置,这样它就会自动应用到radosgw-admin 命令中。

整数

-1

rgw_bucket_quota_ttl

缓存配额信息被信任的时间,以秒为单位。在该超时后,配额信息将从集群中重新获取。

整数

600

rgw_user_quota_bucket_sync_interval

在同步到集群之前,桶配额信息积累的时间(以秒为单位)。在这段时间内,其他 RGW 实例将不会看到该实例上操作的桶配额统计的变化。

整数

180

rgw_user_quota_sync_interval

在同步到集群之前,用户配额信息积累的时间(以秒为单位)。在这段时间内,其他RGW实例将看不到该实例上操作的用户配额统计的变化。

整数

3600 * 24

4.2. 关于泳池

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

Manually Created Pools vs. Generated Pools

如果Ceph对象网关的用户密钥包含写功能,网关就有能力自动创建池。这对于入门很方便。但是,Ceph对象存储集群使用放置组默认值,除非在Ceph配置文件中设置了这些值。此外,Ceph将使用默认的CRUSH层次结构。这些设置是NOT ,是生产系统的理想选择。

要建立生产系统,请参见 Ceph Object Gateway for ProductionRed Hat Ceph Storage 3的指南。关于存储策略,请参阅 Developing Storage Strategies Ceph Object Gateway for Production 指南中的部分。

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

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

Ceph对象网关以每个区域为基础创建池。如果您手动创建池,请预输入区名。系统池存储与系统控制、日志、用户信息等相关的对象。按照惯例,这些池的名称前面都会预留区名。

  • .<zone-name>.rgw.control :控制池。
  • .<zone-name>.log :日志池包含所有 bucket/container 和对象操作的日志,如创建、读取、更新和删除。
  • .<zone-name>.rgw.buckets.index :这个池子存储的是公鹿的指数。
  • .<zone-name>.rgw.buckets.data :这个池子存储桶的数据。
  • .<zone-name>.rgw.meta :元数据池存储user_keys 和其他关键元数据。
  • .<zone-name>.meta:users.uid :用户ID池包含一个独特的用户ID的映射。
  • .<zone-name>.meta:users.keys :密钥池包含每个用户ID的访问密钥和秘钥。
  • .<zone-name>.meta:users.email :电子邮件池包含与用户ID相关联的电子邮件地址。
  • .<zone-name>.meta:users.swift :Swift 池包含用户 ID 的 Swift 子用户信息。

Ceph Object Gateways 将桶索引 (index_pool) 和桶数据 (data_pool) 的数据存储在放置池中。这些池子可能会重叠;也就是说,你可以为索引和数据使用同一个池子。用于默认放置的索引池是{zone-name}.rgw.buckets.index ,用于默认放置的数据池是{zone-name}.rgw.buckets

名称说明种类默认

rgw_zonegroup_root_pool

用于存储所有区组特定信息的池子。

字符串

.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

不适用

rgw_swift_auth_url

用于验证 v1 auth 令牌的默认 URL(如果不使用内部 Swift auth)。

字符串

rgw_swift_auth_entry

Swift auth URL 的入口点。

字符串

auth

4.4. 登录设置

名称说明种类默认

rgw_log_nonexistent_bucket

启用 Ceph Object Gateway 记录不存在的 bucket 的请求。

布尔型

false

rgw_log_object_name

对象名称的日志格式。有关格式指定器的详细信息,请参见manpage 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

意图日志对象名称的日志格式。关于格式指定器的详细信息,请参见manpage date。

日期

%Y-%m-%d-%i-%n

rgw_intent_log_object_name_utc

意图日志对象名称是否包含UTC时间。如果false ,则使用当地时间。

布尔型

false

rgw_data_log_window

秒的数据日志记录窗口。

整数

30

rgw_data_log_changes_size

数据变更日志的内存条目数。

整数

1000

rgw_data_log_num_shards

保存数据更改日志的碎片(对象)数量。

整数

128

rgw_data_log_obj_prefix

数据日志的对象名称前缀。

字符串

data_log

rgw_replica_log_obj_prefix

复制日志的对象名称前缀。

字符串

replica log

rgw_md_log_max_shards

元数据日志的最大碎片数。

整数

64

4.5. 钥匙石设置

名称说明种类默认

rgw_keystone_url

Keystone服务器的URL。

字符串

rgw_keystone_admin_token

Keystone管理员令牌(共享秘密)。

字符串

rgw_keystone_accepted_roles

角色需要服务请求。

字符串

Member, admin

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 章 多站点

单区配置通常由一个区组组成,包含一个区和一个或多个ceph-radosgw 实例,您可以在实例之间负载平衡网关客户端请求。在单区配置中,通常多个网关实例指向一个Ceph存储集群。然而,Red Hat支持Ceph对象网关的几种多站点配置选项。

  • Multi-zone: 更高级的配置由一个区组和多个区组成,每个区有一个或多个ceph-radosgw 实例。每个zone都有自己的Ceph存储集群支持。一个zone组中的多个zone为zone组提供灾难恢复,以防其中一个zone发生重大故障。在 Red Hat Ceph Storage 2 和更高版本中,每个区域都是活动的,可以接收写操作。除了灾难恢复外,多个活动区还可以作为内容交付网络的基础。要配置不需要复制的多个区域,请参见第 5.11 节 “配置多个区域而不复制”
  • Multi-zone-group: 以前叫'区域',Ceph Object Gateway也可以支持多个区域组,每个区域组有一个或多个区域。存储到同一领域内的区域组的对象共享一个全局命名空间,确保跨区域组和区域的唯一对象ID。
  • Multiple Realms: 在Red Hat Ceph Storage 2及以后的版本中,Ceph对象网关支持领域的概念,领域可以是一个区组,也可以是多个区组,并为领域提供一个全球唯一的命名空间。多领域提供了支持众多配置和命名空间的能力。
gateway realm

5.1. 要求和假设

多站点配置需要至少两个Ceph存储集群,以及至少两个Ceph对象网关实例,每个Ceph存储集群一个。

本指南假设至少有两个Ceph存储集群在不同的地理位置,但是,配置可以在同一个物理站点上工作。本指南还假设四个Ceph对象网关服务器分别命名为rgw1rgw2rgw3rgw4

A multi-site configuration requires a master zone group and a master zone. 另外,each zone group requires a master zone. 区组可以有一个或多个二级区或非主区。

重要

realm 的主区组中的主区负责存储 realm 元数据的主副本,包括用户、配额和桶(由radosgw-admin CLI 创建)。这些元数据会自动同步到辅助区和辅助区组。在主区组的主区内的主机上用radosgw-admin CLIMUST be executed 执行元数据操作,以确保它们能同步到辅助区组和区。目前,在二级区和区组上执行元数据操作是possible ,但由于它们WILL NOT ,会被同步,导致元数据零散,所以是NOT recommended

在下面的例子中,rgw1 主机将作为主区组的主区;rgw2 主机将作为主区组的副区;rgw3 主机将作为副区组的主区;rgw4 主机将作为副区组的副区。

5.2. 泳池

Red Hat 建议使用Ceph Placement Group's per Pool Calculatorceph-radosgw daemon 将创建的池计算出合适的放置组数量。在你的 Ceph 配置文件中把计算出的值设置为默认值。例如,在Ceph配置文件中,将计算值设置为默认值。

osd pool default pg num = 50
osd pool default pgp num = 50
注意

在你的存储集群上对Ceph配置文件进行这种更改;然后,或者对配置进行运行时更改,以便在网关实例创建池时使用这些默认值。

另外,还可以手动创建池。请看 Pools Storage Strategies 指南中关于创建池的详细内容的章节。

区段的特定池名称遵循命名惯例{zone-name}.pool-name 。例如,名为us-east 的区 域将有以下池子:

  • .rgw.root
  • us-east.rgw.control
  • us-east.rgw.meta
  • us-east.rgw.log
  • us-east.rgw.buckets.index
  • us-east.rgw.buckets.data
  • us-east.rgw.buckets.non-ec
  • us-east.rgw.meta:users.keys
  • us-east.rgw.meta:users.email
  • us-east.rgw.meta:users.swift
  • us-east.rgw.meta:users.uid

5.3. 安装对象网关

要安装 Ceph 对象网关,请参见 Red Hat Ceph Storage 3。 Installation Guide for Red Hat Enterprise Linux.

所有Ceph对象网关节点都必须遵循Requirements for Installing Red Hat Ceph Storage 部分中列出的任务。

Ansible可以安装和配置Ceph对象网关,以便与Ceph存储集群一起使用。对于多站点和多站点组的部署,你应该为每个区域有一个Ansible配置。

如果你用Ansible安装Ceph Object Gateway,Ansible的游戏本将为你处理初始配置。要使用 Ansible 安装 Ceph Object Gateway,请将您的主机添加到/etc/ansible/hosts 文件中。在一个[rgws] 部分下添加 Ceph Object Gateway 主机,以向 Ansible 识别它们的角色。如果你的主机有顺序命名,你可以使用一个范围。例如,你可以使用

[rgws]
<rgw-host-name-1>
<rgw-host-name-2>
<rgw-host-name[3..10]>

一旦你添加了主机,你就可以重新运行Ansible的游戏本。

注意

Ansible将确保您的网关正在运行,因此可能需要手动删除默认区域和池。本指南提供了这些步骤。

当使用异步更新更新现有的多站点群集时,请按照安装说明进行更新。然后,重新启动网关实例。

注意

重启实例没有必要的顺序。Red Hat 建议先重启主区组和主区,然后是次区组和次区。

5.4. 建立一个多站点领域

一个集群中的所有网关都有一个配置。在一个多站点的领域中,这些网关可能位于不同的区域组和区域。然而,它们必须在该领域内共同工作。在多站点领域中,所有网关实例MUST ,都会从主区组和主区中的主机上的ceph-radosgw daemon检索其配置。

因此,创建多站点集群的第一步涉及建立境界、主区组和主区。要在多站点配置中配置网关,请选择一个ceph-radosgw 实例,该实例将持有境界配置、主区组和主区。

5.4.1. 创建一个王国

一个领域包含对区域组和区域的多站点配置,还可以在该领域内执行全球唯一的命名空间。

通过在确定服务于主区组和区的主机上打开命令行接口,为多站点配置创建一个新的领域。然后,执行以下操作。

[root@master-zone]# radosgw-admin realm create --rgw-realm={realm-name} [--默认]

例如:

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

如果集群将有一个单一的领域,请指定--default 标志。如果指定了--default ,则radosgw-admin 将默认使用此境界。如果没有指定--default ,则在添加zone-group和zone时,需要指定--rgw-realm 标志或--realm-id 标志来识别境界。

创建境界后,radosgw-admin ,会回传境界配置。例如:

{
    "id": "0956b174-fe14-4f97-8b50-bb7ec5e1cf62",
    "name": "movies",
    "current_period": "1950b710-3e63-4c41-a19e-46a715000980",
    "epoch": 1
}
注意

Ceph为境界生成一个唯一的ID,如果需要的话,允许重命名一个境界。

5.4.2. 创建一个主区组

一个王国必须至少有一个区组,它将作为该王国的主区组。

通过在确定服务于主区组和区域的主机上打开命令行接口,为多站点配置创建一个新的主区组。然后,执行以下操作。

[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

如果王国只有一个区组,请指定--default 标志。如果指定了--default ,则radosgw-admin 将在添加新区段时默认使用此区段组。如果未指定--default ,则在添加或修改区段时,需要--rgw-zonegroup 标志或--zonegroup-id 标志来识别区段组。

创建主区组后,radosgw-admin ,会回传区组配置。例如:

{
    "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对象网关节点上创建区域,该节点将在区域内。

通过在确定服务于主区组和区的主机上打开命令行接口,为多站点配置创建一个主区。然后,执行以下操作。

[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 没有指定。这些设置将在下一节创建用户后添加到该区。

重要

以下步骤假设使用新安装的系统进行多站点配置,这些系统尚未存储数据。如果您已经使用default 区域及其池来存储数据,请勿删除该区域,否则数据将被删除且无法恢复。

5.4.4. 删除默认区组和区

如果存在default 区,请将其删除。请确保先将其从默认区组中删除。

[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存储集群中的default 池,如果它们存在的话。

重要

下面的步骤假设是使用新安装的系统进行多站点配置,而这些系统目前还没有存储数据。如果您已经使用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 守护进程必须先进行身份验证,才能提取境界和周期信息。在主区,创建一个系统用户,以方便守护进程之间的认证。

[root@master-zone]# radosgw-admin user create --uid="{user-name}" --display-name="{Display Name}" --系统

例如:

[root@master-zone]# radosgw-admin user create --uid=/"synchronization-user/" --display-name=/"Synchronization User/" --system

请注意access_keysecret_key ,因为辅助区需要它们与主区进行认证。

最后,将系统用户添加到主区。

[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. 更新期间

更新主区配置后,更新期。

# radosgw-admin period update --commit
注意

更新周期会改变时代,并确保其他区段将收到更新的配置。

5.4.7. 更新Ceph配置文件

更新主区主机上的Ceph配置文件,在实例条目中加入rgw_zone 配置选项和主区名称。

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

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

如果服务已经在运行,请重新启动服务,而不是启动和启用它。

# systemctl restart ceph-radosgw@rgw.`hostname -s`。

5.5. 设立二级区

区组内的区会复制所有数据,以确保每个区的数据相同。创建辅助区时,在确定为辅助区服务的主机上执行ALLradosgw-admin zone 操作。

注意

要添加其他区段,请遵循与添加辅助区段相同的步骤。使用不同的区段名称。

重要

您必须在主区组的主区内的主机上执行元数据操作,如用户创建和配额。主区和辅助区可以接收来自 RESTful API 的 bucket 操作,但辅助区会将 bucket 操作重定向到主区。如果主区宕机, bucket 操作将失败。如果使用radosgw-admin CLI 创建 bucket,必须在主区组的主区内的主机上执行,否则 bucket 将不会同步到其他区组和区。

5.5.1. 牵引境界

使用主区组中主区的 URL 路径、访问密钥和秘密,将境界拉到主机上。要将非默认境界拉到主机上,请使用--rgw-realm--realm-id 配置选项指定境界。

# radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key}。 --secret={secret}

如果这个境界是默认的境界或唯一的境界,就把这个境界作为默认的境界。

# radosgw-admin realm default --rgw-realm={realm-name}。

5.5.2. 拉动周期

使用主区组中主区的 URL 路径、访问密钥和秘密,将周期拉到主机上。要从非默认的领域中提取周期,请使用--rgw-realm--realm-id 配置选项指定领域。

# radosgw-admin period pull --url={url-to-master-zone-gateway} --access-key={access-key}。 --secret={secret}
注意

拉动句号可检索该境界的最新版本的区组和区配置。

5.5.3. 创建一个辅助区

重要

必须在Ceph对象网关节点上创建区域,该节点将在区域内。

在确定为辅助区服务的主机上打开命令行接口,为多站点配置创建辅助区。指定区组 ID、新区名和区的端点。DO NOT ,使用--master--default 标志。在 Red Hat Ceph Storage 2 及以后的版本中,所有区域默认以主动-主动配置运行;也就是说,网关客户端可以向任何区域写入数据,而该区域将把数据复制到区域组内的所有其他区域。如果辅助区不应该接受写操作,请指定--read-only 标志,以便在主区和辅助区之间创建主动-被动配置。另外,提供存储在主区组主区中的生成系统用户的access_keysecret_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
重要

以下步骤假设使用新安装的系统进行多站点配置,这些系统没有存储数据。DO NOT DELETE ,如果您已经使用default 区 域及其池来存储数据,则数据将丢失且无法恢复。

如果需要,请删除默认区域。

[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. 更新期间

更新主区配置后,更新期。

# radosgw-admin period update --commit
注意

更新周期会改变时代,并确保其他区段将收到更新的配置。

5.5.5. 更新Ceph配置文件

更新二级区主机上的Ceph配置文件,在实例条目中加入rgw_zone 配置选项和二级区的名称。

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

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

如果服务已经在运行,请重新启动服务,而不是启动和启用它。

# systemctl restart ceph-radosgw@rgw.`hostname -s`。

5.6. 故障转移和灾难恢复

如果主区发生故障,则将故障切换到辅助区进行灾难恢复。

  1. 将辅助区作为主区和默认区。例如:

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default

    默认情况下,Ceph对象网关将以主动-被动配置运行。如果群集被配置为以主动-被动配置运行,则辅助区是一个只读区。删除--read-only 状态,允许该区接收写操作。例如

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default
  2. 更新期限,使变更生效。

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

    # systemctl restart ceph-radosgw@rgw.`hostname -s`。

如果前主区恢复,则恢复操作。

  1. 从恢复区,将境界从当前主区拉出来。

    # radosgw-admin realm pull --url={url-to-master-zone-gateway} \
                                --access-key={access-key} --secret={secret}
  2. 将恢复的区域作为主区和默认区。

    # radosgw-admin zone modify --rgw-zone={zone-name} --master --default
  3. 更新期限,使变更生效。

    # radosgw-admin period update --commit
  4. 然后,在恢复区重新启动Ceph对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`。
  5. 如果辅助区需要为只读配置,请更新辅助区。

    # radosgw-admin zone modify --rgw-zone={zone-name} --read-only。
  6. 更新期限,使变更生效。

    # radosgw-admin period update --commit
  7. 最后,重新启动辅助区的Ceph对象网关。

    # systemctl restart ceph-radosgw@rgw.`hostname -s`。

5.7. 将单站点系统迁移至多站点

要从具有default 区组和区段的单站点系统迁移到多站点系统,请使用以下步骤。

  1. 创建一个王国。用境界名称代替<name>

    [root@master-zone]# radosgw-admin realm create --rgw-realm=<name> --default
  2. 重新命名默认的zone和zoneegroup。用zoneegroup或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. 配置主区组。将<name> 替换为领域或区域组名称。将<fqdn> 替换为分区群中的完全限定域名。

    [root@master-zone]# radosgw-admin zonegroup modify --rgw-realm=<name>-rgw-zonegroup=<name>-endpoints http://<fqdn>:80 --master --default。
  4. 配置主区。将<name> 替换为 realm、zoneegroup 或zone 名称。将<fqdn> 替换为区域组中的完全限定域名。

    [root@master-zone]# radosgw-admin zone modify --rgw-realm=<name> --rgw-zonegroup=<name> \
                                --rgw-zone=<name> --endpoints http://<fqdn>:80 \
                                --access-key=<access-key> --secret=<secret-key> \
                                --master --default
  5. 创建一个系统用户。用用户名代替<user-id> 。用显示名称代替<display-name> 。它可能包含空格。

    [root@master-zone]# radosgw-admin user create --uid=<user-id> \
                                --display-name="<display-name>" \
                                --access-key=<access-key> --secret=<secret-key> \ --system
  6. 提交更新的配置。

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

    # systemctl restart ceph-radosgw@rgw.`hostname -s`。

完成此步骤后,继续"建立辅助区",在主区组中创建辅助区。

5.8. 多站点命令行用法

5.8.1. 境界

一个领域代表一个全球唯一的命名空间,由一个或多个包含一个或多个区域的区域组和包含桶的区域组成,而桶又包含对象。一个领域使Ceph对象网关能够在同一硬件上支持多个命名空间及其配置。

一个领域包含周期的概念。每个周期都代表了区组和区组配置在时间上的状态。每次对区组或区段进行更改时,都要更新周期并提交。

默认情况下,Ceph Object Gateway 第 2 版不创建境界以向后兼容 1.3 版和更早的版本。然而,作为最佳实践,Red Hat 建议为新集群创建领域。

5.8.1.1. 营造境界

要创建一个境界,执行realm create ,并指定境界名称。如果境界是默认的,请指定--default

[root@master-zone]# radosgw-admin realm create --rgw-realm={realm-name} [--默认]

例如:

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

通过指定--default ,除非明确提供--rgw-realm 和 realm 名称,否则每次调用radosgw-admin 时都会隐式调用 realm。

5.8.1.2. 将境界作为默认

境界列表中的一个境界应该是默认境界。可能只有一个默认境界。如果只有一个境界,而且在创建时没有指定它为默认境界,那么就把它作为默认境界。或者,要改变哪个境界是默认的,请执行。

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

当境界为默认时,命令行假设--rgw-realm=<realm-name> 为参数。

5.8.1.3. 删除一个王国

要删除一个境界,执行realm delete ,并指定境界名称。

[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 ,并指定境界名称。

# radosgw-admin realm get --rgw-realm=<name>。

例如:

# radosgw-admin realm get --rgw-realm=movies [> filename.json]

CLI将呼应一个带有领域属性的JSON对象。

{
    "id": "0a68d52e-a19c-4e8e-b012-a8f831cb3ebc",
    "name": "movies",
    "current_period": "b0c5bbef-4337-4edd-8184-5aeab2ec413b",
    "epoch": 1
}

使用> 和输出文件名将JSON对象输出到文件。

5.8.1.5. 设置境界

要设置一个境界,执行realm set ,指定境界名称,--infile= ,输入文件名。

[root@master-zone]# radosgw-admin realm set --rgw-realm=<name> --infile=<infilename>。

例如:

[root@master-zone]# radosgw-admin realm set --rgw-realm=ovies --infile=filename.json。

5.8.1.6. 上市领域

要列出境界,执行realm list

# radosgw-admin领域列表

5.8.1.7. 上市境界期

要列出境界时期,执行realm list-periods

# radosgw-admin realm list-periods#。

5.8.1.8. 拉动境界

要将境界从包含主区组和主区的节点拉到包含次区组或区的节点,请在将接收境界配置的节点上执行realm pull

# radosgw-admin realm pull --url={url-to-master-zone-gateway} --access-key={access-key}。 --secret={secret}

5.8.1.9. 重新命名一个王国

一个境界不属于时期。因此,重命名境界只在本地应用,不会被realm pull 。当重命名一个有多个区域的境界时,run the command on each zone. 要重命名一个境界,请执行以下操作。

# radosgw-admin realm rename --rgw-realm=<current-name>-realm-new-name=<new-realm-name>。
注意

不要使用realm set 来更改name 参数。那只会改变内部名称。指定--rgw-realm 仍会使用旧的领域名称。

5.8.2. 区组

Ceph Object Gateway通过使用区域组的概念支持多站点部署和全局命名空间。在 Red Hat Ceph Storage 1.3 中,以前称为区域,区域组定义了一个或多个区域内的一个或多个 Ceph Object Gateway 实例的地理位置。

配置区组与典型的配置程序不同,因为并非所有的设置都会在Ceph配置文件中结束。您可以列出区组,获取区组配置,并设置区组配置。

注意

radosgw-admin zonegroup 操作MAY ,可以在域内的任何一台主机上执行,因为更新周期的步骤会将变化传播到整个集群中。但是,radosgw-admin zone 操作MUST ,可以在区间内的主机上执行。

5.8.2.1. 创建一个区组

创建区组包括指定区组名称。除非指定--rgw-realm=<realm-name> ,否则创建区组时假定它将位于默认的领域。如果区组是默认的区组,请指定--default 标志。如果zoneegroup是主zoneegroup,请指定--master 标志。例如

# radosgw-admin zonegroup create --rgw-zonegroup=<name> [--rgw-realm=<name>][--master] [--default] 。
注意

使用zonegroup modify --rgw-zonegroup=<zonegroup-name> 修改现有区组的设置。

5.8.2.2. 将区组设为默认值

区组列表中的一个区组应该是默认区组。可能只有一个默认的区域组。如果只有一个区组,而且在创建时没有指定为默认区组,则将其作为默认区组。另外,如果要改变哪个zoneegroup是默认的,请执行。

# radosgw-admin zonegroup default --rgw-zonegroup=comedy(喜剧)
注意

当zonegroup为默认值时,命令行假设--rgw-zonegroup=<zonegroup-name> 为参数。

然后,更新时期。

# radosgw-admin period update --commit

5.8.2.3. 在区组中添加一个区

要将一个区段添加到一个区段组,您可以在区段内的主机上执行此步骤MUST 。要将一个区段添加到区段组,请执行以下步骤。

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

然后,更新时期。

# radosgw-admin period update --commit

5.8.2.4. 从区组中删除一个区

要从区组中删除一个区段,请执行以下操作。

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

然后,更新时期。

# radosgw-admin period update --commit

5.8.2.5. 重命名区组

要重命名一个区域组,请执行以下操作。

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

然后,更新时期。

# radosgw-admin period update --commit

5.8.2.6. 删除一个区组

要删除一个区域组,请执行以下操作。

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

然后,更新时期。

# radosgw-admin period update --commit

5.8.2.7. 上市区组

一个Ceph集群包含一个区组列表。要列出区组,请执行。

# radosgw-admin zonegroup list

radosgw-admin 返回一个JSON格式的区组列表。

{
    "default_info": "90b28698-e7c3-462c-a42d-4aa780d24eda",
    "zonegroups": [
        "us"
    ]
}

5.8.2.8. 获得一个区组

要查看区组的配置,请执行。

# radosgw-admin zonegroup get [--rgw-zonegroup=<zonegroup>]

区组配置是这样的。

{
    "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. 设置区组

定义一个区组包括创建一个JSON对象,至少指定所需的设置。

  1. name :区组的名称。必须填写。
  2. api_name :区组的 API 名称。可选。
  3. is_master :确定该区组是否为主区组。必须填写。note: 您只能有一个主区组。
  4. endpoints :区组中所有端点的列表。例如,您可以使用多个域名来引用同一个区组。记住要转过斜线 (\/)。您也可以为每个端点指定一个端口 (fqdn:port)。可选。
  5. hostnames :区组中所有主机名的列表。例如,您可以使用多个域名来引用同一区组。可选。rgw dns name 设置将自动包含在此列表中。更改此设置后,应重新启动网关守护程序。
  6. master_zone :区组的主区。可选。如果没有指定,则使用默认区 域。note: 每个区组只能有一个主区。
  7. zones :区组内所有区的列表。每个区域都有一个名称(必填)、一个端点列表(可选)以及网关是否会记录元数据和数据操作(默认为假)。
  8. placement_targets :一个放置目标的列表(可选)。每个放置目标都包含一个放置目标的名称(必填)和一个标签列表(可选),以便只有拥有该标签的用户才能使用该放置目标(即用户信息中的用户placement_tags 字段)。
  9. default_placement :对象索引和对象数据的默认放置目标。默认设置为default-placement 。你也可以在用户信息中为每个用户设置一个默认的放置目标。

要设置区组,请创建一个包含所需字段的 JSON 对象,并将该对象保存到文件中(例如,zonegroup.json ),然后执行以下命令。

# radosgw-admin zonegroup set --infile zonegroup.json

其中zonegroup.json 是你创建的JSON文件。

重要

default 区组is_master 设置默认为true 。如果您创建了一个新的区组并希望将其作为主区组,您必须将default 区组is_master 设置为false ,或者删除default 区组。

最后,更新时期。

# radosgw-admin period update --commit

5.8.2.10. 设置区组图

设置区组图包括创建一个由一个或多个区组组成的JSON对象,并为区组设置master_zonegroup 。区组图中的每个区组都由键/值对组成,其中key 设置相当于单个区组配置的name 设置,val 是由单个区组配置组成的 JSON 对象。

您只能有一个is_master 等于true 的区组,并且必须在区组地图的末尾指定master_zonegroup 。下面的 JSON 对象是默认的区组地图的一个例子。

{
    "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 文件。确保为区组图中指定的区创建了区。最后,更新周期。

# radosgw-admin period update --commit

5.8.3. 区位

Ceph Object Gateway支持区域的概念。一个区域定义了一个由一个或多个Ceph Object Gateway实例组成的逻辑组。

配置区与典型的配置程序不同,因为并非所有的设置都会在Ceph配置文件中完成。您可以列出区段,获取区段配置和设置区段配置。

重要

所有radosgw-admin zone 操作MUST ,都要在区内运行或将运行的主机上执行。

5.8.3.1. 创建一个区域

要创建一个区段,请指定区段名称。如果是主区,请指定--master 选项。一个区组中只能有一个区是主区。要将区块添加到区组中,请指定--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. 删除一个区

要删除zone,首先要将其从zoneegroup中删除。

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

然后,更新时期。

# radosgw-admin period update --commit

接下来,删除该区。

重要

此过程MUST ,在区内的主机上执行。

执行以下内容:

[root@zone]# radosgw-admin zone delete --rgw-zone<name>。

最后,更新时期。

# radosgw-admin period update --commit
重要

在未从区组中删除区段之前,请勿删除该区段。否则,更新周期将失败。

如果被删除区的池不会在其他地方使用,请考虑删除池。在下面的示例中,用已删除区段的名称代替<del-zone>

重要

一旦Ceph删除了区域池,就会以不可恢复的方式删除其中的所有数据。只有在Ceph客户端不再需要池内容时,才会删除区池。

重要

在多境界群集中,删除.rgw.root 池和区域池将删除群集的所有境界信息。在删除.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 ,要列出群集中的区域,请执行。

# radosgw-admin区域列表

5.8.3.5. 获得一个区域

root ,要获得一个区的配置,执行。

# radosgw-admin zone get [--rgw-zone=<zone>]

default 区是这样的。

{ "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对象网关池。为了保持一致性,我们建议使用与zone名称相同的池前缀。有关配置池的详细信息,请参见 Pools_。

重要

区域应该设置在Ceph对象网关节点上,该节点将在区域内。

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

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

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

然后,如root ,更新周期。

# 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. 区组和区组配置设置

配置默认的区组和区时,池名包括区名。举例来说,在配置默认的区组和区时,池名包括区名。

  • default.rgw.control

要更改默认值,请在每个[client.rgw.{instance-name}] 实例下的 Ceph 配置文件中包含以下设置。

名称说明种类默认

rgw_zone

网关实例的区域名称。

字符串

rgw_zonegroup

网关实例的区组名称。

字符串

rgw_zonegroup_root_pool

区组的根池。

字符串

.rgw.root

rgw_zone_root_pool

区块的根池。

字符串

.rgw.root

rgw_default_zone_group_info_oid

用于存储默认区组的 OID。我们不建议更改此设置。

字符串

default.zonegroup

rgw_num_zone_opstate_shards

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

整数

128

5.10. 使用多站点手动重装桶。

{存储产品}DOES NOT ,支持多站点集群的动态桶重新分区。您可以使用下面的过程来手动重新arding多站点集群中的 bucket。

手动重装是一个非常昂贵的过程,特别是对于巨大的桶,需要手动重装。每个辅助区都会删除所有的对象,然后从主区重新同步。

先决条件

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

流程

  1. 在主区组的主区内的节点上,执行以下命令。

    # radosgw-admin bucket sync disable --bucket= --bucket=BUCKET_NAME

    等到sync statusall zones ,报告数据同步到了最新。

  2. ALL 区停止ALL ceph-radosgw 守护进程。
  3. 在主区组的主区范围内的节点上,重新设置桶。例如:在主区组的主区内的一个节点上,重设桶。

    # radosgw-admin bucket reshard --bucket=BUCKET_NAME --num-shards=。NEW_SHARDS_NUMBER
  4. EACH 二级区,执行以下操作。

    # radosgw-admin bucket rm --purge-objects --bucket=。BUCKET_NAME
  5. ALL 区重启ALL ceph-radosgw 守护进程。
  6. 在主区组的主区内的节点上,执行以下命令。

    # radosgw-admin bucket sync enable --bucket=-------。BUCKET_NAME

元数据同步过程将获取更新的 bucket 入口点和 buck 实例元数据。数据同步过程将执行完全同步。

5.11. 配置多个区域而不复制

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

先决条件

  • 安装了Ceph对象网关的Ceph存储集群。

流程

  1. 创造一个境界。

    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. 创建一个区组。

    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. 获取包含区组配置的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_meta,log_data,sync_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. 更新时期。

    # radosgw-admin period update --commit

5.12. 在同一存储集群中配置多个领域。

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

注意

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

先决条件

  • 存储集群中每个数据中心的访问密钥和秘钥。
  • 一个存储集群中的两个运行{存储产品}数据中心。
  • 每个数据中心都有自己的本地领域。它们共享一个在两个站点上复制的境界。
  • 在 Ceph Object Gateway 节点上,执行《Ceph Object Gateway》中列出的任务。 Requirements for Installing Red Hat Ceph Storage{storage-product} Installation Guide
  • 对于每个Ceph对象网关节点,执行步骤1-7中的 Installing the Ceph Object Gateway {storage-product} Installation Guide 的部分。

流程

  1. 创建同步用户。

    语法

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

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

    语法

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

    例子

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

  3. 在第一个数据中心创建一个本地主区组。

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpointshttp://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 --endpointshttp://rgw.example.com。

  5. 承诺期。

    例子

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

  6. 更新ceph.conf ,用rgw_realmrgw_zonegrouprgw_zone 名称。

    语法

    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. 在第二个数据中心创建一个本地主区组。

    语法

    radosgw-admin zonegroup create --rgw-zonegroup=ZONE_GROUP_NAME --endpointshttp://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 --endpointshttp://rgw.example.com。

  11. 承诺期。

    例子

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

  12. 更新ceph.conf ,用rgw_realmrgw_zonegrouprgw_zone 名称。

    语法

    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="复制-同步用户" --系统

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

    语法

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

    例子

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

  16. 为第一个数据中心创建一个主区组。

    语法

    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. 在第一个数据中心创建一个主区。

    语法

    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 --endpointshttp://rgw.example.com。

  18. 承诺期。

    语法

    radosgw-admin period update --commit

  19. 更新ceph.conf ,第一个数据中心的名称为rgw_realmrgw_zonegrouprgw_zone

    语法

    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 --url17 --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8。

  22. 从第一个数据中心拉出期。

    语法

    radosgw-admin period pull --url=https://tower-osd1.cephtips.com --access-key=ACCESS_KEY --secret-key=。SECRET_KEY

    例子

    radosgw-admin period pull --url17 --access-key=3QV0D6ZMMCJZMSCXJ2QJ --secret-key=VpvQWcsfI9OPzUCpR4kynDLAbqa1OIKqRB6WEnH8。

  23. 在第二个数据中心创建辅助区。

    语法

    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. 更新ceph.conf ,将第二个数据中心的rgw_realmrgw_zonegrouprgw_zone 名称。

    语法

    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. 验证主位面的同步状态。

    语法

    radosgw-admin同步状态

    例子

    [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. 验证复制-同步领域的同步状态。

    语法

    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 arugument。