21 Ceph 对象网关 #
本章介绍对象网关相关管理任务的详细信息,例如,检查服务的状态,管理帐户、多站点网关或 LDAP 身份验证。
21.1 对象网关限制和命名限制 #
下面列出了对象网关的一些重要限制:
21.1.1 存储桶限制 #
通过 S3 API 访问对象网关时,存储桶名必须符合 DNS 且允许使用短划线字符“-”。当通过 Swift API 访问对象网关时,您可使用支持 UTF-8 的字符(斜杠字符“/”除外)的任何组合。存储桶名最多可包含 255 个字符。存储桶名必须唯一。
虽然通过 Swift API 访问时,可使用任何基于 UTF-8 的存储桶名,但仍建议您根据 S3 命名限制对存储桶命名,以免在通过 S3 API 访问同一个存储桶时发生问题。
21.1.2 存储的对象的限制 #
- 每个用户的对象数量上限
默认无限制(大约不超过 2^63)。
- 每个存储桶的对象数量上限
默认无限制(大约不超过 2^63)。
- 要上载/存储的对象的最大大小
单次上载的上限为 5GB。更大的对象可分为多个部分上载。多部分块的最大数量为 10000。
21.1.3 HTTP 报头限制 #
HTTP 报头和请求限制取决于所使用的 Web 前端。默认 Beast 会将 HTTP 报头大小限制为 16 kB。
21.2 部署对象网关 #
Ceph 对象网关采用与其他 Ceph 服务相同的过程进行部署,即使用 cephadm。有关详细信息,具体请参考第 5.4.2 节 “服务和归置规范”到第 5.4.3.4 节 “部署对象网关”。
21.3 操作对象网关服务 #
您可以像操作其他 Ceph 服务那样来操作对象网关,首先使用 ceph orch ps
命令标识服务名称,然后运行以下命令来操作服务,例如:
ceph orch daemon restart OGW_SERVICE_NAME
有关操作 Ceph 服务的完整信息,请参考第 14 章 “Ceph 服务的操作”。
21.4 配置选项 #
有关对象网关配置选项的列表,请参见第 28.5 节 “Ceph 对象网关”。
21.5 管理对象网关的访问方式 #
您可以使用与 S3 或 Swift 兼容的接口来与对象网关通讯。S3 接口与大部分 Amazon S3 RESTful API 都兼容。Swift 接口与大部分 OpenStack Swift API 都兼容。
这两个接口都要求创建特定的用户,并安装相关的客户端软件,以使用该用户的秘密密钥来与网关通讯。
21.5.1 访问对象网关 #
21.5.1.1 S3 接口访问 #
要访问 S3 接口,需要一个 REST 客户端。S3cmd
是一个命令行 S3 客户端。您可以在 OpenSUSE Build Service 中找到它。该储存库包含既适用于 SUSE Linux Enterprise 发行套件又适用于基于 openSUSE 的发行套件的版本。
如果您想测试自己是否能够访问 S3 接口,也可以编写一个简短的 Python 脚本。该脚本将连接到对象网关,创建新存储桶,并列出所有存储桶。aws_access_key_id
和 aws_secret_access_key
的值取自第 21.5.2.1 节 “添加 S3 和 Swift 用户”中所述 radosgw_admin
命令返回的 access_key
和 secret_key
的值。
安装
python-boto
包:root #
zypper in python-boto创建名为
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\tCREATED".format( name = bucket.name, created = bucket.creation_date, )
请将
HOSTNAME
替换为在其中配置了对象网关服务的主机的主机名,例如gateway_host
。运行脚本:
python s3test.py
该脚本将输出类似下方所示的信息:
my-new-bucket 2015-07-22T15:37:42.000Z
21.5.1.2 Swift 接口访问 #
要通过 Swift 接口访问对象网关,需要使用 swift
命令行客户端。该接口的手册页 man 1 swift
介绍了有关其命令行选项的详细信息。
从 SUSE Linux Enterprise 12 SP3 到 SUSE Linux Enterprise 15 的“Public Cloud”扩展模块中都随附了该包。在安装该包之前,需要激活该扩展模块并刷新软件储存库:
root #
SUSEConnect -p sle-module-public-cloud/12/SYSTEM-ARCH
sudo zypper refresh
或
root #
SUSEConnect -p sle-module-public-cloud/15/SYSTEM-ARCHroot #
zypper refresh
要安装 swift
命令,请运行以下命令:
root #
zypper in python-swiftclient
使用以下语法进行 swift 访问:
tux >
swift -A http://IP_ADDRESS/auth/1.0 \
-U example_user:swift -K 'SWIFT_SECRET_KEY' list
请将 IP_ADDRESS 替换为网关服务器的 IP 地址,将 SWIFT_SECRET_KEY 替换为在第 21.5.2.1 节 “添加 S3 和 Swift 用户”中针对 swift
用户执行 radosgw-admin key create
命令所生成的输出中的相应值。
例如:
tux >
swift -A http://gateway.example.com/auth/1.0 -U example_user:swift \
-K 'r5wWIxjOCeEO7DixD1FjTLmNYIViaC6JVhi3013h' list
输出为:
my-new-bucket
21.5.2 管理 S3 和 Swift 帐户 #
21.5.2.1 添加 S3 和 Swift 用户 #
需要创建用户、访问钥和机密才能让最终用户与网关交互。用户分两种类型:用户和子用户。与 S3 接口交互时使用用户,子用户是 Swift 接口的用户。每个子用户都与某个用户相关联。
要创建 Swift 用户,请执行以下步骤:
要创建 Swift 用户(在我们的术语中称作子用户),需要先创建关联的用户。
cephuser@adm >
radosgw-admin user create --uid=USERNAME \ --display-name="DISPLAY-NAME" --email=EMAIL例如:
cephuser@adm >
radosgw-admin user create \ --uid=example_user \ --display-name="Example User" \ --email=penguin@example.com要创建用户的子用户(用于 Swift 接口),必须指定用户 ID(--uid=USERNAME)、子用户 ID 和该子用户的访问级别。
cephuser@adm >
radosgw-admin subuser create --uid=UID \ --subuser=UID \ --access=[ read | write | readwrite | full ]例如:
cephuser@adm >
radosgw-admin subuser create --uid=example_user \ --subuser=example_user:swift --access=full为用户生成秘密密钥。
cephuser@adm >
radosgw-admin key create \ --gen-secret \ --subuser=example_user:swift \ --key-type=swift这两个命令都会输出 JSON 格式的数据,其中显示了用户状态。请注意以下几行,并记住
secret_key
值:"swift_keys": [ { "user": "example_user:swift", "secret_key": "r5wWIxjOCeEO7DixD1FjTLmNYIViaC6JVhi3013h"}],
通过 S3 接口访问对象网关时,需要运行以下命令来创建 S3 用户:
cephuser@adm >
radosgw-admin user create --uid=USERNAME \
--display-name="DISPLAY-NAME" --email=EMAIL
例如:
cephuser@adm >
radosgw-admin user create \
--uid=example_user \
--display-name="Example User" \
--email=penguin@example.com
该命令还会创建用户的访问钥和秘密密钥。检查该命令输出中的 access_key
和 secret_key
关键字及其值:
[...] "keys": [ { "user": "example_user", "access_key": "11BS02LGFB6AL6H1ADMW", "secret_key": "vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY"}], [...]
21.5.2.2 删除 S3 和 Swift 用户 #
删除 S3 用户与删除 Swift 用户的过程类似。不过,在删除 Swift 用户时,您可能需要同时删除该用户及其子用户。
要删除 S3 或 Swift 用户(包括其所有子用户),请在以下命令中指定 user rm
和用户 ID:
cephuser@adm >
radosgw-admin user rm --uid=example_user
要删除子用户,请指定 subuser rm
和子用户 ID。
cephuser@adm >
radosgw-admin subuser rm --uid=example_user:swift
可使用以下选项:
- --purge-data
清除与该用户 ID 关联的所有数据。
- --purge-keys
清除与该用户 ID 关联的所有密钥。
删除某个子用户时,删除的是其对 Swift 接口的访问权限。该用户仍会保留在系统中。
21.5.2.3 更改 S3 和 Swift 用户的访问密钥与秘密密钥 #
访问网关时,access_key
和 secret_key
参数用于标识对象网关用户。更改现有用户密钥的过程与创建新用户密钥的过程相同,旧密钥将被重写。
对于 S3 用户,请运行以下命令:
cephuser@adm >
radosgw-admin key create --uid=EXAMPLE_USER --key-type=s3 --gen-access-key --gen-secret
对于 Swift 用户,请运行以下命令:
cephuser@adm >
radosgw-admin key create --subuser=EXAMPLE_USER:swift --key-type=swift --gen-secret
--key-type=TYPE
指定密钥的类型。值为
swift
或s3
。--gen-access-key
生成随机访问钥(默认针对 S3 用户)。
--gen-secret
生成随机秘密密钥。
--secret=KEY
指定秘密密钥,例如手动生成的密钥。
21.5.2.4 启用用户配额管理 #
Ceph 对象网关允许您针对用户以及用户拥有的存储桶设置配额。配额包括一个存储桶中的最大对象数,以及最大存储大小 (MB)。
在启用用户配额之前,需要先设置该配额的参数:
cephuser@adm >
radosgw-admin quota set --quota-scope=user --uid=EXAMPLE_USER \
--max-objects=1024 --max-size=1024
--max-objects
指定最大对象数。指定负值会禁用检查。
--max-size
指定最大字节数。指定负值会禁用检查。
--quota-scope
设置配额的范围。选项包括
bucket
和user
。存储桶配额将应用到用户拥有的存储桶。用户配额将应用到用户。
设置用户配额后,可启用该配额:
cephuser@adm >
radosgw-admin quota enable --quota-scope=user --uid=EXAMPLE_USER
要禁用配额,请执行以下命令:
cephuser@adm >
radosgw-admin quota disable --quota-scope=user --uid=EXAMPLE_USER
要列出配额设置,请执行以下命令:
cephuser@adm >
radosgw-admin user info --uid=EXAMPLE_USER
要更新配额统计数字,请执行以下命令:
cephuser@adm >
radosgw-admin user stats --uid=EXAMPLE_USER --sync-stats
21.6 HTTP 前端 #
Ceph 对象网关支持两个嵌入式 HTTP 前端:Beast 和 Civetweb。
Beast 前端使用 Boost.Beast 库处理 HTTP 分析,使用 Boost.Asio 库处理异步网络 I/O。
Civetweb 前端使用 Civetweb HTTP 库,该库属于 Mongoose 的分支。
可使用 rgw_frontends
选项配置它们。有关配置选项的列表,请参见第 28.5 节 “Ceph 对象网关”。
21.7 为对象网关启用 HTTPS/SSL #
要让对象网关可使用 SSL 进行安全通讯,您需要拥有 CA 颁发的证书,或创建自我签名证书。
21.7.1 创建自我签名证书 #
如果您已拥有 CA 签名的有效证书,请跳过本节。
以下过程说明如何在 Salt Master 上生成自我签名的 SSL 证书。
如果您需要通过其他主体身份来识别您的对象网关,请将这些身份添加到
/etc/ssl/openssl.cnf
文件[v3_req]
段落的subjectAltName
选项中:[...] [ v3_req ] subjectAltName = DNS:server1.example.com DNS:server2.example.com [...]
提示:subjectAltName
中的 IP 地址要在
subjectAltName
选项中使用 IP 地址而非域名,请将示例行替换为以下行:subjectAltName = IP:10.0.0.10 IP:10.0.0.11
使用
openssl
创建密钥和证书。输入需要包含在证书中的所有数据。建议您输入 FQDN 作为常用名。对证书签名前,确认“X509v3 Subject Alternative Name:”包含在请求的扩展中,并且生成的证书中设置了“X509v3 Subject Alternative Name:”。root@master #
openssl req -x509 -nodes -days 1095 \ -newkey rsa:4096 -keyout rgw.key -out rgw.pem向证书文件追加密钥:
root@master #
cat rgw.key >> rgw.pem
21.7.2 配置使用 SSL 的对象网关 #
要将对象网关配置为使用 SSL 证书,请使用 rgw_frontends
选项。例如:
cephuser@adm >
ceph config set WHO rgw_frontends \
beast ssl_port=443 ssl_certificate=config://CERT ssl_key=config://KEY
如果您未指定 CERT 和 KEY 配置键,对象网关服务将在以下配置键中查找 SSL 证书和密钥:
rgw/cert/RGW_REALM/RGW_ZONE.key rgw/cert/RGW_REALM/RGW_ZONE.crt
如果您要覆盖默认的 SSL 密钥和证书位置,请使用以下命令将它们导入配置数据库:
ceph config-key set CUSTOM_CONFIG_KEY -i PATH_TO_CERT_FILE
然后通过 config://
指令使用您的自定义配置键。
21.8 同步模块 #
对象网关部署为多站点服务,您可以在不同区域之间镜像数据和元数据。同步扩展模块构建在多站点框架的基础上,可将数据和元数据转发到不同的外部层。利用同步扩展模块,可让系统在每当有数据发生更改(例如执行存储桶或用户创建等元数据操作)时即执行一组操作。当对象网关多站点更改最终在远程站点上保持一致时,更改将以异步方式传播。因而很多情况下都适合使用同步扩展模块,例如将对象存储备份到外部云集群、使用磁带机的自定义备份解决方案,或在 ElasticSearch 中为元数据编制索引。
21.8.1 配置同步模块 #
所有同步扩展模块的配置方式都是相似的。您需要创建一个新区域(请参见第 21.13 节 “多站点对象网关”了解更多详细信息)并为其设置 --tier_type
选项,例如针对云同步扩展模块设置 --tier-type=cloud
:
cephuser@adm >
radosgw-admin zone create --rgw-zonegroup=ZONE-GROUP-NAME \
--rgw-zone=ZONE-NAME \
--endpoints=http://endpoint1.example.com,http://endpoint2.example.com, [...] \
--tier-type=cloud
您可以使用以下命令来配置特定层:
cephuser@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \
--rgw-zone=ZONE-NAME \
--tier-config=KEY1=VALUE1,KEY2=VALUE2
配置中的 KEY 指定您希望更新的配置变量,VALUE 指定该变量的新值。使用句点可访问嵌套的值。例如:
cephuser@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \
--rgw-zone=ZONE-NAME \
--tier-config=connection.access_key=KEY,connection.secret=SECRET
您可以通过追加方括号“[]”及引用的条目来访问相应阵列条目。您可以使用方括号“[]”来添加新的阵列条目。索引值 -1 引用的是阵列中的最后一个条目。在同一个命令中无法创建新条目并再次引用该条目。例如,用于为以 PREFIX 开头的存储桶创建新配置的命令如下所示:
cephuser@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \ --rgw-zone=ZONE-NAME \ --tier-config=profiles[].source_bucket=PREFIX'*'cephuser@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \ --rgw-zone=ZONE-NAME \ --tier-config=profiles[-1].connection_id=CONNECTION_ID,profiles[-1].acls_id=ACLS_ID
您可以使用 --tier-config-add=KEY=VALUE
参数来添加新的层配置条目。
您可以使用 --tier-config-rm=KEY
删除现有的条目。
21.8.2 同步区域 #
同步扩展模块配置对于区域而言位于本地。同步扩展模块会确定区域是要导出数据,还是只能使用已在另一区域中修改的数据。从 Luminous 版本开始,支持的同步插件有 ElasticSearch
、rgw
和 log
,其中 rgw 是在区域之间同步数据的默认同步插件,log 是记录远程区域中发生的元数据操作的普通同步插件。以下各节内容包含了使用 ElasticSearch
同步扩展模块的区域示例。其过程与配置任何其他同步插件的过程都相似。
rgw
是默认的同步插件,不需要进行明确配置。
21.8.2.1 要求和假设 #
我们假设已根据第 21.13 节 “多站点对象网关”中所述配置了一个简单的多站点,它由 us-east
和 us-west
这两个区域组成。现在,我们添加第三个区域 us-east-es
,此区域只处理来自其他站点的元数据。此区域可与 us-east
位于同一 Ceph 集群中,也可位于不同的集群中。此区域只使用来自其他区域的元数据,此区域中的对象网关不会直接处理任何最终用户请求。
21.8.2.2 配置区域 #
创建类似于第 21.13 节 “多站点对象网关”中所述区域的第三个区域,例如
cephuser@adm >
radosgw-admin
zone create --rgw-zonegroup=us --rgw-zone=us-east-es \ --access-key=SYSTEM-KEY --secret=SECRET --endpoints=http://rgw-es:80可通过以下命令为此区域配置同步扩展模块:
cephuser@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --tier-type=TIER-TYPE \ --tier-config={set of key=value pairs}例如,在
ElasticSearch
同步扩展模块中运行以下命令cephuser@adm >
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 选项,请参见第 21.8.3 节 “ElasticSearch 同步模块”。
最后,更新周期
cephuser@adm >
radosgw-admin
period update --commit现在,在区域中启动对象网关
cephuser@adm >
ceph orch start rgw.REALM-NAME.ZONE-NAME
21.8.3 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" } } }
21.8.3.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 索引路径。否则,将在同步初始化时确定并生成索引路径。
- username
指定 ElasticSearch 的用户名(如果需要身份验证)。
- password
指定 ElasticSearch 的密码(如果需要身份验证)。
21.8.3.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
21.8.4 云同步模块 #
本节介绍用于将区域数据同步到远程云服务的扩展模块。该同步是单向的,无法将数据从远程区域同步回其本地区域。此扩展模块的主要目的是实现面向多个云服务提供商的数据同步,当前仅支持与 AWS (S3) 兼容的云提供程序。
要将数据同步到远程云服务,您需要配置用户身份凭证。由于许多云服务都对每个用户可创建的存储桶数量设定了限制,因此您可以配置源对象与存储桶的映射,使不同的目标映射至不同的存储桶和存储桶前缀。请注意,系统不会保留源访问列表 (ACL)。可以将特定源用户的权限映射到特定的目标用户。
由于 API 存在限制,因此无法保留原始对象修改时间和 HTTP 实体标记 (ETag)。云同步扩展模块会将它们存储为目标对象的元数据属性。
21.8.4.1 配置云同步模块 #
下面提供了一些普通和非普通云同步扩展模块配置示例。请注意,普通配置可能会与非普通配置发生冲突。
{ "connection": { "access_key": ACCESS, "secret": SECRET, "endpoint": ENDPOINT, "host_style": path | virtual, }, "acls": [ { "type": id | email | uri, "source_id": SOURCE_ID, "dest_id": DEST_ID } ... ], "target_path": TARGET_PATH, }
{ "default": { "connection": { "access_key": ACCESS, "secret": SECRET, "endpoint": ENDPOINT, "host_style" path | virtual, }, "acls": [ { "type": id | email | uri, # optional, default is id "source_id": ID, "dest_id": ID } ... ] "target_path": PATH # optional }, "connections": [ { "connection_id": ID, "access_key": ACCESS, "secret": SECRET, "endpoint": ENDPOINT, "host_style": path | virtual, # optional } ... ], "acl_profiles": [ { "acls_id": ID, # acl mappings "acls": [ { "type": id | email | uri, "source_id": ID, "dest_id": ID } ... ] } ], "profiles": [ { "source_bucket": SOURCE, "connection_id": CONNECTION_ID, "acls_id": MAPPINGS_ID, "target_path": DEST, # optional } ... ], }
下面是对所用配置术语的解释:
- connection
表示与远程云服务的连接。包含“connection_id”、“access_key”、“secret”、“endpoint”和“host_style”。
- access_key
将用于特定连接的远程云访问密钥。
- secret
远程云服务的秘密密钥。
- endpoint
远程云服务端点的 URL。
- host_style
访问远程云端点时要使用的主机类型(“path”或“virtual”)。默认值为“path”。
- acls
访问列表映射阵列。
- acl_mapping
每个“acl_mapping”结构都包含“type”、“source_id”和“dest_id”。它们将定义每个对象的 ACL 变化。ACL 变化允许将源用户 ID 转换为目标 ID。
- type
ACL 类型:“id”定义用户 ID,“email”按电子邮件定义用户,“uri”按 uri(组)定义用户。
- source_id
源区域中的用户 ID。
- dest_id
目标区域中的用户 ID。
- target_path
用于定义目标路径创建方式的字符串。目标路径指定追加到源对象名称的前缀。可对目标路径进行配置,使其包含以下任何变量:
- SID
表示同步实例 ID 的唯一字符串。
- ZONEGROUP
区域组名称。
- ZONEGROUP_ID
区域组 ID。
- ZONE
区域名。
- ZONE_ID
区域 ID。
- BUCKET
源存储桶名称。
- OWNER
源存储桶所有者 ID。
例如:target_path = rgwx-ZONE-SID/OWNER/BUCKET
- acl_profiles
访问列表配置阵列。
- acl_profile
每个配置均包含代表配置的“acls_id”和用于存放“acl_mappings”列表的“acls”阵列。
- profiles
配置列表。每个配置均包含以下变量:
- source_bucket
用于定义此配置源存储桶的存储桶名称或存储桶前缀(如果以 * 结尾)。
- target_path
请参见上文的相关解释。
- connection_id
将用于此配置的连接 ID。
- acls_id
将用于此配置的 ACL 配置 ID。
21.8.4.2 专用于 S3 的可配置项 #
云同步扩展模块仅适用于与 AWS S3 兼容的后端。该扩展模块提供了一些可配置项,用来调整它在访问 S3 云服务时的行为:
{ "multipart_sync_threshold": OBJECT_SIZE, "multipart_min_part_size": PART_SIZE }
- multipart_sync_threshold
针对大小大于或等于此值的对象,将使用多部分上载来与云服务进行同步。
- multipart_min_part_size
通过多部分上载同步对象时所使用的部分大小下限。
21.8.5 存档同步模块 #
存档同步模块利用了对象网关中 S3 对象的版本控制功能。您可以配置一个存档区域,用来捕获其他区域中一段时间内出现的 S3 对象的不同版本。存档区域保留的版本历史只能通过与存档区域关联的网关来删除。
借助这样的体系结构,一些不受版本控制的区域可以通过自身的区域网关来镜像它们的数据和元数据,以便向最终用户提供高可用性,同时,存档区域会捕获所有数据更新,以便将它们合并为 S3 对象的版本。
通过在多区域配置中包含存档区域,您可以灵活地在一个区域中保留 S3 对象历史,同时能够节省其余区域中受版本控制的 S3 对象的副本原本需要的空间。
21.8.5.1 配置存档同步模块 #
要使用存档同步模块,您需要创建一个新区域,并将其层类型设置为 archive
:
cephuser@adm >
radosgw-admin zone create --rgw-zonegroup=ZONE_GROUP_NAME \
--rgw-zone=OGW_ZONE_NAME \
--endpoints=http://OGW_ENDPOINT1_URL[,http://OGW_ENDPOINT2_URL,...]
--tier-type=archive
21.9 LDAP authentication #
除了默认的本地用户身份验证以外,对象网关还能利用 LDAP 服务器服务来对用户进行身份验证。
21.9.1 身份验证机制 #
对象网关从令牌提取用户的 LDAP 身份凭证。可以基于用户名构造搜索过滤器。对象网关使用配置的服务帐户在目录中搜索匹配的项。如果找到了某个项,对象网关会尝试使用令牌中的密码绑定到所找到的判别名。如果身份凭证有效,绑定将会成功,并且对象网关会授予访问权限。
您可以通过将搜索范围设置为特定的组织单位,或者指定自定义搜索过滤器(例如,要求特定的组成员资格、自定义对象类或属性),来限制允许的用户。
21.9.2 要求 #
LDAP 或 Active Directory:对象网关可访问的运行中 LDAP 实例。
服务帐户:对象网关要使用且拥有搜索权限的 LDAP 身份凭证。
用户帐户:LDAP 目录中的至少一个用户帐户。
不得对本地用户以及要使用 LDAP 进行身份验证的用户使用相同的用户名。对象网关无法区分两者,会将它们视为同一个用户。
使用 ldapsearch
实用程序可校验服务帐户或 LDAP 连接。例如:
tux >
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 参数,以杜绝可能的问题。
21.9.3 将对象网关配置为使用 LDAP 身份验证 #
以下参数与 LDAP 身份验证有关:
rgw_ldap_uri
指定要使用的 LDAP 服务器。请务必使用
ldaps://FQDN:PORT
参数,以免公开传输明文身份凭证。rgw_ldap_binddn
对象网关使用的服务帐户的判别名 (DN)。
rgw_ldap_secret
服务帐户的密码。
- rgw_ldap_searchdn
指定在目录信息树中搜索用户的范围,可以是用户的组织单位,或某个更具体的组织单位 (OU)。
rgw_ldap_dnattr
在构造的搜索过滤器中用来匹配用户名的属性。根据所用的目录信息树 (DIT),可能会是
uid
或cn
。rgw_search_filter
如果未指定,则对象网关会使用
rgw_ldap_dnattr
设置自动构造搜索过滤器。使用此参数能非常灵活地缩小所允许用户列表的范围。有关详细信息,请参见第 21.9.4 节 “使用自定义搜索过滤器限制用户访问权限”。
21.9.4 使用自定义搜索过滤器限制用户访问权限 #
可通过两种方式使用 rgw_search_filter
参数。
21.9.4.1 用于进一步限制所构造的搜索过滤器的部分过滤器 #
部分过滤器的示例:
"objectclass=inetorgperson"
对象网关将照常使用令牌中的用户名和 rgw_ldap_dnattr
的值生成搜索过滤器。然后,构造的过滤器将与 rgw_search_filter
属性中的部分过滤器合并。根据所用的用户名和设置,最终的搜索过滤器可能会变成:
"(&(uid=hari)(objectclass=inetorgperson))"
在这种情况下,仅当在 LDAP 目录中找到了用户“hari”,该用户具有对象类“inetorgperson”并且确实指定了有效密码时,才向他授予访问权限。
21.9.4.2 完整过滤器 #
完整过滤器必须包含 USERNAME
令牌,在尝试身份验证期间,该令牌将替换为用户名。在这种情况下,不再使用 rgw_ldap_dnattr
参数。例如,要将有效用户限制为特定的组,可使用以下过滤器:
"(&(uid=USERNAME)(memberOf=cn=ceph-users,ou=groups,dc=mycompany,dc=com))"
memberOf
属性
在 LDAP 搜索中使用 memberOf
属性需要您实施的特定 LDAP 服务器提供服务器端支持。
21.9.5 生成用于 LDAP 身份验证的访问令牌 #
radosgw-token
实用程序基于 LDAP 用户名和密码生成访问令牌。它会输出 base-64 编码字符串,即实际的访问令牌。请使用偏好的 S3 客户端(请参见第 21.5.1 节 “访问对象网关”),将该令牌指定为访问钥,并使用空秘密密钥。
tux >
export RGW_ACCESS_KEY_ID="USERNAME"tux >
export RGW_SECRET_ACCESS_KEY="PASSWORD"cephuser@adm >
radosgw-token --encode --ttype=ldap
访问令牌是一个 base-64 编码的 JSON 结构,包含明文形式的 LDAP 身份凭证。
对于 Active Directory,请使用 --ttype=ad
参数。
21.10 存储桶索引分片 #
对象网关将存储桶索引数据存储在索引池中,该池默认为 .rgw.buckets.index
。如果将太多(成百上千个)对象放入单个存储桶中,并且不设置每个存储桶的最大对象数量配额 (rgw bucket default quota max objects
),索引池的性能可能会下降。存储桶索引分片可在允许每个存储桶中放入大量对象的同时,防止出现此类性能下降的情况。
21.10.1 存储桶索引重分片 #
如果随着存储桶的增大,其初始配置不再能满足需求,则需要对存储桶的索引池进行重分片。您可以使用自动联机存储桶索引重分片(请参见第 21.10.1.1 节 “动态重分片”),也可以手动脱机执行存储桶索引重分片(请参见第 21.10.1.2 节 “手动重分片”)。
21.10.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 秒。
- 将存储桶添加到重分片队列:
cephuser@adm >
radosgw-admin reshard add \ --bucket BUCKET_NAME \ --num-shards NEW_NUMBER_OF_SHARDS- 列出重分片队列:
cephuser@adm >
radosgw-admin reshard list- 处理/安排存储桶重分片:
cephuser@adm >
radosgw-admin reshard process- 显示存储桶重分片状态:
cephuser@adm >
radosgw-admin reshard status --bucket BUCKET_NAME- 取消待处理的存储桶重分片:
cephuser@adm >
radosgw-admin reshard cancel --bucket BUCKET_NAME
21.10.1.2 手动重分片 #
第 21.10.1.1 节 “动态重分片”所述的动态重新分片仅适用于简单对象网关配置。对于多站点配置,请使用本节中所述的手动重新分片。
要手动对存储桶索引执行脱机重分片,请使用以下命令:
cephuser@adm >
radosgw-admin bucket reshard
bucket reshard
命令执行以下操作:
为指定对象创建一组新的存储桶索引对象。
分散这些索引对象的所有条目。
创建新的存储桶实例。
列出新的存储桶实例以及存储桶,以便所有新的索引操作都能够应用到新的存储桶索引。
将旧的和新的存储桶 ID 打印到标准输出。
选择分片数量时,请注意以下几点:确保每个分片不超过 100000 个条目。如果在各分片中均匀分布存储桶索引条目,使用质数数量的存储桶索引分片通常效果会更好。例如,使用 503 个存储桶索引分片会比使用 500 个效果好,因为前者为质数。
确保对存储桶执行的所有操作都已停止。
备份原始存储桶索引:
cephuser@adm >
radosgw-admin bi list \ --bucket=BUCKET_NAME \ > BUCKET_NAME.list.backup对存储桶索引重分片:
cephuser@adm >
radosgw-admin bucket reshard \ --bucket=BUCKET_NAME \ --num-shards=NEW_SHARDS_NUMBER提示:旧存储桶 ID此命令还会将新的和旧的存储桶 ID 打印到其输出中。
21.10.2 新存储桶的存储桶索引分片 #
有两个选项会影响存储桶索引分片:
对于简单配置,请使用
rgw_override_bucket_index_max_shards
选项。对于多站点配置,请使用
bucket_index_max_shards
选项。
将选项设为 0
将禁用存储桶索引分片。如果将其设为大于 0
的值,则会启用存储桶索引分片,并设置最大分片数。
下面的公式可帮助您计算建议的分片数:
number_of_objects_expected_in_a_bucket / 100000
注意,分片的最大数量为 7877。
21.10.2.1 多站点配置 #
多站点配置可使用另一个索引池来管理故障转移。要为一个区域组内的区域配置一致的分片数量,请在该区域组的配置中设置 bucket_index_max_shards
选项:
将区域组配置导出到
zonegroup.json
文件:cephuser@adm >
radosgw-admin zonegroup get > zonegroup.json编辑
zonegroup.json
文件,为每个指定的区域设置bucket_index_max_shards
选项。重新设置区域组:
cephuser@adm >
radosgw-admin zonegroup set < zonegroup.json更新周期。请参见第 21.13.2.6 节 “更新周期”。
21.11 OpenStack Keystone 集成 #
OpenStack Keystone 是一项用于 OpenStack 产品的身份服务。您可以将对象网关与 Keystone 相集成,以设置接受 Keystone 身份验证令牌的网关。Ceph 对象网关端将会对 Keystone 授权可访问网关的用户进行校验,并视需要自动创建用户。对象网关会定期查询 Keystone,以获取已撤消令牌列表。
21.11.1 配置 OpenStack #
配置 Ceph 对象网关前,需要先配置 OpenStack Keystone 以启用 Swift 服务,并将其指向 Ceph 对象网关:
设置 Swift 服务。要使用 OpenStack 来验证 Swift 用户,请先创建 Swift 服务:
tux >
openstack service create \ --name=swift \ --description="Swift Service" \ object-store设置端点。创建 Swift 服务后,指向 Ceph 对象网关。用网关的区域组名或区域名称替换 REGION_NAME。
tux >
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校验这些设置。创建 Swift 服务并设置端点后,显示端点以确认所有设置正确无误。
tux >
openstack endpoint show object-store
21.11.2 配置 Ceph 对象网关 #
21.11.2.1 配置 SSL 证书 #
Ceph 对象网关会定期查询 Keystone,以获取已撤消令牌列表。这些请求会被编码并签名。还可配置 Keystone 以提供自我签名令牌,这些令牌同样经过编码和签名。您需要配置网关以便其可以解码并校验这些已签名讯息。因此,需要将 Keystone 用于创建请求的 OpenSSL 证书转换为“nss db”格式:
root #
mkdir /var/ceph/nssroot #
openssl x509 -in /etc/keystone/ssl/certs/ca.pem \ -pubkey | certutil -d /var/ceph/nss -A -n ca -t "TCu,Cu,Tuw"root
openssl x509 -in /etc/keystone/ssl/certs/signing_cert.pem \ -pubkey | certutil -A -d /var/ceph/nss -n signing_cert -t "P,P,P"
为允许 Ceph 对象网关与 OpenStack Keystone 交互,OpenStack Keystone 可使用自我签名的 SSL 证书。可在运行 Ceph 对象网关的节点上安装 Keystone 的 SSL 证书,也可以将选项 rgw keystone verify ssl
的值设为“false”。将 rgw keystone verify ssl
设为“false”意味着网关将不会尝试校验证书。
21.11.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 对象网关将使用 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 对象网关用户与 Keystone 租户一一映射。系统会为一个 Keystone 用户指定不同的角色,这些角色可能分布在不止一个租户上。当 Ceph 对象网关收到票据时,会查看为该票据指定的租户和用户角色,并根据 rgw keystone accepted roles
选项的设置接受或拒绝请求。
虽然 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 管理员用户项目。
21.12 存储池归置和存储类别 #
21.12.1 显示归置目标 #
归置目标用于控制哪些存储池与特定存储桶相关联。存储桶的归置目标是在创建存储桶时选择的,无法修改。您可通过运行以下命令来显示存储桶的 placement_rule
:
cephuser@adm >
radosgw-admin bucket stats
区域组配置包含一个归置目标列表,其中的初始目标名为“default-placement”。区域配置随后会将每个区域组归置目标名称映射到其本地存储。此区域归置信息包括表示存储桶索引的“index_pool”名称、表示不完整多部分上载相关元数据的“data_extra_pool”名称,以及表示每个存储类别的“data_pool”名称。
21.12.2 存储类别 #
存储类别有助于自定义对象数据的归置。S3 存储桶生命周期规则可自动转换对象的存储类别。
存储类别根据归置目标定义。每个区域组归置目标会列出它的可用存储类别,其中初始类别名为“STANDARD”。区域配置负责为每个区域组的存储类别提供“data_pool”存储池名称。
21.12.3 配置区域组和区域 #
您可以对区域组和区域使用 radosgw-admin
命令来配置其归置。可以使用以下命令来查询区域组归置配置:
cephuser@adm >
radosgw-admin zonegroup get
{
"id": "ab01123f-e0df-4f29-9d71-b44888d67cd5",
"name": "default",
"api_name": "default",
...
"placement_targets": [
{
"name": "default-placement",
"tags": [],
"storage_classes": [
"STANDARD"
]
}
],
"default_placement": "default-placement",
...
}
要查询区域归置配置,请运行以下命令:
cephuser@adm >
radosgw-admin zone get
{
"id": "557cdcee-3aae-4e9e-85c7-2f86f5eddb1f",
"name": "default",
"domain_root": "default.rgw.meta:root",
...
"placement_pools": [
{
"key": "default-placement",
"val": {
"index_pool": "default.rgw.buckets.index",
"storage_classes": {
"STANDARD": {
"data_pool": "default.rgw.buckets.data"
}
},
"data_extra_pool": "default.rgw.buckets.non-ec",
"index_type": 0
}
}
],
...
}
如果您之前未进行过任何多站点配置,系统将会为您创建“default”区域和区域组,并且您必须重启动 Ceph 对象网关,对该区域/区域组所做的更改才会生效。如果您已创建过多站点领域,则当您使用 radosgw-admin period update --commit
命令提交对区域/区域组的更改后,更改即会生效。
21.12.3.1 添加归置目标 #
要创建一个名为“temporary”的新归置目标,首先请将该归置目标添加到区域组:
cephuser@adm >
radosgw-admin zonegroup placement add \
--rgw-zonegroup default \
--placement-id temporary
然后为该目标提供区域归置信息:
cephuser@adm >
radosgw-admin zone placement add \
--rgw-zone default \
--placement-id temporary \
--data-pool default.rgw.temporary.data \
--index-pool default.rgw.temporary.index \
--data-extra-pool default.rgw.temporary.non-ec
21.12.3.2 添加存储类别 #
要向“default-placement”目标添加一个名为“COLD”的新存储类别,首先请将该存储类别添加到区域组:
cephuser@adm >
radosgw-admin zonegroup placement add \
--rgw-zonegroup default \
--placement-id default-placement \
--storage-class COLD
然后为该存储类别提供区域归置信息:
cephuser@adm >
radosgw-admin zone placement add \
--rgw-zone default \
--placement-id default-placement \
--storage-class COLD \
--data-pool default.rgw.cold.data \
--compression lz4
21.12.4 归置自定义 #
21.12.4.1 编辑默认区域组归置 #
新存储桶默认将使用区域组的 default_placement
目标。您可以使用以下命令更改此区域组设置:
cephuser@adm >
radosgw-admin zonegroup placement default \
--rgw-zonegroup default \
--placement-id new-placement
21.12.4.2 编辑默认用户归置 #
Ceph 对象网关用户可以通过在用户信息中设置非空的 default_placement
字段来覆盖区域组的默认归置目标。同样,default_storage_class
也可以覆盖默认应用于对象的 STANDARD
存储类别。
cephuser@adm >
radosgw-admin user info --uid testid
{
...
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
...
}
如果区域组的归置目标包含任何标记,则除非用户信息的“placement_tags”字段中至少包含一个相匹配的标记,否则用户将无法创建具有该归置目标的存储桶。这有助于限制对某些特定存储类型的访问。
radosgw-admin
无法直接修改这些字段,因此您需要手动编辑 JSON 格式:
cephuser@adm >
radosgw-admin metadata get user:USER-ID > user.jsontux >
vi user.json # edit the file as requiredcephuser@adm >
radosgw-admin metadata put user:USER-ID < user.json
21.12.4.3 编辑 S3 默认存储桶归置 #
采用 S3 协议创建存储桶时,可在 LocationConstraint
选项中提供归置目标,以覆盖用户和区域组的默认归置目标。
通常,LocationConstraint
需要与区域组的 api_name
相匹配:
<LocationConstraint>default</LocationConstraint>
您可以向 api_name
添加自定义归置目标(需在该自定义目标前加上一个冒号):
<LocationConstraint>default:new-placement</LocationConstraint>
21.12.4.4 编辑 Swift 存储桶归置 #
采用 Swift 协议创建存储桶时,您可以在 HTTP 报头的 X-Storage-Policy
中提供归置目标:
X-Storage-Policy: NEW-PLACEMENT
21.12.5 使用存储类别 #
所有归置目标均具有 STANDARD
存储类别,这是系统默认为新对象应用的存储类别。您可以使用对象的 default_storage_class
覆盖此默认值。
要创建不属于默认存储类别的对象,请在请求的 HTTP 报头中提供所需的存储类别名称。S3 协议使用 X-Amz-Storage-Class
报头,而 Swift 协议则使用 X-Object-Storage-Class
报头。
借助 S3 对象生命周期管理,您可以使用转换
操作来转变对象数据的存储类别。
21.13 多站点对象网关 #
Ceph 支持为 Ceph 对象网关选择多种多站点配置选项:
- 多区域
由一个区域组和多个区域组成的配置,每个区域有一个或多个
ceph-radosgw
实例。每个区域由各自的 Ceph 存储集群提供支持。当区域组中的其中一个区域出现严重故障时,该区域组中的其他区域可为区域组提供灾难恢复。每个区域都处于活动状态且可接收写入操作。除了灾难恢复外,多个活动区域还可作为内容分发网络的基础。- 多区域组
Ceph 对象网关支持多个区域组,每个区域组有一个或多个区域。对象会存储到一个区域组中的多个区域,而同属于一个领域的另一个区域组会共享全局对象名称空间,以确保对象 ID 在各区域组和区域间保持唯一。
注意请务必注意,区域组只会在各区域组之间同步元数据。区域组内的各个区域之间会复制数据和元数据。但任何数据和元数据均不会在领域中共享。
- 多个领域
Ceph 对象网关支持领域(即全局唯一的名称空间)概念。支持使用多个领域,每个领域可包含一个或多个区域组。
您可以将每个对象网关配置为以主动/主动区域配置运行,以便允许向非主区域写入数据。多站点配置存储在称为领域的容器内。领域中会存储区域组、区域和包含多个版本号(用于跟踪对配置进行的更改)的时间周期。rgw
守护进程负责处理同步,因而不需要另外再使用同步代理。这种同步方法可让 Ceph 对象网关以主动/主动配置(而非主动/被动配置)运行。
21.13.1 要求和假设 #
多站点配置至少需要两个 Ceph 存储集群以及两个 Ceph 对象网关实例,每个 Ceph 对象网关实例对应一个 Ceph 存储集群。以下配置假设至少有两个 Ceph 存储集群分布在不同的地理位置。但该配置也可在同一站点运行。例如,有两个名为 rgw1
和 rgw2
的主机。
多站点配置需要有一个主区域组和一个主区域。主区域是有关多站点集群中所有元数据操作的真实数据来源。此外,每个区域组都需要有一个主区域。区域组可以有一个或多个次要区域或非主区域。在本指南中,rgw1
主机作为主区域组的主区域,rgw2
主机作为主区域组的次要区域。
21.13.2 配置主区域 #
多站点配置中的所有网关都需从主区域组和主区域内的主机上的 ceph-radosgw
守护进程检索其配置。要在多站点配置中配置您的网关,请选择 ceph-radosgw
实例以配置主区域组和主区域。
21.13.2.1 创建领域 #
领域表示全局唯一的名称空间,由包含一个或多个区域的一个或多个区域组组成。区域包含存储桶,而存储桶包含对象。借助领域,Ceph 对象网关可以在相同硬件上支持多个名称空间及其配置。领域包含周期概念。每个周期表示不同时间的区域组和区域配置状态。每次您更改区域组或区域时,请更新周期并提交更新。出于向后兼容的原因,Ceph 对象网关默认不会创建领域。作为最佳实践,我们建议您为新集群创建领域。
要为多站点配置创建名为 gold
的新领域,请在标识为用于主区域组和主区域中的主机上打开命令行界面。然后执行以下命令:
cephuser@adm >
radosgw-admin realm create --rgw-realm=gold --default
如果集群仅有一个领域,请指定 --default
标志。如果指定了 --default
,radosgw-admin
默认会使用此领域。如果未指定 --default
,添加区域组和区域时需要指定 --rgw-realm
或 --realm-id
标志以标识相应的领域。
创建领域后,使用 radosgw-admin
可返回领域配置:
{ "id": "4a367026-bd8f-40ee-b486-8212482ddcd7", "name": "gold", "current_period": "09559832-67a4-4101-8b3f-10dfcd6b2707", "epoch": 1 }
Ceph 会为领域生成唯一的 ID,因此允许用户在需要时重命名领域。
21.13.2.2 创建主区域组 #
领域必须至少有一个区域组作为该领域的主区域组。要为多站点配置创建新的主区域组,请在标识为用于主区域组和主区域中的主机上打开命令行界面。通过执行以下命令创建名为 us
的主区域组:
cephuser@adm >
radosgw-admin zonegroup create --rgw-zonegroup=us \
--endpoints=http://rgw1:80 --master --default
如果领域仅有一个区域组,请指定 --default
标志。如果指定了 --default
,radosgw-admin
在添加新区域时默认会使用此区域组。如果未指定 --default
,添加区域时需要指定 --rgw-zonegroup
或 --zonegroup-id
标志以标识添加或修改区域时的相应区域组。
创建主区域组后,使用 radosgw-admin
可返回区域组配置。例如:
{ "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" }
21.13.2.3 创建主区域 #
需要在将要置于区域内的 Ceph 对象网关节点上创建区域。
要为多站点配置创建新的主区域,请在标识为用于主区域组和主区域中的主机上打开命令行界面。执行以下命令:
cephuser@adm >
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
上面的示例中未指定 --access-key
和 --secret
选项。在下一节中创建用户时会将这些设置添加到区域中。
创建主区域后,使用 radosgw-admin
可返回区域配置。例如:
{ "id": "56dfabbb-2f4e-4223-925e-de3c72de3866", "name": "us-east-1", "domain_root": "us-east-1.rgw.meta:root", "control_pool": "us-east-1.rgw.control", "gc_pool": "us-east-1.rgw.log:gc", "lc_pool": "us-east-1.rgw.log:lc", "log_pool": "us-east-1.rgw.log", "intent_log_pool": "us-east-1.rgw.log:intent", "usage_log_pool": "us-east-1.rgw.log:usage", "reshard_pool": "us-east-1.rgw.log:reshard", "user_keys_pool": "us-east-1.rgw.meta:users.keys", "user_email_pool": "us-east-1.rgw.meta:users.email", "user_swift_pool": "us-east-1.rgw.meta:users.swift", "user_uid_pool": "us-east-1.rgw.meta:users.uid", "otp_pool": "us-east-1.rgw.otp", "system_key": { "access_key": "1555b35654ad1656d804", "secret_key": "h7GhxuBLTrlhVUyxSPUKUV8r/2EI4ngqJxD7iBdBYLhwluN30JaT3Q==" }, "placement_pools": [ { "key": "us-east-1-placement", "val": { "index_pool": "us-east-1.rgw.buckets.index", "storage_classes": { "STANDARD": { "data_pool": "us-east-1.rgw.buckets.data" } }, "data_extra_pool": "us-east-1.rgw.buckets.non-ec", "index_type": 0 } } ], "metadata_heap": "", "realm_id": "" }
21.13.2.4 删除默认的区域和组 #
下面的步骤假设多站点配置使用的是新安装的系统,即其中尚未存储任何数据。如果您已在使用默认区域及其存储池存储数据,切勿删除该区域及其存储池,否则数据将被删除且不可恢复。
采用默认设置安装对象网关时会创建名为 default
的默认区域组。删除默认区域(如果存在)。务必先将其从默认区域组中删除。
cephuser@adm >
radosgw-admin zonegroup delete --rgw-zonegroup=default
删除 Ceph 存储集群中的默认存储池(如果存在):
下面的步骤假设多站点配置使用的是新安装的系统,即当前未存储任何数据。如果您已在使用默认区域组存储数据,切勿删除该区域组。
cephuser@adm >
ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.meta default.rgw.meta --yes-i-really-really-mean-it
如果您删除默认区域组,则将同时删除系统用户。如果未传播您的管理员用户密钥,Ceph Dashboard 的对象网关管理功能将会失败。如果您执行此步骤,请继续下一节以重新创建您的系统用户。
21.13.2.5 创建系统用户 #
ceph-radosgw
守护进程在提取领域和周期信息前必须进行身份验证。在主区域中,创建系统用户以简化守护进程之间的身份验证:
cephuser@adm >
radosgw-admin user create --uid=zone.user \
--display-name="Zone User" --access-key=SYSTEM_ACCESS_KEY \
--secret=SYSTEM_SECRET_KEY --system
记下 access_key
和 secret_key
,因为次要区域需要使用它们向主区域进行身份验证。
将系统用户添加到主区域:
cephuser@adm >
radosgw-admin zone modify --rgw-zone=us-east-1 \
--access-key=ACCESS-KEY --secret=SECRET
更新周期以使更改生效:
cephuser@adm >
radosgw-admin period update --commit
21.13.2.6 更新周期 #
更新主区域配置后,请更新周期:
cephuser@adm >
radosgw-admin period update --commit
更新周期后,使用 radosgw-admin
可返回周期配置。例如:
{ "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 }
更新周期会更改版本号,并会确保其他区域可收到更新的配置。
21.13.2.7 启动网关 #
在对象网关主机上,启动并启用 Ceph 对象网关服务。要标识集群的唯一 FSID,请运行 ceph fsid
。要标识对象网关守护进程名称,请运行 ceph orch ps --hostname HOSTNAME
。
cephuser@ogw >
systemctl start ceph-FSID@DAEMON_NAMEcephuser@ogw >
systemctl enable ceph-FSID@DAEMON_NAME
21.13.3 配置次要区域 #
区域组内的区域会复制所有数据,以确保各区域都具有相同数据。创建次要区域时,请在指定为次要区域提供服务的主机上执行以下所有操作。
要添加第三个区域,请执行与添加次要区域相同的过程。请使用不同的区域名称。
必须在主区域内的主机上执行元数据操作(例如创建用户)。主区域及次要区域均可接收存储桶操作,但次要区域会将存储桶操作重定向到主区域。如果主区域处于停用状态,存储桶操作将会失败。
21.13.3.1 提取领域 #
使用主区域组中的主区域的 URL 路径、访问密钥和秘密密钥将领域配置提取到主机。要提取非默认领域,请使用 --rgw-realm
或 --realm-id
配置选项指定该领域。
cephuser@adm >
radosgw-admin realm pull --url=url-to-master-zone-gateway --access-key=access-key --secret=secret
提取领域还会检索远程的当前周期配置,并将其设为此主机上的当前周期。
如果此领域为默认领域或唯一的领域,请将其设为默认领域。
cephuser@adm >
radosgw-admin realm default --rgw-realm=REALM-NAME
21.13.3.2 创建次要区域 #
要为多站点配置创建次要区域,请在标识为用于次要区域的主机上打开命令行界面。为区域指定区域组 ID、新区域名称和端点。请勿使用 --master
标志。所有区域默认均以主动/主动配置运行。如果次要区域不应接受写入操作,请指定 --read-only
标志以在主区域和次要区域之间创建主动/被动配置。此外还需提供生成的系统用户的 access_key
和 secret_key
,这些数据存储在主区域组的主区域中。执行以下命令:
cephuser@adm >
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]
例如:
cephuser@adm >
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"
}
下面的步骤假设多站点配置使用的是新安装的系统,即其中尚未存储任何数据。如果您已在使用默认区域及其存储池存储数据,切勿删除该区域及其存储池,否则数据将会丢失且不可恢复。
根据需要删除默认区域:
cephuser@adm >
radosgw-admin zone rm --rgw-zone=default
根据需要删除 Ceph 存储集群中的默认存储池:
cephuser@adm >
ceph osd pool rm default.rgw.control default.rgw.control --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.data.root default.rgw.data.root --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.gc default.rgw.gc --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.log default.rgw.log --yes-i-really-really-mean-itcephuser@adm >
ceph osd pool rm default.rgw.users.uid default.rgw.users.uid --yes-i-really-really-mean-it
21.13.3.3 更新 Ceph 配置文件 #
通过在相应实例条目中添加 rgw_zone
配置选项和次要区域名称,来更新次要区域主机上的 Ceph 配置文件。
为此,请执行以下命令:
cephuser@adm >
ceph config set SERVICE_NAME rgw_zone us-west
21.13.3.4 更新周期 #
更新主区域配置后,请更新周期:
cephuser@adm >
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
}
更新周期会更改版本号,并会确保其他区域可收到更新的配置。
21.13.3.5 启动对象网关 #
在对象网关主机上,启动并启用 Ceph 对象网关服务:
cephuser@adm >
ceph orch start rgw.us-east-2
21.13.3.6 检查同步状态 #
在次要区域启用并运行时,检查同步状态。同步操作会将主区域中创建的用户和存储桶复制到次要区域。
cephuser@adm >
radosgw-admin sync status
下面的输出提供了同步操作的状态。例如:
realm f3239bc5-e1a8-4206-a81d-e1576480804d (gold) zonegroup c50dbb7e-d9ce-47cc-a8bb-97d9b399d388 (us) zone 4c453b70-4a16-4ce8-8185-1893b05d346e (us-west) metadata sync syncing full sync: 0/64 shards metadata is caught up with master incremental sync: 64/64 shards data sync source: 1ee9da3e-114d-4ae3-a8a4-056e8a17f532 (us-east) syncing full sync: 0/128 shards incremental sync: 128/128 shards data is caught up with source
次要区域会接受存储桶操作,但会将它们重定向到主区域,然后会与主区域同步以接收存储桶操作的结果。如果主区域处于停用状态,对次要区域执行的存储桶操作将会失败,但对象操作应该会成功完成。
21.13.4 常规的对象网关维护 #
21.13.4.1 检查同步状态 #
可以使用以下命令查询有关区域复制状态的信息:
cephuser@adm >
radosgw-admin sync status
realm b3bc1c37-9c44-4b89-a03b-04c269bea5da (gold)
zonegroup f54f9b22-b4b6-4a0e-9211-fa6ac1693f49 (us)
zone adce11c9-b8ed-4a90-8bc5-3fc029ff0816 (us-west)
metadata sync syncing
full sync: 0/64 shards
incremental sync: 64/64 shards
metadata is behind on 1 shards
oldest incremental change not applied: 2017-03-22 10:20:00.0.881361s
data sync source: 341c2d81-4574-4d08-ab0f-5a2a7b168028 (us-east)
syncing
full sync: 0/128 shards
incremental sync: 128/128 shards
data is caught up with source
source: 3b5d1a3f-3f27-4e4a-8f34-6072d4bb1275 (us-3)
syncing
full sync: 0/128 shards
incremental sync: 128/128 shards
data is caught up with source
21.13.4.2 更改元数据主区域 #
更改元数据的主区域时要小心。如果某个区域未完成与当前主区域的元数据同步,将其升级为主区域时,它将无法处理剩余的条目,这些更改将会丢失。因此,我们建议等到区域的 radosgw-admin
同步状态跟上元数据同步后,再将该区域升级为主区域。同样,如果当前主区域正在处理对元数据的更改,此时将另一个区域升级为主区域,这些更改也可能会丢失。为避免此情况,我们建议关闭之前的主区域上的所有对象网关实例。升级另一个区域后,可以使用 radosgw-admin
周期提取命令获取它的新周期,然后可以重启动网关。
要将一个区域(例如,us
区域组中的 us-west
区域)升级为元数据的主区域,请在该区域运行以下命令:
cephuser@ogw >
radosgw-admin zone modify --rgw-zone=us-west --mastercephuser@ogw >
radosgw-admin zonegroup modify --rgw-zonegroup=us --mastercephuser@ogw >
radosgw-admin period update --commit
这样会生成一个新周期,并且 us-west
区域中的对象网关实例会将此周期发送到其他区域。
21.13.5 执行故障转移和灾难恢复 #
如果主区域发生故障,将故障转移到次要区域,以实现灾难恢复。
将次要区域设为主区域和默认区域。例如:
cephuser@adm >
radosgw-admin zone modify --rgw-zone=ZONE-NAME --master --default默认情况下,Ceph 对象网关以主动/主动配置运行。如果已将集群配置为以主动/被动配置运行,则次要区域是只读区域。删除
--read-only
状态可允许区域接收写入操作。例如:cephuser@adm >
radosgw-admin zone modify --rgw-zone=ZONE-NAME --master --default \ --read-only=false更新周期以使更改生效:
cephuser@adm >
radosgw-admin period update --commit重启动 Ceph 对象网关:
cephuser@adm >
ceph orch restart rgw
如果之前的主区域已恢复,请逆向操作。
在已恢复的区域中,从当前主区域提取最新的领域配置。
cephuser@adm >
radosgw-admin realm pull --url=URL-TO-MASTER-ZONE-GATEWAY \ --access-key=ACCESS-KEY --secret=SECRET将已恢复的区域设为主区域和默认区域:
cephuser@adm >
radosgw-admin zone modify --rgw-zone=ZONE-NAME --master --default更新周期以使更改生效:
cephuser@adm >
radosgw-admin period update --commit在已恢复的区域中重启动 Ceph 对象网关:
cephuser@adm >
ceph orch restart rgw@rgw如果次要区域需要采用只读配置,请更新次要区域:
cephuser@adm >
radosgw-admin zone modify --rgw-zone=ZONE-NAME --read-only更新周期以使更改生效:
cephuser@adm >
radosgw-admin period update --commit在次要区域中重启动 Ceph 对象网关:
cephuser@adm >
ceph orch restart@rgw