💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Ceph Object GateWay [<font color="red">Ceph Object Gateway</font>](https://docs.ceph.com/docs/master/glossary/#term-ceph-object-gateway)是基于librados构建的对象存储接口,为Ceph存储集群提供RESTful网关服务。[<font color="red">Ceph Object Gateway</font>](https://docs.ceph.com/docs/master/glossary/#term-ceph-object-gateway)支持两种接口: 1. **S3-compatible**:提供对象存储功能,兼容大部分Amazon S3 RESTful API接口。 2. **Swift-compatible**:提供对象存储功能,兼容大部分OpenStack Swift API接口。 Ceph对象存储使用Ceph Object GateWay守护进程,它是一个HTTP服务,用来与Ceph存储集群通信。由于Ceph对象网关提供了兼容OpenStack Swift和Amazon S3的接口,所以它有自己的用户管理。Ceph对象网关可以存储来自同一Ceph存储集群的Ceph文件系统客户端或Ceph块设备客户端的数据。S3和Swift APIs共享一套通用的命名空间,所以你可以使用一种API来写入数据,用另一种来检索它们。 ![Ceph Object Gateway](https://img.kancloud.cn/1d/f0/1df0b7118b3df400e2d2f4e7ac63b25a_593x183.png) > **Note**:Ceph对象存储并不需要Ceph元数据服务。 ## 安装Ceph对象网关 从*firefly*(v0.80)开始,Ceph对象网关运行在Civetweb(被嵌入到ceph-radosgw守护进程中)上,而不是Apache和FastCGI。使用Civetweb简化了Ceph对象网关的安装和配置。 > **Note**:要运行Ceph对象网关服务,你应该拥有一个运行中的Ceph存储集群,网关服务器应该有权访问公共网络。 ### 执行安装前的准备 查看[<font color="red">此处</font>](https://docs.ceph.com/docs/master/start/quick-start-preflight)并在你的Ceph对象网关节点上执行预安装操作。额外说明,在你的Ceph Deploy用户上,你应该禁用*requiretty*,设置SELinux为*Permissive*,并设置Ceph Deploy用户为无密码的sudo用户。就Ceph对象网关而言,在生产环境中你应该开放Civetweb使用的端口。 > **Note**:Civetweb默认使用7480端口。 ### 安装Ceph对象网关 从你的管理员服务的工作目录安装Ceph对象网关包到Ceph对象网关节点。例如: > ceph-deploy install --rgw \<gateway-node1> [\<gateway-node2> ...] `ceph-common`包是依赖项,所以ceph-deploy也将安装它。ceph CLI工具是管理员需要的。要使你的Ceph对象网关成为管理员节点,需要在你的管理员服务的工作目录下执行以下命令: > ceph-deploy admin \<node-name> ### 创建网关实例 从你的管理员服务的工作目录,在Ceph对象网关节点上创建Ceph对象网关实例。例如: > ceph-deploy rgw create \<gateway-node1> 网关运行起来后,像下面这样,你可以使用无认证的请求在7489端口上访问到: > http://client-node:7480 如果网关实例正确运行,你将得到如下响应: ```xml <?xml version="1.0" encoding="UTF-8"?> <ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <Owner> <ID>anonymous</ID> <DisplayName></DisplayName> </Owner> <Buckets> </Buckets> </ListAllMyBucketsResult> ``` 如果你的节点遇到问题或你想重新开始,执行以下操作清除配置: > ceph-deploy purge \<gateway-node1> [\<gateway-node2>] > ceph-deploy purgedata \<gateway-node1> [\<gateway-node2>] 如果你执行了purge操作,那么你必须重新安装Ceph。 ### 修改默认端口 默认情况下Civetweb运行在7480端口上。要改变默认端口(例如,改到80端口),修改你管理员服务的工作目录下的Ceph配置文件。增加一节条目[client.rgw.\<gateway-node>],使用你的Ceph对象网关节点的简写名称(即,hostname -s得到的)替换\<gateway-node>。 > **Note**:从v11.0.1开始,Ceph对象网关**支持**SSL。如何设置详见[<font color="red">Civetweb使用SSL</font>](https://docs.ceph.com/docs/master/install/install-ceph-gateway/#id2)。 例如,如果你的节点名称为gateway-node1,在[global]章节下添加: ```text [client.rgw.gateway-node1] rgw_frontends = "civetweb port=80" ``` > **Note**:确保在*rgw_frontends*键值对中`port=<port-number>`之间没有留下空格。[client.rgw.gateway-node1]头将Ceph配置文件中的这一部分标识为配置Ceph存储集群客户端,其中客户端的类型是Ceph对象网关(即,rgw),实例的名称为gateway-node1。 将更新的配置文件推送到你的Ceph对象网关节点(和其它节点): > ceph-deploy --overwrite-conf config push \<gateway-node> [\<other-nodes>] 要使新设置的端口生效,需要重启Ceph对象网关: > sudo systemctl restart ceph-radosgw 最后,检查你所选的端口在防火墙上是否开放(例如,80端口)。如果没有开放,添加端口并重新导入防火墙配置。如果你使用的是`firewalld`,执行: > sudo firewalld-cmd --list-all > sudo firewalld-cmd --zone-public --add-port 80/tcp --permanent > sudo firewalld-cmd --reload 如果你使用的是`iptables`,执行: > sudo iptables --list > sudo iptables -I INPUT l -i \<iface> -p tcp -s \<ip-address>/\<netmask> --dprot 80 -j ACCEPT 使用你的Ceph对象网关节点的相关信息替换\<iface>和\<ip-address>/\<netmask>。 完成iptables的配置之后,你必须确保你的修改是持续不变的,这样在重启你的Ceph对象网关节点之后,修改也会生效。执行: > sudo apt-get install iptables-persistent 这将会打开一个UI终端。选择`yes`选项将当前的IPv4配置规则保存到`/etc/iptables/rules.v4`中,将当前的IPv6配置规则保存到`/etc/iptables/rules.v6`中。 你上一步设置的IPv4配置规则将会导入到`/etc/iptables/rules.v4`中,即使重启之后也会生效。 如果你在安装iptables-persistent之后添加新的IPv4规则,你必须将它添加到规则文件中。在这种情况下,使用root用户执行下列操作: > iptables-save > /etc/iptables/rules.v4 ### Civetweb使用SSL 在Civetweb使用SSL之前,你需要一个匹配主机名的证书,它将用来访问Ceph对象网关。为了更灵活你可能需要一个有*subject alternate name*字段的证书。如果你想要使用S3风格的子域([<font color="red">添加通配符到DNS</font>](https://docs.ceph.com/docs/master/install/install-ceph-gateway/#id3)),你需要一个*通配符*证书。 Civetweb要求在一个文件中提供服务密钥,服务证书,其它CA或中间证书。上述的每一项都必须是*pem*格式的。因为包含了服务密钥,所以这个组合文件应该避免非认证访问。 要配置ssl选项,需要在端口后追加s。例如: ```text [client.rgw.gateway-node1] rgw_frontends = civetweb prot=443s ssl_certificate=/etc/ceph/private/keyandcert.pem ``` 以下是在Luminous版中新增的。 Civetweb可以绑定到多个端口,在配置文件中用 **\+** 分隔。适用于单个rgw实例中同时使用ssl和non-ssl连接的使用场景。例如: ```text [client.rgw.gateway-node1] rgw_frontends = civetweb prot=80+443s ssl_certificate=/etc/ceph/private/keyandcert.pem ``` ### 额外的Civetweb配置选项 可以在ceph.conf文件中的**Ceph Object Gateway**章节部分为嵌入的Civetweb web服务器调整一些额外的配置选项。支持的选项列表,包括示例,详见[<font color="red">HTTP Forntends</font>](https://docs.ceph.com/docs/master/radosgw/frontends)。 ### 从Apache迁移到Civetweb 如果你使用v0.80或之前的Ceph存储在Apache和FastCGI上运行Ceph对象网关,所以你已经使用ceph-radosgw守护进程运行Civetweb-it,默认情况下它运行在7480端口,所以它不会与你的Apache和FastCGI安装或其它常用web服务端口冲突。迁移到使用Civetweb基本上需要删除你的Apache安装。这样,你必须从你的Ceph配置文件中移除Apache和FastCGI,然后重新设置rgw_frontends为Civetweb。 返回使用ceph-deploy安装Ceph对象网关说明,注意配置文件中只有一条rgw_frontends设置(并且假定你选择修改默认的端口)。ceph-deploy工具创建数据目录和密钥环,密钥环放在`/var/lib/ceph/radosgw/{rgw-intance}`目录。守护进程可在默认位置找到,你可能在你的Ceph配置文件中指定了不同的目录。此时你已经准备好了密钥和数据目,如果你使用默认路径意外的位置,你需要在你的Ceph配置文件中声明这些路径。 典型的基于Apache部署的Ceph对象网关配置文件类似于下面的内容: 在Red Hat Enterprise Linux: ```text [client.radosgw.gateway-node1] host = {hostname} keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = "" log file = /var/log/radosgw/client.radosgw.gateway-node1.log rgw frontends = fastcgi socket\_port=9000 socket\_host=0.0.0.0 rgw print continue = false ``` 在Ubuntu: ```text [client.radosgw.gateway-node] host = {hostname} keyring = /etc/ceph/ceph.client.radosgw.keyring rgw socket path = /var/run/ceph/ceph.radosgw.gateway.fastcgi.sock log file = /var/log/radosgw/client.radosgw.gateway-node1.log ``` 要修改它来使用Civetweb,只需要移除Apache特定的设置,比如rgw_socket_path和rgw_print_continue。然后,修改rgw_frontends设置,使用Civetweb取代Apache FastCGI和指定你选择使用的端口。例如: ```text [client.radosgw.gateway-node1] host = {hostname} keyring = /etc/ceph/ceph.client.radosgw.keyring log file = /var/log/radosgw/client.radosgw.gateway-node1.log rgw_frontends = civetweb port=80 ``` 最后,重启Ceph对象网关。在Red Hat Enterprise Linux上执行: > sudo systemctl restart ceph-radosgw.service Ubuntu上执行: > sudo service radosgw restart id=rgw.\<short-hostname> 如果你使用的端口为开放,你需要在你的防火墙上开放端口。 ### 配置桶分片 Ceph对象网关在index_pool中存储桶索引数据,默认为`.rgw.buckets.index`。有时,用户喜欢在一个桶中放入很多对象(成百上万的对象)。如果不使用网关管理界面为每个存储桶设置最大对象数的配额,那么当用户将大量对象放入存储桶时,存储桶索引会遭受严重的性能下降。 在Ceph v0.94,你可以对存储桶索引进行分片,以防止允许单个存储桶存储大量对象时出现性能瓶颈。`rgw_overrode_bucket_max_shards`设置允许你设置每个存储桶的最大分片数量。其默认值为0,意味着默认关闭存储桶索引分片。 要启用存储桶索引分片,只需设置`rgw_overrode_bucket_max_shards`大于0即可。 为了简化配置,你可以在你的Ceph配置文件中添加`rgw_overrode_bucket_max_shards`。在[global]下添加它来创建系统级别的变量。你也可以在你的Ceph配置文件中未每一个实例设置它。 一旦在你的Ceph配置文件中改变了你的存储桶分片配置,你需要重启你的网关。在Red Hat Enterprise Linux上执行: > sudo systemctl restart ceph-radosgw.service 在Ubuntu上: > sudo service radosgw restart id=rgw.\<short-hostname> 对于联合配置,每个区域对于故障转移可能有不同的index_pool设置。要使zonegroup区域的值保持一致,你可以在网关的zonegroup配置中设置`rgw_override_bucket_index_max_shards`。例如: > radosgw-admin zonegroup get > zonegroup.json 打开zonegroup.json文件,为每个命名的区域设置`bucket_index_max_shards`。保存文件,重置zonegroup。例如: > radosgw-admin zonegroup set < zonegroup.json 一旦你更新了你的zonegroup,更新并提交。例如: > radosgw-admin period update --commit > **Note**:将索引池(对于每个区域,如果适用)映射到基于SSD的OSD的CRUSH规则也可以有助于桶索引性能。 ### 添加通配符到DNS 要将Ceph用在S3风格的子域(例如,bucket-name.domain-name.com)中,你需要将通配符添加到与ceph-radosgw守护进程一起使用的DNS服务器的DNS记录中。 DNS的地址必须在Ceph配置文件中用`rgw dns name = {hostname}`指明设置。 对于dnsmasq,条件如下在主机名前加上“.”做前缀的地址设置: > address=/.{hostname-or-fqdn}/{host-ip-address} 例如: > address=/.gateway-node1/192.168.122.75 对于bind,添加通配符到DNS记录。例如: ```bash $TTL 604800 @ IN SOA gateway-node1. root.gateway-node1. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL ; @ IN NS gateway-node1. @ IN A 192.168.122.113 * IN CNAME @ ``` 重启你的DNS服务,并使用子域来ping你的服务,来确保你的DNS配置如预期一样工作: > ping mybucket.{hostname} 例如: > ping mybucket.gateway-node1 ### 添加调试(必要时) 完成设置过程后,如果遇到配置问题,可以在Ceph配置文件的[global]部分添加调试并重新启动网关以帮助解决任何配置问题。例如: ```text [global] #append the following in the global section. debug ms = 1 debug rgw = 20 ``` ### 使用网关 要使用REST接口,首先要为S3接口创建一个初始Ceph对象网关用户,然后为Swift接口创建一个子用户。最后你需要确认创建的用户能够访问到网关。 #### 为S3访问创建RADOSGW用户 radosgw用户需要被创建和准许访问。`man radowgw-admin`命令将提供额外的命令选项信息。 要创建用户,在网关主机执行如下操作: > sudo radosgw-admin user create --uid="testuser" --display-name="First User" 该命令的输出信息类似下面的: ```json { "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [], "keys": [{ "user": "testuser", "access_key": "I0PJDPCIYZ665MW88W9R", "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA" }], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": [] } ``` > **Note**:key->access_key和key->secret_key的值需要用于访问认证。 #### 创建Swift用户 如果需要Swift访问类型的话,Swift子用户才被创建。创建Swift用户需要两步。第一步创建用户,第二步创建密钥。 在网关主机上执行下列步骤: 创建Swift用户: > sudo radosgw-admin subuser create --uid=testuser --subuser=testuser:swift --access=full 返回信息类似下面: ```json { "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [{ "id": "testuser:swift", "permissions": "full-control" }], "keys": [{ "user": "testuser:swift", "access_key": "3Y1LNW4Q6X0Y53A52DET", "secret_key": "" }, { "user": "testuser", "access_key": "I0PJDPCIYZ665MW88W9R", "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA" }], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": [] } ``` 创建密钥: > sudo radosgw-admin key create --subuser=testuser:swift --key-type=swift --gen-secret 返回信息类似下面: ```json { "user_id": "testuser", "display_name": "First User", "email": "", "suspended": 0, "max_buckets": 1000, "subusers": [{ "id": "testuser:swift", "permissions": "full-control" }], "keys": [{ "user": "testuser:swift", "access_key": "3Y1LNW4Q6X0Y53A52DET", "secret_key": "" }, { "user": "testuser", "access_key": "I0PJDPCIYZ665MW88W9R", "secret_key": "dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA" }], "swift_keys": [{ "user": "testuser:swift", "secret_key": "244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF\/IA" }], "caps": [], "op_mask": "read, write, delete", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "user_quota": { "enabled": false, "max_size_kb": -1, "max_objects": -1 }, "temp_url_keys": [] } ``` #### 访问确认 #### 测试S3访问 你需要编写和执行Python脚本来确认S3访问。S3访问测试脚本会连接radosgw,创建一个新的存储桶并列出所有的存储桶。`aws_access_key_id`和`aws_secret_access_key`的值通过`radosgw-admin`命令从返回的`access_key`和`secret_key`获取。 执行下列步骤: 1. 你需要安装`python-boto`包: > sudo yum install python-boto 2. 创建Python脚本: > vi s3test.py 3. 添加下列信息到文件中: ```python import boto.s3.connection access_key = 'I0PJDPCIYZ665MW88W9R' secret_key = 'dxaXZ8U90SXydYzyS5ivamEP20hkLSUViiaR+ZDA' conn = boto.connect_s3( aws_access_key_id=access_key, aws_secret_access_key=secret_key, host='{hostname}', port={port}, is_secure=False, calling_format=boto.s3.connection.OrdinaryCallingFormat(), ) bucket = conn.create_bucket('my-new-bucket') for bucket in conn.get_all_buckets(): print "{name} {created}".format( name=bucket.name, created=bucket.creation_date, ) ``` 使用你在网关服务器上配置的主机名称替换`{hostname}`,例如gatewayhost。使用你选择的Civetweb端口替换`{port}`。 4. 执行脚本: > python s3test.py 输出类似下面的信息: > my-new-bucket 2015-02-16T17:09:10.000Z #### 测试Swift访问 Swift访问的确认是通过Swift命令行客户端。`man swift`命令将提供额外的命令选项信息。 要安装swift客户端,执行下列命令。在Red Hat Enterprise Linux: > sudo yum install python-setuptools > sudo easy_install pip > sudo pip install --upgrade setuptools > sudo pip install --upgrade python-swiftclient 在Debian系: > sudo apt-get install python-setuptools > sudo easy_install pip > sudo pip install --upgrade setuptools > sudo pip install --upgrade python-swiftclient 要测试swift访问,执行下列命令: > swift -V 1 -A http://{IP ADDRESS}:{port}/auth -U testuser:swift -K '{swift_secret_key}' list 使用网关服务器的公网IP替换`{IP ADDRESS}`,`{swift_secret_key}`的值来自为*swift*用户创建密钥执行的`radosgw-admin`命令。使用你选择的Civetweb端口(例如,默认的7480)替换`{port}`。如果你没有替换,将使用默认的80端口。 例如: > swift -V 1 -A http://10.19.143.116:7480/auth -U testuser:swift -K '244+fz2gSqoHwR3lYtSbIyomyPHf3i7rgSJrF/IA' list 输出应该是: > my-new-bucket ## HTTP前端 Ceph对象网关支持两种通过`rgw_frontends`配置的嵌入的HTTP前端库。详细语法,详见[<font color="red">配置引用</font>](https://docs.ceph.com/docs/master/radosgw/config-ref)。 ### <font color="red">BEAST</font> 自Mimic引入。 beast前端使用Boost。Beast库解析HTTP,Boost.Asio库实现异步网络I/O。 #### <font color="red">选项</font> ##### port和ssl_port **描述**:设置ipv4和ipv6监听端口。可多次执行,如`port=80,port=8000`。 **类型**:Integer **默认值**:80 ##### endpoint和ssl_endpoint **描述**:设置监听地址,以点分隔的10进制IPV4地址或方括号括起来的16进制的IPV6地址。指定IPV6终端的话将只监听IPV6地址。默认普通终端使用80端口,SSL终端使用443端口。可以设置多个,例如:`endpoint=[::1] endpoint=192.168.0.100:8000`。 **类型**:Integer **默认值**:None ##### ssl_certificate **描述**:SSL-enabled终端使用的SSL证书的路径 **类型**:String **默认值**:None ##### ssl_private_key **描述**:可选项,SSL-enabled终端使用的私钥文件路径。如果未设置,ssl_certificate文件将被作为私钥使用。 **类型**:String **默认值**:None ##### tcp_nodelay **描述**:如果设置socket选项,连接时将禁用Nagel算法,这意味着包会尽可能快的发送,而不是等待全部数据或超时。 $\qquad \qquad$ 1 所有socket禁用Nagel算法。 $\qquad \qquad$ 0 使用默认:启用Nagel算法 **类型**:Integer(0或1) **默认**:0 ### <font color="red">Civetweb</font> 自Firefly引入。 civetweb前端使用Civetweb HTTP库,是Mongoose的一个分支。 #### <font color="red">选项</font> ##### port **描述**:设置监听端口。对于SSL-enabled端口,添加`s`后缀,比如443s。要绑定执行IPv4或IPv6地址,使用格式`address:port`。多个端口使用`+`分隔,例如`127.0.0.1:8000+443s`,或者通过提供多个选择,例如`port=8000 port=443s`。 **类型**:String **默认值**:7480 ##### num_threads **描述**:设置Civetweb用来处理传入的HTTP连接的线程数。 **类型**:Integer **默认值**:rgw_thread_pool_size ##### request_timeout_ms **描述**:设置Civetweb放弃连接之前等待传入数据的时间上限,单位毫秒。 **类型**:Integer **默认值**:30000 ##### access_log_file **描述**:存储访问日志的文件的路径。可以是绝对路径,也可以是相对路径。如果缺失(默认),则不记录访问信息。 **类型**:String **默认值**:EMPTY ##### error_log_file **描述**:存储错误日志的文件的路径。可以是绝对路径,也可以是相对路径。如果缺失(默认),则不记录错误信息。 **类型**:String **默认值**:EMPTY 下面是包含上述选项设置的`/etc/ceph/ceph.conf`文件示例: ```text [client.rgw.gateway-node1] rgw_frontends = civetweb request_timeout_ms=30000 error_log_file=/var/log/radosgw/civetweb.error.log access_log_file=/var/log/radosgw/civetweb.access.log ``` 完整的支持选项列表,详见[<font color="red">这里</font>](https://civetweb.github.io/civetweb/UserManual.html)。 ### <font color="red">通用选项</font> 有些选项是通用的,被所有的前端所支持: #### prefix **描述**:前缀字符是插入到所有URI中的。例如,仅支持swift前端,它的uri前缀是`/swift`。 **类型**:String **默认值**:None ## 归置组和存储类别 ### <font color="red">归置标签</font> *自Jewel引入*。 归置标签管理着[<font color="red">资源池</font>](https://docs.ceph.com/docs/master/radosgw/pools)与特定存储桶之间的关系。存储桶的归置标签在创建时选定,并且之后无法改变。`radosgw-admin bucket status`命令可以陈列出它的归置规则(placement_rule)。 条带组配置包含了一个初识标签名为`default-palcement`的归置标签列表。之后的条带化配置将每一个条带组的归置标签映射到它的本地存储。条带化归置信息包括存储桶索引的索引池名称、不完整分段上传元数据的data_extra_pool名、每个存储类别的data_pool名称。 ### <font color="red">存储类别</font> *自Nautilus引入*。 存储类型被用来改进对象数据的归置。S3 Bucket Lifecycle规则可以自动化两个存储类型之间的对象转换。 存储类型被定义在归置标签的条目中。每一个条带组的归置标签罗列出它可用的存储类型,初始化类型名为STANDARD。条带化配置负责为条带组的每个存储类提供data_pool池名称。 ### <font color="red">条带组/条带化配置</font> 使用`radosgw-admin`命令在条带组合条带上执行归置配置。 条带组的归置配置请求如下: ```bash $ 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", ... } ``` 条带的归置配置请求如下: ```bash $ 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 } } ], ... } ``` > **Note**:如果你没有预习[多点配置](https://docs.ceph.com/docs/master/radosgw/multisite),默认的条带和条带组为你而建,除非Ceph对象网关重启,否则对条带/条带组的修改都不会生效。如果你为多站点创建了一个区域,一旦使用`radosgw-admin update --commit`命令将修改提交,条带/条带组更改将会生效。 #### 添加归置标签 要创建一个名为temporary的新归置标签,始于将其添加到条带组: ```bash $ radosgw-admin zonegroup placement add \ --rgw-zonegroup default \ --placement-id temporary ``` 然后为这个标签提供条带化归置信息: ```bash $ 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 ``` #### 添加存储类型 添加一个名为COLD的新的存储类到default-placement标签中,始于将其添加到条带组: ```bash $ radosgw-admin zonegroup placement add \ --rgw-zonegroup default \ --placement-id default-placement \ --storage-class COLD ``` 然后为这个存储类型提供条带化归置信息: ```bash $ radosgw-admin zone placement add \ --rgw-zone default \ --placement-id default-placement \ --storage-class COLD \ --data-pool default.rgw.cold.data \ --compression lz4 ``` ### <font color="red">自定义归置</font> #### 默认归置 默认情况下,新的存储桶将使用条带组的default-placement标签。条带组的设置可以被改变: ```bash $ radosgw-admin zonegroup placement default \ --rgw-zonegroup default \ --placement-id new-placement ``` #### 用户归置 Ceph对象网关用户可以通过在用户信息中设置一个非空的default-placement来覆盖条带组默认的归置标签。简言之,default_storage_class可以覆盖STANDARD提供给对象的默认存储类型。 ```bash $ radosgw-admin user info --uid testid { ... "default_placement": "", "default_storage_class": "", "placement_tags": [], ... } ``` 如果条带组的归置标签包含任何标记,用户将无法使用该归置标签创建存储桶,除非其用户信息在其placement_tags字段中包含至少一个匹配的标记。这对于限制对某些存储类型的访问非常有用。 radosgw-admin命令不能直接修改那些字段,所以必须手动编辑json文件: ```bash $ radosgw-admin metadata get user:<user-id> > user.json $ vi user.json $ radosgw-admin metadata put user:<user-id> < user.json ``` #### S3存储桶归置 当使用S3协议创建存储桶是,归置标签可以作为LocationConstraint的一部分被提供,用来覆盖来自用户和条带组的默认归置标签。 通常,LocationConstraint必须匹配条带组的api名称: ```xml <LocationConstraint>default</LocationConstraint> ``` 自定义的归置标签可以被添加到“:”之后: ```xml <LocationConstraint>default:new-placement</LocationConstraint> ``` #### Swift存储桶归置 当使用Swift协议创建存储桶时,归置标签可在HTTP头**X-Storage-Policy**提供: ``` X-Storage-Policy: new-placement ``` ### <font color="red">使用存储类型</font> 所有的归置标签都有一个STANDARD存储类型,默认下新对象创建时提供。用户可以使用它`default_storage_class`覆盖默认值。 要创建一个非默认存储类型的对象,在请求的HTTP头中提供存储类型名称即可。S3协议使用**X-Amz-Storage-Class**头,Swift协议使用**X-Object-Storage-Class**头。 然后,可以使用S3对象生命周期管理通过使用Transition操作在存储类型间移动对象数据。