适用于 SUSE Enterprise Storage 5

11 Ceph Object Gateway

本章介绍对象网关相关管理任务的详细信息,例如,检查服务的状态,管理帐户、多站点网关或 LDAP 身份验证。

11.1 对象网关限制和命名限制

下面列出了对象网关的一些重要限制:

11.1.1 桶限制

通过 S3 API 访问对象网关时,桶名必须符合 DNS 且允许使用短划线字符“-”。当通过 Swift API 访问对象网关时,您可使用支持 UTF-8 的字符(斜杠字符“/”除外)的任何组合。桶名最多可包含 255 个字符。桶名必须唯一。

提示
提示:使用符合 DNS 的桶名

虽然通过 Swift API 访问时,可使用任何基于 UTF-8 的桶名,但仍建议您根据 S3 命名限制对桶命名,以免在通过 S3 API 访问同一个桶时发生问题。

11.1.2 存储的对象的限制

每个用户的对象数量上限

默认无限制(大约不超过 2^63)。

每个桶的对象数量上限

默认无限制(大约不超过 2^63)。

要上载/存储的对象的最大大小

单次上载的上限为 5GB。更大的对象可分为多个部分上载。多部分块的最大数量为 10000。

11.1.3 HTTP 报头限制

HTTP 报头和请求限制取决于所使用的 Web 前端。默认的 CivetWeb 限制 HTTP 报头数量最多为 64 个,HTTP 报头大小最大为 16kB。

11.2 部署对象网关

建议通过 DeepSea 基础结构来部署 Ceph Object Gateway,具体做法是在 Salt Master 上的 policy.cfg 文件中添加相关的 role-rgw [...] 行,并运行必要的 DeepSea 阶段。

11.3 操作对象网关服务

通过运行 systemctl 命令来操作对象网关服务。您需要拥有 root 特权才能操作对象网关服务。请注意,gateway_host 是您需要操作其对象网关实例的服务器的主机名。

对象网关服务支持以下子命令:

systemctl status ceph-radosgw@rgw.gateway_host

列显服务的状态信息。

systemctl start ceph-radosgw@rgw.gateway_host

如果服务尚未运行,则将它启动。

systemctl restart ceph-radosgw@rgw.gateway_host

重启动服务。

systemctl stop ceph-radosgw@rgw.gateway_host

停止正在运行的服务。

systemctl enable ceph-radosgw@rgw.gateway_host

启用服务,以便在系统启动时自动启动该服务。

systemctl disable ceph-radosgw@rgw.gateway_host

禁用服务,以便在系统启动时不自动启动该服务。

11.4 配置参数

ceph.conf 文件中指定大量选项可能会影响对象网关的行为。下面列出了最重要的选项。有关完整列表,请参见 http://docs.ceph.com/docs/master/radosgw/config-ref/

rgw_thread_pool_size

Civetweb 服务器的线程数。如果需要处理更多请求,请设置更高的值。默认为 100 个线程。

rgw_num_rados_handles

对象网关的 RADOS 集群句柄数(请参见 http://docs.ceph.com/docs/master/rados/api/librados-intro/#step-2-configuring-a-cluster-handle)。如果 RADOS 句柄数可配置,将可大幅提升所有类型的工作负载的性能。现在,每个对象网关工作线程都可以在其有效期内选取某个 RADOS 句柄。默认值是 1。

rgw_max_chunk_size

将在单个操作中读取的数据块的最大大小。将值增至 4MB (4194304) 可以在处理大型对象时提高性能。默认值为 128kB (131072)。

11.4.1 补充说明

rgw dns name

如果将参数 rgw dns name 添加到 ceph.conf,请确保已配置 S3 客户端,以定向 rgw dns name 所指定端点的请求。

11.5 管理对象网关的访问方式

您可以使用与 S3 或 Swift 兼容的接口来与对象网关通讯。S3 接口与大部分 Amazon S3 RESTful API 都兼容。Swift 接口与大部分 OpenStack Swift API 都兼容。

这两个接口都要求创建特定的用户,并安装相关的客户端软件,以使用该用户的机密密钥来与网关通讯。

11.5.1 访问对象网关

11.5.1.1 S3 接口访问

要访问 S3 接口,需要一个 REST 客户端。S3cmd 是一个命令行 S3 客户端。您可以在 OpenSUSE Build Service 中找到它。该储存库包含既适用于 SUSE Linux Enterprise 发行套件又适用于基于 openSUSE 的发行套件的版本。

如果您想测试自己是否能够访问 S3 接口,也可以编写一个简短的 Python 脚本。该脚本将连接到对象网关,创建新桶,并列出所有桶。aws_access_key_idaws_secret_access_key 的值取自第 11.5.2.1 节 “添加 S3 和 Swift 用户”中所述 radosgw_admin 命令返回的 access_keysecret_key 的值。

  1. 安装 python-boto 包:

    sudo zypper in python-boto
  2. 创建名为 s3test.py 的新 Python 脚本,并在其中包含以下内容:

    import boto
    import boto.s3.connection
    access_key = '11BS02LGFB6AL6H1ADMW'
    secret_key = 'vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY'
    conn = boto.connect_s3(
    aws_access_key_id = access_key,
    aws_secret_access_key = secret_key,
    host = '{hostname}',
    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,
      )

    {hostname} 替换为在其中配置了对象网关服务的主机的主机名,例如 gateway_host

  3. 运行脚本:

    python s3test.py

    该脚本将输出类似下方所示的信息:

    my-new-bucket 2015-07-22T15:37:42.000Z

11.5.1.2 Swift 接口访问

要通过 Swift 接口访问对象网关,需要使用 swift 命令行客户端。该接口的手册页 man 1 swift 介绍了有关其命令行选项的详细信息。

SUSE Linux Enterprise 12 SP3 的“Public Cloud”模块中包含了相应的包。在安装该包之前,需要激活该模块并刷新软件储存库:

sudo SUSEConnect -p sle-module-public-cloud/12/x86_64
sudo zypper refresh

要安装 swift 命令,请运行以下命令:

sudo zypper in python-swiftclient

使用以下语法进行 swift 访问:

swift -A http://IP_ADDRESS/auth/1.0 \
-U example_user:swift -K 'swift_secret_key' list

请将 IP_ADDRESS 替换为网关服务器的 IP 地址,将 swift_secret_key 替换为在第 11.5.2.1 节 “添加 S3 和 Swift 用户”中针对 swift 用户执行 radosgw-admin key create 命令后的输出中的相应值。

例如:

swift -A http://gateway.example.com/auth/1.0 -U example_user:swift \
-K 'r5wWIxjOCeEO7DixD1FjTLmNYIViaC6JVhi3013h' list

输出为:

my-new-bucket

11.5.2 管理 S3 和 Swift 帐户

11.5.2.1 添加 S3 和 Swift 用户

需要创建用户、访问钥和机密才能让最终用户与网关交互。用户分两种类型:用户子用户。与 S3 接口交互时使用用户子用户是 Swift 接口的用户。每个子用户都与某个用户相关联。

也可以通过 DeepSea 文件 rgw.sls 添加用户。有关示例,请参见第 14.3.1 节 “NFS Ganesha 的不同对象网关用户”

要创建 Swift 用户,请执行以下步骤:

  1. 要创建 Swift 用户(在我们的术语中称作子用户),需要先创建关联的用户

    sudo radosgw-admin user create --uid=username \
     --display-name="display-name" --email=email

    例如:

    sudo radosgw-admin user create \
       --uid=example_user \
       --display-name="Example User" \
       --email=penguin@example.com
  2. 要创建用户的子用户(用于 Swift 接口),必须指定用户 ID(--uid=username)、子用户 ID 和该子用户的访问级别。

    sudo radosgw-admin subuser create --uid=uid \
     --subuser=uid \
     --access=[ read | write | readwrite | full ]

    例如:

    sudo radosgw-admin subuser create --uid=example_user \
     --subuser=example_user:swift --access=full
  3. 为用户生成机密密钥。

    sudo radosgw-admin key create \
       --gen-secret \
       --subuser=example_user:swift \
       --key-type=swift
  4. 这两个命令都会输出 JSON 格式的数据,其中显示了用户状态。请注意以下几行,并记住 secret_key 值:

    "swift_keys": [
       { "user": "example_user:swift",
         "secret_key": "r5wWIxjOCeEO7DixD1FjTLmNYIViaC6JVhi3013h"}],

通过 S3 接口访问对象网关时,需要运行以下命令来创建 S3 用户:

sudo radosgw-admin user create --uid=username \
 --display-name="display-name" --email=email

例如:

sudo radosgw-admin user create \
   --uid=example_user \
   --display-name="Example User" \
   --email=penguin@example.com

该命令还会创建用户的访问钥和机密密钥。检查该命令输出中的 access_keysecret_key 关键字及其值:

[...]
 "keys": [
       { "user": "example_user",
         "access_key": "11BS02LGFB6AL6H1ADMW",
         "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}],
 [...]

11.5.2.2 删除 S3 和 Swift 用户

删除 S3 用户与删除 Swift 用户的过程类似。不过,在删除 Swift 用户时,您可能需要同时删除该用户及其子用户。

要删除 S3 或 Swift 用户(包括其所有子用户),请在以下命令中指定 user rm 和用户 ID:

sudo radosgw-admin user rm --uid=example_user

要删除子用户,请指定 subuser rm 和子用户 ID。

sudo radosgw-admin subuser rm --uid=example_user:swift

可使用以下选项:

--purge-data

清除与该用户 ID 关联的所有数据。

--purge-keys

清除与该用户 ID 关联的所有密钥。

提示
提示:删除子用户

删除某个子用户时,删除的是其对 Swift 接口的访问权限。该用户仍会保留在系统中。

11.5.2.3 更改 S3 和 Swift 用户的访问钥与机密密钥

访问网关时,access_keysecret_key 参数用于标识对象网关用户。更改现有用户密钥的过程与创建新用户密钥的过程相同,旧密钥将被重写。

对于 S3 用户,请运行以下命令:

sudo radosgw-admin key create --uid=example_user --key-type=s3 --gen-access-key --gen-secret

对于 Swift 用户,请运行以下命令:

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

指定密钥的类型。值为 swifts3

--gen-access-key

生成随机访问钥(默认针对 S3 用户)。

--gen-secret

生成随机机密密钥。

--secret=key

指定机密密钥,例如手动生成的密钥。

11.5.2.4 用户配额管理

Ceph Object Gateway 允许您针对用户以及用户拥有的桶设置配额。配额包括一个桶中的最大对象数,以及最大存储大小 (MB)。

在启用用户配额之前,需要先设置该配额的参数:

sudo radosgw-admin quota set --quota-scope=user --uid=example_user \
 --max-objects=1024 --max-size=1024
--max-objects

指定最大对象数。指定负值会禁用检查。

--max-size

指定最大字节数。指定负值会禁用检查。

--quota-scope

设置配额的范围。选项包括 bucketuser。桶配额将应用到用户拥有的桶。用户配额将应用到用户。

设置用户配额后,可启用该配额:

sudo radosgw-admin quota enable --quota-scope=user --uid=example_user

要禁用配额,请执行以下命令:

sudo radosgw-admin quota disable --quota-scope=user --uid=example_user

要列出配额设置,请执行以下命令:

sudo radosgw-admin user info --uid=example_user

要更新配额统计数字,请执行以下命令:

sudo radosgw-admin user stats --uid=example_user --sync-stats

11.6 为对象网关启用 HTTPS/SSL

要让默认对象网关角色可使用 SSL 进行安全通讯,您需要拥有 CA 颁发的证书,或创建自我签名证书。为对象网关启用 HTTPS 的配置方法有两种,简单的方法是使用默认设置,高级方法可以微调 HTTPS 相关设置。

11.6.1 创建自我签名证书

提示
提示

如果您已拥有 CA 签名的有效证书,请跳过本节。

默认情况下,DeepSea 预期证书文件位于 Salt Master 的 /srv/salt/ceph/rgw/cert/rgw.pem 下。它会将证书分发到具有对象网关角色的 Salt Minion 的 /etc/ceph/rgw.pem 下,以便 Ceph 读取。

以下过程说明如何在 Salt Master 节点上生成自我签名的 SSL 证书。

  1. /etc/ssl/openssl.cnf 文件的 [v3_req] 段落,为您想向其宣告对象网关的所有主机名添加 subjectAltName 选项:

    [...]
    [ v3_req ]
    subjectAltName = ${ENV::SAN}
    [...]
  2. 使用 openssl 创建密钥和证书。在 openssl 前加上 env SAN=DNS:fqdn 前缀。输入需要包含在证书中的所有数据。建议您输入 FQDN 作为常用名。对证书签名前,确认“X509v3 Subject Alternative Name:”包含在请求的扩展中,并且生成的证书中设置了“X509v3 Subject Alternative Name:”。

    root@master # env SAN=DNS:fqdn openssl req -x509 -nodes -days 1095 \
     -newkey rsa:4096 -keyout rgw.key -out /srv/salt/ceph/rgw/cert/rgw.pem

11.6.2 简单的 HTTPS 配置

默认情况下,对象网关节点上的 Ceph 会读取 /etc/ceph/rgw.pem 证书,并使用端口 443 进行 SSL 安全通讯。如果您不需要更改这些值,请执行以下步骤:

  1. 编辑 /srv/pillar/ceph/stack/global.yml,添加下行:

    rgw_configurations: rgw-ssl
    rgw_init: default-ssl
  2. 运行 DeepSea 阶段 2、3、和 4 以应用这些更改:

    root@master # salt-run state.orch ceph.stage.2
    root@master # salt-run state.orch ceph.stage.3
    root@master # salt-run state.orch ceph.stage.4

11.6.3 高级 HTTPS 配置

如果您需要更改对象网关 SSL 设置的默认值,请执行以下步骤:

  1. 将默认对象网关 SSL 配置复制到 ceph.conf.d 子目录:

    root@master # cp /srv/salt/ceph/configuration/files/rgw-ssl.conf \
     /srv/salt/ceph/configuration/files/ceph.conf.d/rgw.conf
  2. 编辑 /srv/salt/ceph/configuration/files/ceph.conf.d/rgw.conf,更改默认选项,例如端口号或 SSL 证书路径,以反映您的设置。

  3. 运行 DeepSea 阶段 3 和 4 以应用这些更改:

    root@master # salt-run state.orch ceph.stage.3
    root@master # salt-run state.orch ceph.stage.4
提示
提示:绑定到多个端口

Civetweb 服务器可以绑定到多个端口。如果您需要使用 SSL 和非 SSL 两种连接来访问单个对象网关实例,这种做法将非常实用。指定多个端口时,请使用加号“+”分隔端口号。两个端口的配置行如下所示:

[client.{{ client }}]
rgw_frontends = civetweb port=80+443s ssl_certificate=/etc/ceph/rgw.pem

11.7 同步模块

使用 Jewel 中引入的对象网关多站点功能可以创建多个区域,并在这些区域之间镜像数据和元数据。同步模块构建在多站点框架的基础上,可将数据和元数据转发到不同的外部层。每当发生数据更改(创建桶或用户等元数据操作也视为数据更改)时,可以通过同步模块执行一系列操作。随着 rgw 多站点更改最终在远程站点上保持一致,更改将以异步方式传播。因而很多情况下都适合使用同步模块,例如,将对象存储备份到外部云集群或使用磁带机的自定义备份解决方案、在 Elasticsearch 中为元数据编制索引,等等。

11.7.1 同步区域

同步模块的配置位于区域本地。同步模块会确定区域是要导出数据,还是只能使用已在另一区域中修改的数据。从 Luminous 版本开始,支持的同步插件包括 elasticsearchrgwlog,其中 rgw 是在区域之间同步数据的默认同步插件,log 是记录远程区域中发生的元数据操作的普通同步插件。以下各节内容包含了使用 elasticsearch 同步模块的区域示例。其过程与配置任何其他同步插件的过程都类似。

注意
注意:默认同步插件

rgw 是默认的同步插件,不需要对此进行显式配置。

11.7.1.1 要求和假设

我们假设已根据第 11.11 节 “多站点对象网关”中所述创建了一个简单的多站点配置,它由 us-eastus-west 这两个区域组成。现在,我们添加第三个区域 us-east-es,此区域只处理来自其他站点的元数据。此区域可与 us-east 位于同一 Ceph 集群中,也可位于不同的集群中。此区域只使用来自其他区域的元数据,此区域中的对象网关不会直接处理任何最终用户请求。

11.7.1.2 配置同步模块

  1. 创建类似于第 11.11 节 “多站点对象网关”中所述区域的第三个区域,例如

    root # radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east-es \
    --access-key={system-key} --secret={secret} --endpoints=http://rgw-es:80
  2. 可通过以下命令配置此区域的同步模块

    root # radosgw-admin zone modify --rgw-zone={zone-name} --tier-type={tier-type} \
    --tier-config={set of key=value pairs}
  3. 例如,在 elasticsearch 同步模块中运行以下命令

    root # radosgw-admin zone modify --rgw-zone={zone-name} --tier-type=elasticsearch \
    --tier-config=endpoint=http://localhost:9200,num_shards=10,num_replicas=1

    有关支持的各个 tier-config 选项,请参见第 11.7.2 节 “在 Elasticsearch 中存储元数据”

  4. 最后,更新周期

    root # radosgw-admin period update --commit
  5. 现在,在区域中启动 radosgw

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

11.7.2 在 Elasticsearch 中存储元数据

此同步模块会将来自其他区域的元数据写入 Elasticsearch。从 Luminous 版本开始,我们当前存储在 Elasticsearch 中的是数据字段的 JSON。

{
  "_index" : "rgw-gold-ee5863d6",
  "_type" : "object",
  "_id" : "34137443-8592-48d9-8ca7-160255d52ade.34137.1:object1:null",
  "_score" : 1.0,
  "_source" : {
    "bucket" : "testbucket123",
    "name" : "object1",
    "instance" : "null",
    "versioned_epoch" : 0,
    "owner" : {
      "id" : "user1",
      "display_name" : "user1"
    },
    "permissions" : [
      "user1"
    ],
    "meta" : {
      "size" : 712354,
      "mtime" : "2017-05-04T12:54:16.462Z",
      "etag" : "7ac66c0f148de9519b8bd264312c4d64"
    }
  }
}

11.7.2.1 Elasticsearch 层类型配置参数

endpoint

指定要访问的 Elasticsearch 服务器端点。

num_shards

(整数)数据同步初始化时将为 Elasticsearch 配置的分片数量。请注意,初始化之后将无法更改此数量。在此处进行任何更改都需要重构建 Elasticsearch 索引,并需要重新初始化数据同步进程。

num_replicas

(整数)数据同步初始化时为 Elasticsearch 配置的副本数量。

explicit_custom_meta

(true | false) 指定是否将为所有用户自定义元数据编制索引,或者用户是否需要(在桶级别)配置应为哪些客户元数据项编制索引。此参数默认为 false

index_buckets_list

(逗号分隔的字符串列表)如果为空,则为所有桶编制索引。否则,只为此处指定的桶编制索引。可以提供桶前缀(例如“foo*”)或桶后缀(例如“*bar”)。

approved_owners_list

(逗号分隔的字符串列表)如果为空,将为所有所有者的桶编制索引(需遵守其他限制);否则,将只为指定所有者拥有的桶编制索引。也可以提供后缀和前缀。

override_index_path

(字符串)如果非空,则此字符串将用作 Elasticsearch 索引路径。否则,将在同步初始化时确定并生成索引路径。

11.7.2.2 元数据查询

由于 Elasticsearch 集群现在存储对象元数据,因此务必确保 Elasticsearch 端点不会向公众公开,只有集群管理员可访问它们。向最终用户自己公开元数据查询会造成问题,因为我们希望该用户只查询自己的元数据,而不能查询任何其他用户的元数据,这就要求 Elasticsearch 集群像 RGW 所做的那样来对用户进行身份验证,而这就导致了问题发生。

从 Luminous 版本开始,元数据主区域中的 RGW 可处理最终用户请求。这样就无需向公众公开 Elasticsearch 端点,同时也解决了身份验证和授权问题,因为 RGW 本身就能对最终用户请求进行身份验证。出于此目的,RGW 在桶 API 中引入了可处理 Elasticsearch 请求的新查询。所有这些请求必须发送到元数据主区域。

获取 Elasticsearch 查询
GET /BUCKET?query={query-expr}

请求参数:

  • max-keys:要返回的最大项数

  • marker:分页标识

expression := [(]<arg> <op> <value> [)][<and|or> ...]

运算符为下列其中一项:<、<=、==、>=、>

例如:

GET /?query=name==foo

将返回用户有权读取且名为“foo”的所有带索引键。输出内容将是 XML 格式的键列表,与 S3 的“列出桶”请求的响应类似。

配置自定义元数据字段

定义应该(在指定的桶中)为哪些自定义元数据项编制索引,以及这些键的类型是什么。如果配置了显式自定义元数据索引,则需要此定义,以便 rgw 为指定的自定义元数据值编制索引。如果未配置,在带索引元数据键的类型不是字符串的情况下,也需要此定义。

POST /BUCKET?mdsearch
x-amz-meta-search: <key [; type]> [, ...]

多个元数据字段必须用逗号加以分隔,可以使用分号“;”强制指定字段的类型。当前允许的类型包括字符串(默认值)、整数和日期。例如,如果您想将自定义对象元数据 x-amz-meta-year、x-amz-meta-date 和 x-amz-meta-title 的索引分别指定为整数、日期和字符串类型,可执行以下命令

POST /mybooks?mdsearch
x-amz-meta-search: x-amz-meta-year;int, x-amz-meta-release-date;date, x-amz-meta-title;string
删除自定义元数据配置

删除自定义元数据桶配置。

DELETE /BUCKET?mdsearch
获取自定义元数据配置

检索自定义元数据桶配置。

GET /BUCKET?mdsearch

11.8 LDAP 身份验证

除了默认的本地用户身份验证以外,对象网关还能利用 LDAP 服务器服务来对用户进行身份验证。

11.8.1 身份验证机制

对象网关从令牌提取用户的 LDAP 身份凭证。可以基于用户名构造搜索过滤器。对象网关使用配置的服务帐户在目录中搜索匹配的项。如果找到了某个项,对象网关会尝试使用令牌中的密码绑定到所找到的判别名。如果身份凭证有效,绑定将会成功,并且对象网关会授予访问权限。

您可以通过将搜索范围设置为特定的组织单位,或者指定自定义搜索过滤器(例如,要求特定的组成员资格、自定义对象类或属性),来限制允许的用户。

11.8.2 要求

  • LDAP 或 Active Directory:对象网关可访问的运行中 LDAP 实例。

  • 服务帐户:对象网关要使用且拥有搜索权限的 LDAP 身份凭证。

  • 用户帐户:LDAP 目录中的至少一个用户帐户。

重要
重要:LDAP 用户和本地用户不能重叠

不得对本地用户以及要使用 LDAP 进行身份验证的用户使用相同的用户名。对象网关无法区分两者,会将它们视为同一个用户。

提示
提示:健康检查

使用 ldapsearch 实用程序可校验服务帐户或 LDAP 连接。例如:

ldapsearch -x -D "uid=ceph,ou=system,dc=example,dc=com" -W \
-H ldaps://example.com -b "ou=users,dc=example,dc=com" 'uid=*' dn

请务必在 Ceph 配置文件中使用相同的 LDAP 参数,以杜绝可能的问题。

11.8.3 将对象网关配置为使用 LDAP 身份验证

/etc/ceph/ceph.conf 配置文件中的以下参数与 LDAP 身份验证相关:

rgw_ldap_uri

指定要使用的 LDAP 服务器。请务必使用 ldaps://fqdn:端口参数,以免公开传输明文身份凭证。

rgw_ldap_binddn

对象网关使用的服务帐户的判别名 (DN)。

rgw_ldap_secret

服务帐户的密码。

rgw_ldap_searchdn

指定在目录信息树中搜索用户的范围,可以是用户的组织单位,或某个更具体的组织单位 (OU)。

rgw_ldap_dnattr

在构造的搜索过滤器中用来匹配用户名的属性。根据所用的目录信息树 (DIT),可能会是 uidcn

rgw_search_filter

如果未指定,则对象网关会使用 rgw_ldap_dnattr 设置自动构造搜索过滤器。使用此参数能非常灵活地缩小所允许用户列表的范围。有关详细信息,请参见第 11.8.4 节 “使用自定义搜索过滤器来限制用户访问权限”

11.8.4 使用自定义搜索过滤器来限制用户访问权限

可通过两种方式使用 rgw_search_filter 参数。

11.8.4.1 用于进一步限制所构造搜索过滤器的部分过滤器

部分过滤器的示例:

"objectclass=inetorgperson"

对象网关将照常使用令牌中的用户名和 rgw_ldap_dnattr 的值生成搜索过滤器。然后,构造的过滤器将与 rgw_search_filter 属性中的部分过滤器合并。根据所用的用户名和设置,最终的搜索过滤器可能会变成:

"(&(uid=hari)(objectclass=inetorgperson))"

在这种情况下,仅当在 LDAP 目录中找到了用户“hari”,该用户具有对象类“inetorgperson”并且确实指定了有效密码时,才向他授予访问权限。

11.8.4.2 完整过滤器

完整过滤器必须包含 USERNAME 令牌,在尝试身份验证期间,该令牌将替换为用户名。在这种情况下,不再使用 rgw_ldap_dnattr 参数。例如,要将有效用户限制为特定的组,可使用以下过滤器:

"(&(uid=USERNAME)(memberOf=cn=ceph-users,ou=groups,dc=mycompany,dc=com))"
注意
注意:memberOf 属性

在 LDAP 搜索中使用 memberOf 属性需要您实施的特定 LDAP 服务器提供服务器端支持。

11.8.5 生成用于 LDAP 身份验证的访问令牌

radosgw-token 实用程序基于 LDAP 用户名和密码生成访问令牌。它会输出 base-64 编码字符串,即实际的访问令牌。请使用偏好的 S3 客户端(请参见第 11.5.1 节 “访问对象网关”),将该令牌指定为访问钥,并使用空机密密钥。

root@minion > export RGW_ACCESS_KEY_ID="username"
root@minion > export RGW_SECRET_ACCESS_KEY="password"
root@minion > radosgw-token --encode --ttype=ldap
重要
重要:明文身份凭证

访问令牌是一个 base-64 编码的 JSON 结构,包含明文形式的 LDAP 身份凭证。

注意
注意:Active Directory

对于 Active Directory,请使用 --ttype=ad 参数。

11.9 桶索引分片

对象网关在索引池中存储桶索引数据,该池默认为 .rgw.buckets.index。如果将太多(成百上千个)对象放入单个桶中,并且不设置每个桶的最大对象数量配额 (rgw bucket default quota max objects),索引池的性能可能会下降。桶索引分片可在允许每个桶中放入大量对象的同时,防止出现此类性能下降的情况。

11.9.1 桶索引重分片

如果随着桶的增大,其初始配置不再能满足需求,则需要对桶的索引池进行重分片。您可以使用自动联机桶索引重分片(请参见第 11.9.1.1 节 “动态重分片”),也可以手动脱机执行桶索引重分片(请参见第 11.9.1.2 节 “手动重分片”)。

11.9.1.1 动态重分片

从 SUSE Enterprise Storage 5 开始,我们支持联机桶重分片。此功能会检测每个桶的对象数量是否达到某个阈值,如果达到,则会相应地自动增加桶索引使用的分片数量。此进程会减少每个桶索引分片中的条目数。

该检测进程在以下情况和环境中运行:

  • 当有新的对象添加到桶中时。

  • 在定期扫描所有桶的后台进程中。扫描的目的是为了处理未在更新的现有桶。

需要重分片的桶将会添加到 reshard_log 队列,且将安排于稍后进行重分片。重分片线程在后台运行,将逐个执行已安排的重分片。

配置动态重分片
rgw_dynamic_resharding

启用或禁用动态桶索引重分片。可用的值为“true”或“false”。默认设为“true”。

rgw_reshard_num_logs

重分片日志的分片数。默认设为 16。

rgw_reshard_bucket_lock_duration

重分片期间将桶对象锁定的时长。默认设为 120 秒。

rgw_max_objs_per_shard

每个桶索引分片的最大对象数。默认设为 100000 个对象。

rgw_reshard_thread_interval

两轮重分片线程处理间隔的最长时间。默认设为 600 秒。

重要
重要:多站点配置

多站点环境下不支持动态重分片。从 Ceph 12.2.2 起默认会禁用该功能,但建议您再次检查此设置。

用于管理重分片进程的命令
将桶添加到重分片队列:
root@minion > radosgw-admin reshard add \
 --bucket BUCKET_NAME \
 --num-shards NEW_NUMBER_OF_SHARDS
列出重分片队列:
root@minion > radosgw-admin reshard list
处理/安排桶重分片:
root@minion > radosgw-admin reshard process
显示桶重分片状态:
root@minion > radosgw-admin reshard status --bucket BUCKET_NAME
取消待处理的桶重分片:
root@minion > radosgw-admin reshard cancel --bucket BUCKET_NAME

11.9.1.2 手动重分片

第 11.9.1.1 节 “动态重分片”中所述的动态重分片仅适用于简单对象网关配置。对于多站点配置,请使用本节中所述的手动重分片。

要手动对桶索引执行脱机重分片,请使用以下命令:

root@minion > radosgw-admin bucket reshard

bucket reshard 命令执行以下操作:

  • 为指定对象创建一组新的桶索引对象。

  • 分散这些索引对象的所有对象条目。

  • 创建新的桶实例。

  • 列出新的桶实例以及桶,以便所有新的索引操作都能够应用到新的桶索引。

  • 将旧的和新的桶 ID 打印到标准输出。

过程 11.1︰ 将桶索引池重分片
  1. 确保对桶执行的所有操作都已停止。

  2. 备份原始桶索引:

    root@minion > radosgw-admin bi list \
     --bucket=BUCKET_NAME \
     > BUCKET_NAME.list.backup
  3. 对桶索引重分片:

     root@minion > radosgw-admin reshard \
     --bucket=BUCKET_NAME \
     --num-shards=NEW_SHARDS_NUMBER
    提示
    提示:旧桶 ID

    此命令还会将新的和旧的桶 ID 打印到其输出中。请记下旧桶 ID,清除旧的桶索引对象时需要用到它。

  4. 将旧桶索引列表与新桶索引列表进行比较,校验列出的对象是否正确。然后,清除旧的桶索引对象:

    root@minion > radosgw-admin bi purge
     --bucket=BUCKET_NAME
     --bucket-id=OLD_BUCKET_ID

11.9.2 新桶的桶索引分片

有两个选项会影响桶索引分片:

  • 对于简单配置,请使用 rgw_override_bucket_index_max_shards 选项。

  • 对于多站点配置,请使用 bucket_index_max_shards 选项。

将选项设为 0 将禁用桶索引分片。如果将其设为大于 0 的值,则会启用桶索引分片,并设置最大分片数。

下面的公式可帮助您计算建议的分片数:

number_of_objects_expected_in_a_bucket / 100000

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

11.9.2.1 简单配置

  1. 打开 Ceph 配置文件,然后添加或修改以下选项:

    rgw_override_bucket_index_max_shards = 12
    提示
    提示:所有或一个对象网关实例

    要为对象网关的所有实例配置桶索引分片,请将 rgw_override_bucket_index_max_shards 添加到 [global] 段落。

    要仅为对象网关的某个特定实例配置桶索引分片,请将 rgw_override_bucket_index_max_shards 添加到相关实例段落。

  2. 重启动对象网关。有关详细信息,请参见第 11.3 节 “操作对象网关服务”

11.9.2.2 多站点配置

多站点配置可使用另一个索引池来管理故障转移。要为一个区域组内的区域配置一致的分片数量,请在该区域组的配置中设置 bucket_index_max_shards 选项:

  1. 将区域组配置导出到 zonegroup.json 文件中:

    root@minion > radosgw-admin zonegroup get > zonegroup.json
  2. 编辑 zonegroup.json 文件,为每个指定的区域设置 bucket_index_max_shards 选项。

  3. 重设置区域组:

    root@minion > radosgw-admin zonegroup set < zonegroup.json
  4. 更新周期:

    root@minion > radosgw-admin period update --commit

11.10 集成 OpenStack Keystone

OpenStack Keystone 是一项用于 OpenStack 产品的身份服务。您可以将对象网关与 Keystone 相集成,以设置接受 Keystone 身份验证令牌的网关。Ceph Object Gateway 端将会对 Keystone 授权可访问网关的用户进行校验,并视需要自动创建用户。对象网关会定期查询 Keystone,以获取已撤消令牌列表。

11.10.1 配置 OpenStack

配置 Ceph Object Gateway 前,需要先配置 OpenStack Keystone 以启用 Swift 服务,并将其指向 Ceph Object Gateway:

  1. 设置 Swift 服务。要使用 OpenStack 来验证 Swift 用户,请先创建 Swift 服务:

    root # openstack service create \
     --name=swift \
     --description="Swift Service" \
     object-store
  2. 设置端点。创建 Swift 服务后,指向 Ceph Object Gateway。用网关的区域组名或区域名称替换 REGION_NAME

    root # openstack endpoint create --region REGION_NAME \
     --publicurl   "http://radosgw.example.com:8080/swift/v1" \
     --adminurl    "http://radosgw.example.com:8080/swift/v1" \
     --internalurl "http://radosgw.example.com:8080/swift/v1" \
     swift
  3. 校验这些设置。创建 Swift 服务并设置端点后,显示端点以确认所有设置正确无误。

    root # openstack endpoint show object-store

11.10.2 配置 Ceph Object Gateway

11.10.2.1 配置 SSL 证书

Ceph Object Gateway 会定期查询 Keystone,以获取已撤消令牌列表。这些请求会被编码并签名。还可配置 Keystone 以提供自我签名令牌,这些令牌同样经过编码和签名。您需要配置网关以便其可以解码并校验这些已签名讯息。因此,需要将 Keystone 用于创建请求的 OpenSSL 证书转换为“nss db”格式:

root # mkdir /var/ceph/nss
root # openssl x509 -in /etc/keystone/ssl/certs/ca.pem \
 -pubkey | certutil -d /var/ceph/nss -A -n ca -t "TCu,Cu,Tuw"
rootopenssl x509 -in /etc/keystone/ssl/certs/signing_cert.pem \
 -pubkey | certutil -A -d /var/ceph/nss -n signing_cert -t "P,P,P"

还可以使用自我签名的 SSL 证书终止 OpenStack Keystone,以便让 Ceph Object Gateway 与 Keystone 交互。可在运行 Ceph Object Gateway 的节点上安装 Keystone 的 SSL 证书,也可以将选项 rgw keystone verify ssl 的值设为“false”。将 rgw keystone verify ssl 设为“false”意味着网关将不会尝试校验证书。

11.10.2.2 配置对象网关的选项

您可以使用以下选项配置 Keystone 集成:

rgw keystone api version

Keystone API 的版本。有效选项为 2 或 3。默认设为 2。

rgw keystone url

Keystone 服务器上的管理 RESTful API 的 URL 和端口号。采用 SERVER_URL:PORT_NUMBER 模式。

rgw keystone admin token

在 Keystone 内部为管理请求配置的令牌或共享密钥。

rgw keystone accepted roles

处理请求需要具有的角色。默认设为“Member, admin”。

rgw keystone accepted admin roles

允许用户获取管理特权的角色列表。

rgw keystone token cache size

Keystone 令牌快速缓存中的最大条目数。

rgw keystone revocation interval

检查已撤消令牌前间隔的秒数。默认设为 15 * 60。

rgw keystone implicit tenants

在各自的同名租户中创建新用户。默认设为“false”。

rgw s3 auth use keystone

如果设为“true”,Ceph Object Gateway 将使用 Keystone 对用户进行身份验证。默认设为“false”。

nss db path

NSS 数据库的路径。

还可以配置 Keystone 服务租户、Keystone 的用户和密码(适用于 OpenStack Identity API 2.0 版本),配置方法与配置 OpenStack 服务的方法类似。使用此方法可避免在配置文件中设置共享密钥 rgw keystone admin token,生产环境中应禁用该共享机密。服务租户身份凭证应拥有管理员特权,有关详细信息,请参见 OpenStack Keystone 官方文档。相关配置选项如下:

rgw keystone admin user

Keystone 管理员用户名。

rgw keystone admin password

Keystone 管理员用户密码。

rgw keystone admin tenant

Keystone 2.0 版管理员用户租户。

Ceph Object Gateway 用户与 Keystone 租户一一映射。系统会为一个 Keystone 用户指定不同的角色,这些角色可能分布在不止一个租户上。当 Ceph Object Gateway 收到票据时,会查看为该票据指定的租户和用户角色,并根据 rgw keystone accepted roles 选项的设置接受或拒绝请求。

提示
提示:映射到 OpenStack 租户

虽然 Swift 租户默认会映射到对象网关用户,但也可通过 rgw keystone implicit tenants 选项将其映射到 OpenStack 租户。如此会让容器使用租户名称空间,而不是对象网关默认采用的 S3 之类的全局名称空间。建议在规划阶段就决定好映射方法,以免产生混淆。这是因为以后切换选项只会影响租户下所映射的较新请求,而先前创建的旧桶仍将继续放在全局名称空间中。

对于 OpenStack Identity API 3 版本,您应使用以下选项替换 rgw keystone admin tenant 选项:

rgw keystone admin domain

Keystone 管理员用户域。

rgw keystone admin project

Keystone 管理员用户项目。

11.11 多站点对象网关

区域

一个或多个对象网关实例的逻辑分组。必须将区域组中的一个区域指定为区域,负责处理所有桶和用户的创建。

区域组

一个区域组由多个区域组成。应设置一个将负责处理系统配置更改的主区域组。

区域组地图

用于存放整个系统地图的配置结构,例如,哪个区域组是主区域组、不同区域组之间的关系,以及存储策略等特定配置选项。

领域

容纳区域组的容器。使用领域可在集群之间分隔区域组。可以创建多个领域,以便在同一集群中更轻松地运行完全不同的配置。

周期

周期存放领域当前状态的配置结构。每个周期都包含一个唯一 ID 和一个版本号。每个领域都有一个关联的当前周期,存放区域组配置的当前状态和存储策略。非主区域发生任何配置更改都会使周期的版本号递增。将主区域更改为其他区域会触发以下更改:

  • 生成具有新周期 ID 和版本号为 1 的新周期。

  • 领域的当前周期会更新,以指向新生成的周期 ID。

  • 领域的版本号将会递增。

您可将每个对象网关配置为参与联合体系结构,在活动区域配置中工作,同时允许写入非主区域。

11.11.1 术语

下面解释了联合体系结构的专用术语:

11.11.2 示例集群设置

本示例重点说明如何创建包含三个不同区域的单个区域组,这三个区域会主动同步其数据。其中两个区域属于同一集群,第三个区域属于其他集群。在对象网关之间镜像数据更改时,不需要同步代理的参与。如此可大大简化配置模式和主动/主动配置。请注意,元数据操作(例如创建新用户)仍需要通过主区域处理。但是,数据操作(例如创建桶和对象)可由任意区域处理。

11.11.3 系统密钥

对象网关需要您在配置区域时创建与 S3 兼容的系统用户,以及他们的访问钥和机密密钥。这样,另一个对象网关实例便可以使用该访问钥和机密密钥远程提取配置。有关创建 S3 用户的详细信息,请参见第 11.5.2.1 节 “添加 S3 和 Swift 用户”

提示
提示

在创建区域本身之前生成访问钥和机密密钥的做法非常实用,因为这可以让稍后的脚本编写和配置管理工具的使用变得更容易。

对于本示例,我们假设已在环境变量中设置访问钥和机密密钥:

# SYSTEM_ACCESS_KEY=1555b35654ad1656d805
# SYSTEM_SECRET_KEY=h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==

一般情况下,访问钥包含 20 个字母数字字符,而机密密钥包含 40 个字母数字字符(也可以包含 +/= 字符)。可在命令行中生成这些密钥:

# SYSTEM_ACCESS_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1)
# SYSTEM_SECRET_KEY=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 1)

11.11.4 命名约定

本示例介绍设置主区域的过程。我们假设有一个名为 us 的区域组,该区域组横跨美国,将作为我们的主区域组。该区域组将包含以区域组-区域格式编写的两个区域。这只是我们一贯采用的格式,您可以选择偏好的格式。概括如下:

  • 主区域组:美国:us

  • 主区域:美国东部区域 1:us-east-1

  • 次要区域:美国东部区域 2:us-east-2

  • 次要区域:美国西部区域:us-west

此配置将属于名为 gold 的较大领域。us-east-1us-east-2 区域属于同一个 Ceph 集群,us-east-1 是主区域。us-west 在另一个不同的 Ceph 集群中。

11.11.5 默认存储池

为对象网关配置了相应的权限后,它便可自行创建默认存储池。pg_numpgp_num 值取自 ceph.conf 配置文件。默认情况下,与区域相关的存储池遵循区域名称.存储池名称格式约定。以 us-east-1 区域为例,它将创建以下存储池:

.rgw.root
us-east-1.rgw.control
us-east-1.rgw.data.root
us-east-1.rgw.gc
us-east-1.rgw.log
us-east-1.rgw.intent-log
us-east-1.rgw.usage
us-east-1.rgw.users.keys
us-east-1.rgw.users.email
us-east-1.rgw.users.swift
us-east-1.rgw.users.uid
us-east-1.rgw.buckets.index
us-east-1.rgw.buckets.data
us-east-1.rgw.meta

也可以在其他区域中创建这些存储池,只需将 us-east-1 替换为相应的区域名称即可。

11.11.6 创建领域

配置名为 gold 的领域,并将其设为默认领域:

cephadm > radosgw-admin realm create --rgw-realm=gold --default
{
  "id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "name": "gold",
  "current_period": "09559832-67a4-4101-8b3f-10dfcd6b2707",
  "epoch": 1
}

请注意,每个领域都有一个 ID,这样,以后便可灵活地执行所需的操作(例如,重命名领域)。每当我们更改主区域中的任何设置时,current_period 都会发生变化。如果主区域的配置发生更改,导致当前周期发生更改,epoch 将会递增。

11.11.7 删除默认区域组

采用默认设置安装对象网关时会创建名为 default 的默认区域组。由于我们不再需要默认区域组,因此将其删除。

cephadm > radosgw-admin zonegroup delete --rgw-zonegroup=default

11.11.8 创建主区域组

创建名为 us 的主区域组。该区域组将管理区域组地图,并将更改传播到系统的其余组件。通过将某个区域组标记为默认区域组,可以明确指定要在后续命令中使用的 rgw-zonegroup 开关。

cephadm > radosgw-admin zonegroup create --rgw-zonegroup=us \
--endpoints=http://rgw1:80 --master --default
{
  "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
  "name": "us",
  "api_name": "us",
  "is_master": "true",
  "endpoints": [
      "http:\/\/rgw1:80"
  ],
  "hostnames": [],
  "hostnames_s3website": [],
  "master_zone": "",
  "zones": [],
  "placement_targets": [],
  "default_placement": "",
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}

或者,可使用以下命令将某个区域组标记为默认区域组:

cephadm > radosgw-admin zonegroup default --rgw-zonegroup=us

11.11.9 创建主区域

现在,请创建一个默认区域并将其添加到默认区域组。请注意,您在执行元数据操作(例如创建用户)时将会用到此区域:

cephadm > radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-east-1 \
--endpoints=http://rgw1:80 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
  "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
  "name": "us-east-1",
  "domain_root": "us-east-1/gc.rgw.data.root",
  "control_pool": "us-east-1/gc.rgw.control",
  "gc_pool": "us-east-1/gc.rgw.gc",
  "log_pool": "us-east-1/gc.rgw.log",
  "intent_log_pool": "us-east-1/gc.rgw.intent-log",
  "usage_log_pool": "us-east-1/gc.rgw.usage",
  "user_keys_pool": "us-east-1/gc.rgw.users.keys",
  "user_email_pool": "us-east-1/gc.rgw.users.email",
  "user_swift_pool": "us-east-1/gc.rgw.users.swift",
  "user_uid_pool": "us-east-1/gc.rgw.users.uid",
  "system_key": {
      "access_key": "1555b35654ad1656d804",
      "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
  },
  "placement_pools": [
      {
          "key": "default-placement",
          "val": {
              "index_pool": "us-east-1/gc.rgw.buckets.index",
              "data_pool": "us-east-1/gc.rgw.buckets.data",
              "data_extra_pool": "us-east-1/gc.rgw.buckets.non-ec",
              "index_type": 0
          }
      }
  ],
  "metadata_heap": "us-east-1/gc.rgw.meta",
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}

请注意,--rgw-zonegroup--default 开关会将该区域添加到某个区域组,并将其设为默认区域。或者,也可以使用以下命令实现相同的目的:

cephadm > radosgw-admin zone default --rgw-zone=us-east-1
cephadm > radosgw-admin zonegroup add --rgw-zonegroup=us --rgw-zone=us-east-1

11.11.9.1 创建系统用户

要访问区域存储池,需要创建一个系统用户。请注意,在配置次要区域时,也需要这些密钥。

cephadm > radosgw-admin user create --uid=zone.user \
--display-name="Zone User" --access-key=$SYSTEM_ACCESS_KEY \
--secret=$SYSTEM_SECRET_KEY --system

11.11.9.2 更新周期

由于您更改了主区域配置,因此需要提交这些更改,使其在领域配置结构中生效。最初的周期类似下方所示:

cephadm > radosgw-admin period get
{
  "id": "09559832-67a4-4101-8b3f-10dfcd6b2707", "epoch": 1, "predecessor_uuid": "", "sync_status": [], "period_map":
  {
    "id": "09559832-67a4-4101-8b3f-10dfcd6b2707", "zonegroups": [], "short_zone_ids": []
  }, "master_zonegroup": "", "master_zone": "", "period_config":
  {
     "bucket_quota": {
     "enabled": false, "max_size_kb": -1, "max_objects": -1
     }, "user_quota": {
       "enabled": false, "max_size_kb": -1, "max_objects": -1
     }
  }, "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7", "realm_name": "gold", "realm_epoch": 1
}

更新周期并提交更改:

cephadm > radosgw-admin period update --commit
{
  "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
  "epoch": 1,
  "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
  "sync_status": [ "[...]"
  ],
  "period_map": {
      "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
      "zonegroups": [
          {
              "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
              "name": "us",
              "api_name": "us",
              "is_master": "true",
              "endpoints": [
                  "http:\/\/rgw1:80"
              ],
              "hostnames": [],
              "hostnames_s3website": [],
              "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "zones": [
                  {
                      "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
                      "name": "us-east-1",
                      "endpoints": [
                          "http:\/\/rgw1:80"
                      ],
                      "log_meta": "true",
                      "log_data": "false",
                      "bucket_index_max_shards": 0,
                      "read_only": "false"
                  }
              ],
              "placement_targets": [
                  {
                      "name": "default-placement",
                      "tags": []
                  }
              ],
              "default_placement": "default-placement",
              "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
          }
      ],
      "short_zone_ids": [
          {
              "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "val": 630926044
          }
      ]
  },
  "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
  "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
  "period_config": {
      "bucket_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      },
      "user_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      }
  },
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "realm_name": "gold",
  "realm_epoch": 2
}

11.11.9.3 启动对象网关

在启动对象网关之前,需要在配置文件中指定对象网关区域和端口选项。有关对象网关及其配置的详细信息,请参见第 11 章 “Ceph Object Gateway。对象网关的配置段落应类似下方所示:

[client.rgw.us-east-1]
rgw_frontends="civetweb port=80"
rgw_zone=us-east-1

启动对象网关:

sudo systemctl start ceph-radosgw@rgw.us-east-1

11.11.10 创建次要区域

在同一个集群中,创建并配置名为 us-east-2 的次要区域。可在托管主区域本身的节点中执行以下所有命令。

要创建次要区域,请使用创建主要区域时所用的相同命令,不过需要去掉 master 标志:

cephadm > radosgw-admin zone create --rgw-zonegroup=us --endpoints=http://rgw2:80 \
--rgw-zone=us-east-2 --access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
  "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
  "name": "us-east-2",
  "domain_root": "us-east-2.rgw.data.root",
  "control_pool": "us-east-2.rgw.control",
  "gc_pool": "us-east-2.rgw.gc",
  "log_pool": "us-east-2.rgw.log",
  "intent_log_pool": "us-east-2.rgw.intent-log",
  "usage_log_pool": "us-east-2.rgw.usage",
  "user_keys_pool": "us-east-2.rgw.users.keys",
  "user_email_pool": "us-east-2.rgw.users.email",
  "user_swift_pool": "us-east-2.rgw.users.swift",
  "user_uid_pool": "us-east-2.rgw.users.uid",
  "system_key": {
      "access_key": "1555b35654ad1656d804",
      "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
  },
  "placement_pools": [
      {
          "key": "default-placement",
          "val": {
              "index_pool": "us-east-2.rgw.buckets.index",
              "data_pool": "us-east-2.rgw.buckets.data",
              "data_extra_pool": "us-east-2.rgw.buckets.non-ec",
              "index_type": 0
          }
      }
  ],
  "metadata_heap": "us-east-2.rgw.meta",
  "realm_id": "815d74c2-80d6-4e63-8cfc-232037f7ff5c"
}

11.11.10.1 更新周期

通过执行周期更新并提交更改,通知所有网关有关系统地图中发生的新变化:

cephadm > radosgw-admin period update --commit
{
  "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
  "epoch": 2,
  "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
  "sync_status": [ "[...]"
  ],
  "period_map": {
      "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
      "zonegroups": [
          {
              "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
              "name": "us",
              "api_name": "us",
              "is_master": "true",
              "endpoints": [
                  "http:\/\/rgw1:80"
              ],
              "hostnames": [],
              "hostnames_s3website": [],
              "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "zones": [
                  {
                      "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
                      "name": "us-east-1",
                      "endpoints": [
                          "http:\/\/rgw1:80"
                      ],
                      "log_meta": "true",
                      "log_data": "false",
                      "bucket_index_max_shards": 0,
                      "read_only": "false"
                  },
                  {
                      "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
                      "name": "us-east-2",
                      "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": "4a367026-bd8f-40ee-b486-8212482ddcd7"
          }
      ],
      "short_zone_ids": [
          {
              "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "val": 630926044
          },
          {
              "key": "950c1a43-6836-41a2-a161-64777e07e8b8",
              "val": 4276257543
          }

      ]
  },
  "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
  "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
  "period_config": {
      "bucket_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      },
      "user_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      }
  },
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "realm_name": "gold",
  "realm_epoch": 2
}

11.11.10.2 启动对象网关

调整次要区域的对象网关配置,并启动对象网关:

[client.rgw.us-east-2]
rgw_frontends="civetweb port=80"
rgw_zone=us-east-2
cephadm > sudo systemctl start ceph-radosgw@rgw.us-east-2

11.11.11 将对象网关添加到第二个集群

第二个 Ceph 集群与初始集群属于同一个区域组,不过可以位于不同的地理位置。

11.11.11.1 默认领域和区域组

由于已创建第一个网关的领域,因此可在此处提取该领域并将其设为默认领域:

cephadm > radosgw-admin realm pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
{
  "id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "name": "gold",
  "current_period": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
  "epoch": 2
}
cephadm > radosgw-admin realm default --rgw-realm=gold

通过提取周期,从主区域中获取配置:

cephadm > radosgw-admin period pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY

将已创建的 us 区域组设置为默认区域组:

cephadm > radosgw-admin zonegroup default --rgw-zonegroup=us

11.11.11.2 次要区域配置

使用相同的系统密钥创建名为 us-west 的新区域:

cephadm > radosgw-admin zone create --rgw-zonegroup=us --rgw-zone=us-west \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY \
--endpoints=http://rgw3:80 --default
{
  "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
  "name": "us-west",
  "domain_root": "us-west.rgw.data.root",
  "control_pool": "us-west.rgw.control",
  "gc_pool": "us-west.rgw.gc",
  "log_pool": "us-west.rgw.log",
  "intent_log_pool": "us-west.rgw.intent-log",
  "usage_log_pool": "us-west.rgw.usage",
  "user_keys_pool": "us-west.rgw.users.keys",
  "user_email_pool": "us-west.rgw.users.email",
  "user_swift_pool": "us-west.rgw.users.swift",
  "user_uid_pool": "us-west.rgw.users.uid",
  "system_key": {
      "access_key": "1555b35654ad1656d804",
      "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r\/2EI4ngqJxD7iBdBYLhwluN30JaT3Q=="
  },
  "placement_pools": [
      {
          "key": "default-placement",
          "val": {
              "index_pool": "us-west.rgw.buckets.index",
              "data_pool": "us-west.rgw.buckets.data",
              "data_extra_pool": "us-west.rgw.buckets.non-ec",
              "index_type": 0
          }
      }
  ],
  "metadata_heap": "us-west.rgw.meta",
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7"
}

11.11.11.3 更新周期

为了传播区域组地图更改,我们将更新并提交周期:

cephadm > radosgw-admin period update --commit --rgw-zone=us-west
{
  "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
  "epoch": 3,
  "predecessor_uuid": "09559832-67a4-4101-8b3f-10dfcd6b2707",
  "sync_status": [
      "", # truncated
  ],
  "period_map": {
      "id": "b5e4d3ec-2a62-4746-b479-4b2bc14b27d1",
      "zonegroups": [
          {
              "id": "d4018b8d-8c0d-4072-8919-608726fa369e",
              "name": "us",
              "api_name": "us",
              "is_master": "true",
              "endpoints": [
                  "http:\/\/rgw1:80"
              ],
              "hostnames": [],
              "hostnames_s3website": [],
              "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "zones": [
                  {
                      "id": "83859a9a-9901-4f00-aa6d-285c777e10f0",
                      "name": "us-east-1",
                      "endpoints": [
                          "http:\/\/rgw1:80"
                      ],
                      "log_meta": "true",
                      "log_data": "true",
                      "bucket_index_max_shards": 0,
                      "read_only": "false"
                  },
                                  {
                      "id": "950c1a43-6836-41a2-a161-64777e07e8b8",
                      "name": "us-east-2",
                      "endpoints": [
                          "http:\/\/rgw2:80"
                      ],
                      "log_meta": "false",
                      "log_data": "true",
                      "bucket_index_max_shards": 0,
                      "read_only": "false"
                  },
                  {
                      "id": "d9522067-cb7b-4129-8751-591e45815b16",
                      "name": "us-west",
                      "endpoints": [
                          "http:\/\/rgw3: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": "4a367026-bd8f-40ee-b486-8212482ddcd7"
          }
      ],
      "short_zone_ids": [
          {
              "key": "83859a9a-9901-4f00-aa6d-285c777e10f0",
              "val": 630926044
          },
          {
              "key": "950c1a43-6836-41a2-a161-64777e07e8b8",
              "val": 4276257543
          },
          {
              "key": "d9522067-cb7b-4129-8751-591e45815b16",
              "val": 329470157
          }
      ]
  },
  "master_zonegroup": "d4018b8d-8c0d-4072-8919-608726fa369e",
  "master_zone": "83859a9a-9901-4f00-aa6d-285c777e10f0",
  "period_config": {
      "bucket_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      },
      "user_quota": {
          "enabled": false,
          "max_size_kb": -1,
          "max_objects": -1
      }
  },
  "realm_id": "4a367026-bd8f-40ee-b486-8212482ddcd7",
  "realm_name": "gold",
  "realm_epoch": 2
}

请注意,周期的版本号已递增,表示配置发生了更改。

11.11.11.4 启动对象网关

此操作与在第一个区域中启动对象网关类似。唯一的差别在于,对象网关区域配置应反映 us-west 区域名称:

[client.rgw.us-west]
rgw_frontends="civetweb port=80"
rgw_zone=us-west

启动第二个对象网关:

sudo systemctl start ceph-radosgw@rgw.us-west

11.11.12 故障转移和灾难恢复

如果主区域发生故障,将故障转移到次要区域,以实现灾难恢复。

  1. 将次要区域设为主区域和默认区域。例如:

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

    默认情况下,Ceph Object Gateway 将以主动/主动配置运行。如果已将集群配置为以主动/被动配置运行,则次要区域是只读区域。删除 --read-only 状态可让区域接收写入操作。例如:

    root # radosgw-admin zone modify --rgw-zone={zone-name} --master --default \
    --read-only=False
  2. 更新周期,使更改生效。

    root # radosgw-admin period update --commit
  3. 最后,重启动 Ceph Object Gateway。

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

如果之前的主区域已恢复,请逆向操作。

  1. 在已恢复的区域中,从当前主区域提取周期。

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

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

    root # radosgw-admin period update --commit
  4. 然后,在已恢复的区域中重启动 Ceph Object Gateway。

    root # systemctl restart ceph-radosgw@rgw.`hostname -s`
  5. 如果次要区域需要采用只读配置,请更新次要区域。

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

    root # radosgw-admin period update --commit
  7. 最后,在次要区域中重启动 Ceph Object Gateway。

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

11.12 使用 HAProxy 在对象网关服务器间实现负载平衡

您可以使用 HAProxy 负载平衡程序将所有请求分布在多个对象网关后端服务器之间。有关配置 HAProxy 的详细信息,请参见https://www.suse.com/documentation/sle-ha-12/book_sleha/data/sec_ha_lb_haproxy.html

下面是一种 HAProxy 的简单配置,使用循环复用平衡算法来平衡对象网关节点:

root # cat /etc/haproxy/haproxy.cfg
[...]
frontend https_frontend
bind *:443 crt path-to-cert.pem [ciphers: ... ]
default_backend rgw

backend rgw
mode http
balance roundrobin
server rgw_server1 rgw-endpoint1 weight 1 maxconn 100 check
server rgw_server2 rgw-endpoint2 weight 1 maxconn 100 check
[...]
打印此页