本章介绍对象网关相关管理任务的详细信息,例如,检查服务的状态,管理帐户、多站点网关或 LDAP 身份验证。
下面列出了对象网关的一些重要限制:
通过 S3 API 访问对象网关时,存储桶名必须符合 DNS 且允许使用短划线字符“-”。当通过 Swift API 访问对象网关时,您可使用支持 UTF-8 的字符(斜杠字符“/”除外)的任何组合。存储桶名最多可包含 255 个字符。存储桶名必须唯一。
虽然通过 Swift API 访问时,可使用任何基于 UTF-8 的存储桶名,但仍建议您根据 S3 命名限制对存储桶命名,以免在通过 S3 API 访问同一个存储桶时发生问题。
默认无限制(大约不超过 2^63)。
默认无限制(大约不超过 2^63)。
单次上载的上限为 5GB。更大的对象可分为多个部分上载。多部分块的最大数量为 10000。
HTTP 报头和请求限制取决于所使用的 Web 前端。默认 Beast 会将 HTTP 报头大小限制为 16 kB。
建议通过 DeepSea 基础结构来部署 Ceph 对象网关,具体做法是在 Salt Master 上的 policy.cfg
文件中添加相关的 role-rgw [...]
行,并运行所需的 DeepSea 阶段。
要在 Ceph 集群部署期间加入对象网关,请参见第 5.3 节 “集群部署”和第 5.5.1 节 “policy.cfg
文件”。
要在已部署的集群中添加对象网关角色,请参见第 2.2 节 “为节点添加新的角色”。
可使用 systemctl
命令来操作对象网关服务。您需要拥有 root
特权才能操作对象网关服务。请注意,GATEWAY_HOST 是您需要操作其对象网关实例的服务器的主机名。
对象网关服务支持以下子命令:
列显服务的状态信息。
如果服务尚未运行,则将它启动。
重启动服务。
停止正在运行的服务。
启用服务,以便在系统启动时自动启动该服务。
禁用服务,以便在系统启动时不自动启动该服务。
有关对象网关配置选项的列表,请参见第 16.3 节 “Ceph 对象网关”。
您可以使用与 S3 或 Swift 兼容的接口来与对象网关通讯。S3 接口与大部分 Amazon S3 RESTful API 都兼容。Swift 接口与大部分 OpenStack Swift API 都兼容。
这两个接口都要求创建特定的用户,并安装相关的客户端软件,以使用该用户的秘密密钥来与网关通讯。
要访问 S3 接口,需要一个 REST 客户端。S3cmd
是一个命令行 S3 客户端。您可以在 OpenSUSE Build Service 中找到它。该储存库包含既适用于 SUSE Linux Enterprise 发行套件又适用于基于 openSUSE 的发行套件的版本。
如果您想测试自己是否能够访问 S3 接口,也可以编写一个简短的 Python 脚本。该脚本将连接到对象网关,创建新存储桶,并列出所有存储桶。aws_access_key_id
和 aws_secret_access_key
的值取自第 17.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
要通过 Swift 接口访问对象网关,需要使用 swift
命令行客户端。该接口的手册页 man 1 swift
介绍了有关其命令行选项的详细信息。
从 SUSE Linux Enterprise 12 SP3 到 SUSE Linux Enterprise 15 的“Public Cloud”扩展模块中都随附了该包。在安装该包之前,需要激活该扩展模块并刷新软件储存库:
root #
SUSEConnect -p sle-module-public-cloud/12/x86_64
sudo zypper refresh
或者
root #
SUSEConnect -p sle-module-public-cloud/15/x86_64root #
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 替换为在第 17.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
需要创建用户、访问钥和机密才能让最终用户与网关交互。用户分两种类型:用户和子用户。与 S3 接口交互时使用用户,子用户是 Swift 接口的用户。每个子用户都与某个用户相关联。
也可以通过 DeepSea 文件 rgw.sls
添加用户。有关示例,请参见第 21.3.1 节 “NFS Ganesha 的不同对象网关用户”。
要创建 Swift 用户,请执行以下步骤:
要创建 Swift 用户(在我们的术语中称作子用户),需要先创建关联的用户。
cephadm@adm >
radosgw-admin user create --uid=USERNAME \
--display-name="DISPLAY-NAME" --email=EMAIL
例如:
cephadm@adm >
radosgw-admin user create \
--uid=example_user \
--display-name="Example User" \
--email=penguin@example.com
要创建用户的子用户(用于 Swift 接口),必须指定用户 ID(--uid=用户名)、子用户 ID 和该子用户的访问级别。
cephadm@adm >
radosgw-admin subuser create --uid=UID \
--subuser=UID \
--access=[ read | write | readwrite | full ]
例如:
cephadm@adm >
radosgw-admin subuser create --uid=example_user \
--subuser=example_user:swift --access=full
为用户生成秘密密钥。
cephadm@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 用户:
cephadm@adm >
radosgw-admin user create --uid=USERNAME \
--display-name="DISPLAY-NAME" --email=EMAIL
例如:
cephadm@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"}], [...]
删除 S3 用户与删除 Swift 用户的过程类似。不过,在删除 Swift 用户时,您可能需要同时删除该用户及其子用户。
要删除 S3 或 Swift 用户(包括其所有子用户),请在以下命令中指定 user rm
和用户 ID:
cephadm@adm >
radosgw-admin user rm --uid=example_user
要删除子用户,请指定 subuser rm
和子用户 ID。
cephadm@adm >
radosgw-admin subuser rm --uid=example_user:swift
可使用以下选项:
清除与该用户 ID 关联的所有数据。
清除与该用户 ID 关联的所有密钥。
删除某个子用户时,删除的是其对 Swift 接口的访问权限。该用户仍会保留在系统中。
访问网关时,access_key
和 secret_key
参数用于标识对象网关用户。更改现有用户密钥的过程与创建新用户密钥的过程相同,旧密钥将被重写。
对于 S3 用户,请运行以下命令:
cephadm@adm >
radosgw-admin key create --uid=EXAMPLE_USER --key-type=s3 --gen-access-key --gen-secret
对于 Swift 用户,请运行以下命令:
cephadm@adm >
radosgw-admin key create --subuser=EXAMPLE_USER:swift --key-type=swift --gen-secret
--key-type=类型
指定密钥的类型。值为 swift
或 s3
。
--gen-access-key
生成随机访问钥(默认针对 S3 用户)。
--gen-secret
生成随机秘密密钥。
--secret=密钥
指定秘密密钥,例如手动生成的密钥。
Ceph 对象网关允许您针对用户以及用户拥有的存储桶设置配额。配额包括一个存储桶中的最大对象数,以及最大存储大小 (MB)。
在启用用户配额之前,需要先设置该配额的参数:
cephadm@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
。存储桶配额将应用到用户拥有的存储桶。用户配额将应用到用户。
设置用户配额后,可启用该配额:
cephadm@adm >
radosgw-admin quota enable --quota-scope=user --uid=EXAMPLE_USER
要禁用配额,请执行以下命令:
cephadm@adm >
radosgw-admin quota disable --quota-scope=user --uid=EXAMPLE_USER
要列出配额设置,请执行以下命令:
cephadm@adm >
radosgw-admin user info --uid=EXAMPLE_USER
要更新配额统计数字,请执行以下命令:
cephadm@adm >
radosgw-admin user stats --uid=EXAMPLE_USER --sync-stats
Ceph 对象网关支持两个嵌入式 HTTP 前端:Beast 和 Civetweb。
Beast 前端使用 Boost.Beast 库处理 HTTP 分析,使用 Boost.Asio 库处理异步网络 I/O。
Civetweb 前端使用 Civetweb HTTP 库,该库属于 Mongoose 的分支。
您可以在 /etc/ceph/ceph.conf
文件中使用 rgw_frontends
选项来配置这两个前端。有关配置选项的列表,请参见第 16.3 节 “Ceph 对象网关”。
要让默认对象网关角色可使用 SSL 进行安全通讯,您需要拥有 CA 颁发的证书,或创建自我签名证书。为对象网关启用 HTTPS 的配置方法有两种,简单的方法是使用默认设置,高级方法可以微调 HTTPS 相关设置。
如果您已拥有 CA 签名的有效证书,请跳过本节。
默认情况下,DeepSea 预期证书文件位于 Salt Master 的 /srv/salt/ceph/rgw/cert/rgw.pem
下。它会将证书分发到具有对象网关角色的 Salt Minion 的 /etc/ceph/rgw.pem
下,以便 Ceph 读取。
以下过程说明如何在 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 /srv/salt/ceph/rgw/cert/rgw.pem
向证书文件追加密钥:
root@master #
cat rgw.key >> /srv/salt/ceph/rgw/cert/rgw.pem
默认情况下,对象网关节点上的 Ceph 会读取 /etc/ceph/rgw.pem
证书,并使用端口 443 进行 SSL 安全通讯。如果您不需要更改这些值,请执行以下步骤:
编辑 /srv/pillar/ceph/stack/global.yml
,添加下行:
rgw_init: default-ssl
将默认对象网关 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
运行 DeepSea 阶段 2、3 和 4 以应用这些更改:
root@master #
salt-run state.orch ceph.stage.2root@master #
salt-run state.orch ceph.stage.3root@master #
salt-run state.orch ceph.stage.4
如果您需要更改对象网关 SSL 设置的默认值,请执行以下步骤:
编辑 /srv/pillar/ceph/stack/global.yml
,添加下行:
rgw_init: default-ssl
将默认对象网关 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
编辑 /srv/salt/ceph/configuration/files/ceph.conf.d/rgw.conf
,更改默认选项,例如端口号或 SSL 证书路径,以反映您的设置。
运行 DeepSea 阶段 3 和 4 以应用这些更改:
root@master #
salt-run state.orch ceph.stage.3root@master #
salt-run state.orch ceph.stage.4
Beast 服务器可以绑定到多个端口。如果您需要使用 SSL 和非 SSL 两种连接来访问单个对象网关实例,这种做法将非常实用。两个端口的配置行如下所示:
[client.{{ client }}] rgw_frontends = beast port=80 ssl_port=443 ssl_certificate=/etc/ceph/rgw.pem
使用对象网关的多站点功能可以创建多个区域,并在这些区域之间镜像数据和元数据。同步扩展模块构建在多站点框架的基础上,可将数据和元数据转发到不同的外部层。利用同步扩展模块,可让系统在每当有数据发生更改(例如执行存储桶或用户创建等元数据操作)时即执行一组操作。当对象网关多站点更改最终在远程站点上保持一致时,更改将以异步方式传播。因而很多情况下都适合使用同步扩展模块,例如将对象存储备份到外部云集群、使用磁带机的自定义备份解决方案,或在 ElasticSearch 中为元数据编制索引。
所有同步扩展模块的配置方式都是相似的。您需要创建一个新区域(请参见第 17.13 节 “多站点对象网关”了解更多详细信息)并为其设置 --tier_type
选项,例如针对云同步扩展模块设置 --tier-type=cloud
:
cephadm@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
您可以使用以下命令来配置特定层:
cephadm@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \
--rgw-zone=ZONE-NAME \
--tier-config=KEY1=VALUE1,KEY2=VALUE2
配置中的 KEY 指定您希望更新的配置变量,VALUE 指定该变量的新值。使用句点可访问嵌套的值。例如:
cephadm@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 开头的存储桶创建新配置的命令如下所示:
cephadm@adm >
radosgw-admin zone modify --rgw-zonegroup=ZONE-GROUP-NAME \ --rgw-zone=ZONE-NAME \ --tier-config=profiles[].source_bucket=PREFIX'*'cephadm@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=键=值
参数来添加新的层配置条目。
您可以使用 --tier-config-rm=键
删除现有的条目。
同步扩展模块配置对于区域而言位于本地。同步扩展模块会确定区域是要导出数据,还是只能使用已在另一区域中修改的数据。从 Luminous 版本开始,支持的同步插件有 ElasticSearch
、rgw
和 log
,其中 rgw 是在区域之间同步数据的默认同步插件,log 是记录远程区域中发生的元数据操作的普通同步插件。以下各节内容包含了使用 ElasticSearch
同步扩展模块的区域示例。其过程与配置任何其他同步插件的过程都相似。
rgw
是默认的同步插件,不需要进行明确配置。
我们假设已根据第 17.13 节 “多站点对象网关”中所述创建了一个简单的多站点配置,它由 us-east
和 us-west
这两个区域组成。现在,我们添加第三个区域 us-east-es
,此区域只处理来自其他站点的元数据。此区域可与 us-east
位于同一 Ceph 集群中,也可位于不同的集群中。此区域只使用来自其他区域的元数据,此区域中的对象网关不会直接处理任何最终用户请求。
创建类似于第 17.13 节 “多站点对象网关”中所述区域的第三个区域,例如
cephadm@adm >
radosgw-admin
zone create --rgw-zonegroup=us --rgw-zone=us-east-es \ --access-key=SYSTEM-KEY --secret=SECRET --endpoints=http://rgw-es:80
可通过以下命令为此区域配置同步扩展模块
cephadm@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --tier-type=TIER-TYPE \ --tier-config={set of key=value pairs}
例如,在 ElasticSearch
同步扩展模块中运行以下命令
cephadm@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 选项,请参见第 17.8.3 节 “ElasticSearch 同步扩展模块”。
最后,更新周期
cephadm@adm >
radosgw-admin
period update --commit
现在,在区域中启动 radosgw
root #
systemctl
start ceph-radosgw@rgw.`hostname -s`root #
systemctl
enable ceph-radosgw@rgw.`hostname -s`
此同步扩展模块会将来自其他区域的元数据写入 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" } } }
指定要访问的 ElasticSearch 服务器端点。
(整数)数据同步初始化时将为 ElasticSearch 配置的分片数量。请注意,初始化之后将无法更改此数量。在此处进行任何更改都需要重构建 ElasticSearch 索引,并需要重新初始化数据同步进程。
(整数)数据同步初始化时将为 ElasticSearch 配置的副本数量。
(true | false) 指定是否将为所有用户自定义元数据编制索引,或者用户是否需要(在存储桶级别)配置应为哪些客户元数据项编制索引。此参数默认为 false
(逗号分隔的字符串列表)如果为空,则为所有存储桶编制索引。否则,只为此处指定的存储桶编制索引。可以提供存储桶前缀(例如“foo*”)或存储桶后缀(例如“*bar”)。
(逗号分隔的字符串列表)如果为空,将为所有所有者的存储桶编制索引(需遵守其他限制);否则,将只为指定所有者拥有的存储桶编制索引。也可以提供后缀和前缀。
(字符串)如果非空,则此字符串将用作 ElasticSearch 索引路径。否则,将在同步初始化时确定并生成索引路径。
指定 ElasticSearch 的用户名(如果需要身份验证)。
指定 ElasticSearch 的密码(如果需要身份验证)。
由于 ElasticSearch 集群现在存储对象元数据,因此务必确保 ElasticSearch 端点不会向公众公开,只有集群管理员可访问它们。向最终用户自己公开元数据查询会造成问题,因为我们希望该用户只查询自己的元数据,而不能查询任何其他用户的元数据,这就要求 ElasticSearch 集群像 RGW 所做的那样来对用户进行身份验证,而这就导致了问题发生。
从 Luminous 版本开始,元数据主区域中的 RGW 可处理最终用户请求。这样就无需向公众公开 ElasticSearch 端点,同时也解决了身份验证和授权问题,因为 RGW 本身就能对最终用户请求进行身份验证。出于此目的,RGW 在存储桶 API 中引入了可处理 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
本节介绍用于将区域数据同步到远程云服务的扩展模块。该同步是单向的,无法将数据从远程区域同步回其本地区域。此扩展模块的主要目的是实现面向多个云服务提供商的数据同步,当前仅支持与 AWS (S3) 兼容的云提供程序。
要将数据同步到远程云服务,您需要配置用户身份凭证。由于许多云服务都对每个用户可创建的存储桶数量设定了限制,因此您可以配置源对象与存储桶的映射,使不同的目标映射至不同的存储桶和存储桶前缀。请注意,系统不会保留源访问列表 (ACL)。可以将特定源用户的权限映射到特定的目标用户。
由于 API 存在限制,因此无法保留原始对象修改时间和 HTTP 实体标记 (ETag)。云同步扩展模块会将它们存储为目标对象的元数据属性。
下面提供了一些普通和非普通云同步扩展模块配置示例。请注意,普通配置可能会与非普通配置发生冲突。
{ "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_id”、“access_key”、“secret”、“endpoint”和“host_style”。
将用于特定连接的远程云访问密钥。
远程云服务的秘密密钥。
远程云服务端点的 URL。
访问远程云端点时要使用的主机类型(“path”或“virtual”)。默认值为“path”。
访问列表映射阵列。
每个“acl_mapping”结构都包含“type”、“source_id”和“dest_id”。它们将定义每个对象的 ACL 变化。ACL 变化允许将源用户 ID 转换为目标 ID。
ACL 类型:“id”定义用户 ID,“email”按电子邮件定义用户,“uri”按 uri(组)定义用户。
源区域中的用户 ID。
目标区域中的用户 ID。
用于定义目标路径创建方式的字符串。目标路径指定追加到源对象名称的前缀。可对目标路径进行配置,使其包含以下任何变量:
表示同步实例 ID 的唯一字符串。
区域组名称。
区域组 ID。
区域名称。
区域 ID。
源存储桶名称。
源存储桶所有者 ID。
例如:target_path = rgwx-ZONE-SID/OWNER/BUCKET
访问列表配置阵列。
每个配置均包含代表配置的“acls_id”和用于存放“acl_mappings”列表的“acls”阵列。
配置列表。每个配置均包含以下变量:
用于定义此配置源存储桶的存储桶名称或存储桶前缀(如果以 * 结尾)。
请参见上文的相关解释。
将用于此配置的连接 ID。
将用于此配置的 ACL 配置 ID。
云同步扩展模块仅适用于与 AWS S3 兼容的后端。该扩展模块提供了一些可配置项,用来调整它在访问 S3 云服务时的行为:
{ "multipart_sync_threshold": OBJECT_SIZE, "multipart_min_part_size": PART_SIZE }
针对大小大于或等于此值的对象,将使用多部分上载来与云服务进行同步。
通过多部分上载同步对象时所使用的部分大小下限。
存档同步扩展模块利用了对象网关中 S3 对象的版本控制功能。您可以配置一个存档区域,用来捕获其他区域中一段时间内出现的 S3 对象的不同版本。存档区域保留的版本历史只能通过与存档区域关联的网关来删除。
借助这样的体系结构,一些不受版本控制的区域可以通过自身的区域网关来镜像它们的数据和元数据,以便向最终用户提供高可用性,同时,存档区域会捕获所有数据更新,以便将它们合并为 S3 对象的版本。
通过在多区域配置中包含存档区域,您可以灵活地在一个区域中保留 S3 对象历史,同时能够节省其余区域中受版本控制的 S3 对象的副本原本需要的空间。
要使用存档扩展模块,您需要创建一个新区域,并将其层类型设置为 archive
:
cephadm@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
除了默认的本地用户身份验证以外,对象网关还能利用 LDAP 服务器服务来对用户进行身份验证。
对象网关从令牌提取用户的 LDAP 身份凭证。可以基于用户名构造搜索过滤器。对象网关使用配置的服务帐户在目录中搜索匹配的项。如果找到了某个项,对象网关会尝试使用令牌中的密码绑定到所找到的判别名。如果身份凭证有效,绑定将会成功,并且对象网关会授予访问权限。
您可以通过将搜索范围设置为特定的组织单位,或者指定自定义搜索过滤器(例如,要求特定的组成员资格、自定义对象类或属性),来限制允许的用户。
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 参数,以杜绝可能的问题。
/etc/ceph/ceph.conf
配置文件中的以下参数与 LDAP 身份验证相关:
rgw_ldap_uri
指定要使用的 LDAP 服务器。请务必使用 ldaps://FQDN:PORT
参数,以免公开传输明文身份凭证。
rgw_ldap_binddn
对象网关使用的服务帐户的判别名 (DN)。
rgw_ldap_secret
服务帐户的密码。
指定在目录信息树中搜索用户的范围,可以是用户的组织单位,或某个更具体的组织单位 (OU)。
rgw_ldap_dnattr
在构造的搜索过滤器中用来匹配用户名的属性。根据所用的目录信息树 (DIT),可能会是 uid
或 cn
。
rgw_search_filter
如果未指定,则对象网关会使用 rgw_ldap_dnattr
设置自动构造搜索过滤器。使用此参数能非常灵活地缩小所允许用户列表的范围。有关详细信息,请参见第 17.9.4 节 “使用自定义搜索过滤器来限制用户访问权限”。
可通过两种方式使用 rgw_search_filter
参数。
部分过滤器的示例:
"objectclass=inetorgperson"
对象网关将照常使用令牌中的用户名和 rgw_ldap_dnattr
的值生成搜索过滤器。然后,构造的过滤器将与 rgw_search_filter
属性中的部分过滤器合并。根据所用的用户名和设置,最终的搜索过滤器可能会变成:
"(&(uid=hari)(objectclass=inetorgperson))"
在这种情况下,仅当在 LDAP 目录中找到了用户“hari”,该用户具有对象类“inetorgperson”并且确实指定了有效密码时,才向他授予访问权限。
完整过滤器必须包含 USERNAME
令牌,在尝试身份验证期间,该令牌将替换为用户名。在这种情况下,不再使用 rgw_ldap_dnattr
参数。例如,要将有效用户限制为特定的组,可使用以下过滤器:
"(&(uid=USERNAME)(memberOf=cn=ceph-users,ou=groups,dc=mycompany,dc=com))"
memberOf
属性
在 LDAP 搜索中使用 memberOf
属性需要您实施的特定 LDAP 服务器提供服务器端支持。
radosgw-token
实用程序基于 LDAP 用户名和密码生成访问令牌。它会输出 base-64 编码字符串,即实际的访问令牌。请使用偏好的 S3 客户端(请参见第 17.5.1 节 “访问对象网关”),将该令牌指定为访问钥,并使用空秘密密钥。
tux >
export RGW_ACCESS_KEY_ID="USERNAME"tux >
export RGW_SECRET_ACCESS_KEY="PASSWORD"cephadm@adm >
radosgw-token --encode --ttype=ldap
访问令牌是一个 base-64 编码的 JSON 结构,包含明文形式的 LDAP 身份凭证。
对于 Active Directory,请使用 --ttype=ad
参数。
对象网关将存储桶索引数据存储在索引池中,该池默认为 .rgw.buckets.index
。如果将太多(成百上千个)对象放入单个存储桶中,并且不设置每个存储桶的最大对象数量配额 (rgw bucket default quota max objects
),索引池的性能可能会下降。存储桶索引分片可在允许每个存储桶中放入大量对象的同时,防止出现此类性能下降的情况。
如果随着存储桶的增大,其初始配置不再能满足需求,则需要对存储桶的索引池进行重分片。您可以使用自动联机存储桶索引重分片(请参见第 17.10.1.1 节 “动态重分片”),也可以手动脱机执行存储桶索引重分片(请参见第 17.10.1.2 节 “手动重分片”)。
从 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 起默认会禁用该功能,但我们建议您再次检查此设置。
cephadm@adm >
radosgw-admin reshard add \
--bucket BUCKET_NAME \
--num-shards NEW_NUMBER_OF_SHARDS
cephadm@adm >
radosgw-admin reshard list
cephadm@adm >
radosgw-admin reshard process
cephadm@adm >
radosgw-admin reshard status --bucket BUCKET_NAME
cephadm@adm >
radosgw-admin reshard cancel --bucket BUCKET_NAME
第 17.10.1.1 节 “动态重分片”所述的动态重新分片仅适用于简单对象网关配置。对于多站点配置,请使用本节中所述的手动重新分片。
要手动对存储桶索引执行脱机重分片,请使用以下命令:
cephadm@adm >
radosgw-admin bucket reshard
bucket reshard
命令执行以下操作:
为指定对象创建一组新的存储桶索引对象。
分散这些索引对象的所有条目。
创建新的存储桶实例。
列出新的存储桶实例以及存储桶,以便所有新的索引操作都能够应用到新的存储桶索引。
将旧的和新的存储桶 ID 打印到标准输出。
确保对存储桶执行的所有操作都已停止。
备份原始存储桶索引:
cephadm@adm >
radosgw-admin bi list \
--bucket=BUCKET_NAME \
> BUCKET_NAME.list.backup
对存储桶索引重分片:
cephadm@adm >
radosgw-admin reshard \
--bucket=BUCKET_NAME \
--num-shards=NEW_SHARDS_NUMBER
此命令还会将新的和旧的存储桶 ID 打印到其输出中。请记下旧存储桶 ID,清除旧的存储桶索引对象时需要用到它。
将旧存储桶索引列表与新存储桶索引列表进行比较,校验列出的对象是否正确。然后,清除旧的存储桶索引对象:
cephadm@adm >
radosgw-admin bi purge
--bucket=BUCKET_NAME
--bucket-id=OLD_BUCKET_ID
有两个选项会影响存储桶索引分片:
对于简单配置,请使用 rgw_override_bucket_index_max_shards
选项。
对于多站点配置,请使用 bucket_index_max_shards
选项。
将选项设为 0
将禁用存储桶索引分片。如果将其设为大于 0
的值,则会启用存储桶索引分片,并设置最大分片数。
下面的公式可帮助您计算建议的分片数:
number_of_objects_expected_in_a_bucket / 100000
注意,分片的最大数量为 7877。
打开 Ceph 配置文件,然后添加或修改以下选项:
rgw_override_bucket_index_max_shards = 12
要为对象网关的所有实例配置存储桶索引分片,请将 rgw_override_bucket_index_max_shards
添加到 [global]
段落。
要仅为对象网关的某个特定实例配置存储桶索引分片,请将 rgw_override_bucket_index_max_shards
添加到相关实例段落。
重启动对象网关。有关详细信息,请参见第 17.3 节 “操作对象网关服务”。
多站点配置可使用另一个索引池来管理故障转移。要为一个区域组内的区域配置一致的分片数量,请在该区域组的配置中设置 bucket_index_max_shards
选项:
将区域组配置导出到 zonegroup.json
文件:
cephadm@adm >
radosgw-admin zonegroup get > zonegroup.json
编辑 zonegroup.json
文件,为每个指定的区域设置 bucket_index_max_shards
选项。
重新设置区域组:
cephadm@adm >
radosgw-admin zonegroup set < zonegroup.json
更新周期:
cephadm@adm >
radosgw-admin period update --commit
OpenStack Keystone 是一项用于 OpenStack 产品的身份服务。您可以将对象网关与 Keystone 相集成,以设置接受 Keystone 身份验证令牌的网关。Ceph 对象网关端将会对 Keystone 授权可访问网关的用户进行校验,并视需要自动创建用户。对象网关会定期查询 Keystone,以获取已撤消令牌列表。
配置 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
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”意味着网关将不会尝试校验证书。
您可以使用以下选项配置 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 管理员用户项目。
归置目标用于控制哪些存储池与特定存储桶相关联。存储桶的归置目标是在创建存储桶时选择的,无法修改。您可通过运行以下命令来显示存储桶的“placement_rule”:
cephadm@adm >
radosgw-admin bucket stats
区域组配置包含一个归置目标列表,其中的初始目标名为“default-placement”。区域配置随后会将每个区域组归置目标名称映射到其本地存储。此区域归置信息包括表示存储桶索引的“index_pool”名称、表示不完整多部分上载相关元数据的“data_extra_pool”名称,以及表示每个存储类别的“data_pool”名称。
存储类别有助于自定义对象数据的归置。S3 存储桶生命周期规则可自动转换对象的存储类别。
存储类别根据归置目标定义。每个区域组归置目标会列出它的可用存储类别,其中初始类别名为“STANDARD”。区域配置负责为每个区域组的存储类别提供“data_pool”存储池名称。
您可以对区域组和区域使用 radosgw-admin
命令来配置其归置。可以使用以下命令来查询区域组归置配置:
cephadm@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",
...
}
要查询区域归置配置,请运行以下命令:
cephadm@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
命令提交对区域/区域组的更改后,更改即会生效。
要创建一个名为“temporary”的新归置目标,首先请将该归置目标添加到区域组:
cephadm@adm >
radosgw-admin zonegroup placement add \
--rgw-zonegroup default \
--placement-id temporary
然后为该目标提供区域归置信息:
cephadm@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
要向“default-placement”目标添加一个名为“COLD”的新存储类别,首先请将该存储类别添加到区域组:
cephadm@adm >
radosgw-admin zonegroup placement add \
--rgw-zonegroup default \
--placement-id default-placement \
--storage-class COLD
然后为该存储类别提供区域归置信息:
cephadm@adm >
radosgw-admin zone placement add \
--rgw-zone default \
--placement-id default-placement \
--storage-class COLD \
--data-pool default.rgw.cold.data \
--compression lz4
新存储桶默认会使用区域组的“default_placement”目标。您可以使用以下命令更改此区域组设置:
cephadm@adm >
radosgw-admin zonegroup placement default \
--rgw-zonegroup default \
--placement-id new-placement
Ceph 对象网关用户可以通过在用户信息中设置非空的“default_placement”字段来覆盖区域组的默认归置目标。同样,“default_storage_class”也可以覆盖默认应用于对象的“STANDARD”存储类别。
cephadm@adm >
radosgw-admin user info --uid testid
{
...
"default_placement": "",
"default_storage_class": "",
"placement_tags": [],
...
}
如果区域组的归置目标包含任何标记,则除非用户信息的“placement_tags”字段中至少包含一个相匹配的标记,否则用户将无法创建具有该归置目标的存储桶。这有助于限制对某些特定存储类型的访问。
radosgw-admin
无法直接修改这些字段,因此您需要手动编辑 JSON 格式:
cephadm@adm >
radosgw-admin metadata get user:USER-ID > user.jsontux >
vi user.json # edit the file as requiredcephadm@adm >
radosgw-admin metadata put user:USER-ID < user.json
采用 S3 协议创建存储桶时,可在 LocationConstraint
选项中提供归置目标,以覆盖用户和区域组的默认归置目标。
通常,LocationConstraint
需要与区域组的 api_name
相匹配:
<LocationConstraint>default</LocationConstraint>
您可以向 api_name
添加自定义归置目标(需在该自定义目标前加上一个冒号):
<LocationConstraint>default:new-placement</LocationConstraint>
采用 Swift 协议创建存储桶时,您可以在 HTTP 报头的“X-Storage-Policy”中提供归置目标:
X-Storage-Policy: NEW-PLACEMENT
所有归置目标均具有“STANDARD”存储类别,这是系统默认为新对象应用的存储类别。您可以使用对象的“default_storage_class”覆盖此默认值。
要创建不属于默认存储类别的对象,请在请求的 HTTP 报头中提供所需的存储类别名称。S3 协议使用“X-Amz-Storage-Class”报头,而 Swift 协议则使用“X-Object-Storage-Class”报头。
借助 S3 对象生命周期管理,您可以使用“Transition”(转换)操作来切换对象数据的存储类别。
一个或多个对象网关实例的逻辑分组。必须将区域组中的一个区域指定为主区域,负责处理所有存储桶和用户的创建。
一个区域组由多个区域组成。应设置一个将负责处理系统配置更改的主区域组。
用于存放整个系统索引的配置结构,例如,哪个区域组是主区域组、不同区域组之间的关系,以及存储策略等特定配置选项。
容纳区域组的容器。使用领域可在集群之间分隔区域组。可以创建多个领域,以便在同一集群中更轻松地运行完全不同的配置。
周期存放领域当前状态的配置结构。每个周期都包含一个唯一 ID 和一个版本号。每个领域都有一个关联的当前周期,存放区域组配置的当前状态和存储策略。非主区域发生任何配置更改都会使周期的版本号递增。将主区域更改为其他区域会触发以下更改:
生成具有新周期 ID 和版本号为 1 的新周期。
领域的当前周期会更新,以指向新生成的周期 ID。
领域的版本号将会递增。
您可将每个对象网关配置为参与联合体系结构,在活跃区域配置中工作,同时允许写入非主区域。
下面解释了联合体系结构的专用术语:
本示例重点说明如何创建包含三个不同区域的单个区域组,这三个区域会主动同步其数据。其中两个区域属于同一集群,第三个区域属于其他集群。在对象网关之间镜像数据更改时,不需要同步代理的参与。如此可大大简化配置模式和主动/主动配置。请注意,元数据操作(例如创建新用户)仍需要通过主区域处理。但是,数据操作(例如创建存储桶和对象)可由任意区域处理。
对象网关需要您在配置区域时创建与 S3 兼容的系统用户,以及他们的访问钥和秘密密钥。这样,另一个对象网关实例便可以使用该访问钥和秘密密钥远程提取配置。有关创建 S3 用户的详细信息,请参见第 17.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)
本示例介绍设置主区域的过程。我们假设有一个名为 us
的区域组,该区域组横跨美国,将作为我们的主区域组。此区域组将包含采用区域组-区域格式的两个区域。这只是我们一贯采用的格式,您可以选择偏好的格式。概括如下:
主区域组:美国:us
主区域:美国东部区域 1:us-east-1
次要区域:美国东部区域 2:us-east-2
次要区域:美国西部区域:us-west
此配置将属于名为 gold
的较大领域。us-east-1
和 us-east-2
区域属于同一个 Ceph 集群,us-east-1
是主区域。us-west
在另一个不同的 Ceph 集群中。
为对象网关配置了相应的权限后,它便可自行创建默认存储池。pg_num
和 pgp_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
替换为相应的区域名称即可。
配置名为 gold
的领域,并将其设为默认领域:
cephadm@adm >
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
将会递增。
采用默认设置安装对象网关时会创建名为 default
的默认区域组。由于我们不再需要默认区域组,因此将其删除。
cephadm@adm >
radosgw-admin zonegroup delete --rgw-zonegroup=default
创建名为 us
的主区域组。该区域组将管理区域组索引,并将更改传播到系统的其余组件。通过将某个区域组标记为默认区域组,可以明确指定要在后续命令中使用的 rgw-zonegroup 开关。
cephadm@adm >
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@adm >
radosgw-admin zonegroup default --rgw-zonegroup=us
现在,请创建一个默认区域并将其添加到默认区域组。请注意,您在执行元数据操作(例如创建用户)时将会用到此区域:
cephadm@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
{
"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@adm >
radosgw-admin zone default --rgw-zone=us-east-1cephadm@adm >
radosgw-admin zonegroup add --rgw-zonegroup=us --rgw-zone=us-east-1
要访问区域存储池,需要创建一个系统用户。请注意,在配置次要区域时,也需要这些密钥。
cephadm@adm >
radosgw-admin user create --uid=zone.user \
--display-name="Zone User" --access-key=$SYSTEM_ACCESS_KEY \
--secret=$SYSTEM_SECRET_KEY --system
由于您更改了主区域配置,因此需要提交这些更改,使其在领域配置结构中生效。最初的周期类似下方所示:
cephadm@adm >
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@adm >
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
}
在启动对象网关之前,需要在配置文件中指定对象网关区域和端口选项。有关对象网关及其配置的详细信息,请参见第 17 章 “Ceph 对象网关”。对象网关的配置段落应类似下方所示:
[client.rgw.us-east-1] rgw_frontends="beast port=80" rgw_zone=us-east-1
启动对象网关:
root #
systemctl start ceph-radosgw@rgw.us-east-1
区域组内的区域会复制所有数据,以确保各区域都具有相同数据。创建次要区域时,请在指定为次要区域提供服务的主机上执行以下所有操作。
在次要集群中,创建并配置名为 us-east-2
的次要区域。可在托管主区域本身的节点中执行以下所有命令。
要创建次要区域,请使用创建主要区域时所用的相同命令,不过需要去掉 master 标志:
cephadm@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"
}
通过执行周期更新并提交更改,通知所有网关有关系统索引中发生的新变化:
cephadm@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
}
调整次要区域的对象网关配置,并启动对象网关:
[client.rgw.us-east-2] rgw_frontends="beast port=80" rgw_zone=us-east-2
cephadm@adm >
sudo systemctl start ceph-radosgw@rgw.us-east-2
进行以下设置,以根据秘密密钥和访问密钥变量更新您的多站点仪表盘配置:
cephadm@adm >
ceph dashboard set-rgw-api-access-key ACCESS-KEYcephadm@adm >
ceph dashboard set-rgw-api-secret-key SECRET-KEY
将仪表盘默认用户设置为 admin
:
cephadm@adm >
ceph dashboard set-rgw-api-user-id admin
禁用仪表盘,然后将其重新启用以应用设置。
cephadm@adm >
ceph mgr module disable dashboardcephadm@adm >
ceph mgr module enable dashboard
如果对象网关节点发生了更改,或使用了负载均衡器来替代对象网关,请更新仪表盘:
cephadm@adm >
dashboard set-rgw-api-host HOSTcephadm@adm >
dashboard set-rgw-api-port PORT
第二个 Ceph 集群与初始集群属于同一个区域组,不过可以位于不同的地理位置。
由于已创建第一个网关的领域,因此可在此处提取该领域并将其设为默认领域:
cephadm@adm >
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@adm >
radosgw-admin realm default --rgw-realm=gold
通过提取周期,从主区域中获取配置:
cephadm@adm >
radosgw-admin period pull --url=http://rgw1:80 \
--access-key=$SYSTEM_ACCESS_KEY --secret=$SYSTEM_SECRET_KEY
将已创建的 us
区域组设置为默认区域组:
cephadm@adm >
radosgw-admin zonegroup default --rgw-zonegroup=us
使用相同的系统密钥创建名为 us-west
的新区域:
cephadm@adm >
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"
}
为了传播区域组索引更改,我们将更新并提交周期:
cephadm@adm >
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
}
请注意,周期的版本号已递增,表示配置发生了更改。
此操作与在第一个区域中启动对象网关类似。唯一的差别在于,对象网关区域配置应反映 us-west
区域名称:
[client.rgw.us-west] rgw_frontends="beast port=80" rgw_zone=us-west
启动第二个对象网关:
root #
systemctl start ceph-radosgw@rgw.us-west
如果主区域发生故障,将故障转移到次要区域,以实现灾难恢复。
将次要区域设为主区域和默认区域。例如:
cephadm@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --master --default
默认情况下,Ceph 对象网关将以主动/主动配置运行。如果已将集群配置为以主动/被动配置运行,则次要区域是只读区域。删除 --read-only 状态可让区域接收写入操作。例如:
cephadm@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --master --default \ --read-only=False
更新周期,使更改生效。
cephadm@adm >
radosgw-admin
period update --commit
最后,重启动 Ceph 对象网关。
root #
systemctl
restart ceph-radosgw@rgw.`hostname -s`
如果之前的主区域已恢复,请逆向操作。
在已恢复的区域中,从当前主区域提取周期。
cephadm@adm >
radosgw-admin
period pull --url=URL-TO-MASTER-ZONE-GATEWAY \ --access-key=ACCESS-KEY --secret=SECRET
将已恢复的区域设为主区域和默认区域。
cephadm@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --master --default
更新周期,使更改生效。
cephadm@adm >
radosgw-admin
period update --commit
然后,在已恢复的区域中重启动 Ceph 对象网关。
root #
systemctl
restart ceph-radosgw@rgw.`hostname -s`
如果次要区域需要采用只读配置,请更新次要区域。
cephadm@adm >
radosgw-admin
zone modify --rgw-zone=ZONE-NAME --read-only
更新周期,使更改生效。
cephadm@adm >
radosgw-admin
period update --commit
最后,在次要区域中重启动 Ceph 对象网关。
root #
systemctl
restart ceph-radosgw@rgw.`hostname -s`
您可以使用 HAProxy 负载平衡程序将所有请求分布在多个对象网关后端服务器之间。有关配置 HAProxy 的详细信息,请参见https://www.suse.com/documentation/sle-ha-15/book_sleha_guide/data/sec_ha_lb_haproxy.html。
下面是一种 HAProxy 的简单配置,使用循环复用平衡算法来平衡对象网关节点:
tux >
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
[...]