OpenStack对象存储管理手册(8) OpenStack对象存储系统管理-6

来源:互联网 发布:国家网络信息安全中心 编辑:程序博客网 时间:2024/05/31 06:21

4. OpenStack对象存储系统管理

4.9 通过设置速率限制来限制资源

       OpenStack对象存储是在你配置代理服务器时作为中间件插件使用的。当有对账户和容器的sqlite数据库的写入请求时会用到速率限制。它使用memcached,依赖于高度时间同步的代理服务器。速率限制受到代理服务器时钟精度的限制。

4.9.1 配置rate limiting

       所有的配置都是可选的。如果不提供账户或容器的限制的话那就没有速率限制。可配置的选项包括:

选项

默认

描述

Clock_accuracy

1000

代表代理服务器间时钟的精度。1000表示所有代理服务器间时钟误差不超过1ms。速率限制不应该超过时钟的精度。

Max_sleep_time_seconds

60

如果必须的休眠时间超过了该值,那么应用程序会返回一个498响应。

Log_sleep_time_seconds

0

在速率限制中考虑可见性,设置这一值大于0并且所有的休眠时间大于这个数值得将被记录。

Log_name

Swift

Log使用的名字

Log_facility

LOG_LOCAL0

系统log设备

Log_level

INFO

Log等级

Log_headers

False

如果是true,就记录每个响应头

Account_ratelimit

0

如果设置了,会限制所有到/account_name的请求和到account_name/container_name的PUT。该值为每秒的请求数

Account_whitelist

‘’

以逗号分隔的不会被限制的账户名列表

Account_blacklist

‘’

逗号分隔的被禁止的账户名列表。返回497响应

Container_ratelimit_size

‘’

当设置为container_limit_x = r :对于大小为x的容器,限制的请求数为r次每秒。使用/a/c/o来限制PUT,DELETE和POST请求。

Rate_buffer_seconds

5

速度计数器终止并允许追赶的秒数(以一个比已登录更快的速度)。一个更大的数将会在速率上产生更大的峰值但是更好的平均精度。

       容器速率限制以给定的值线性地插入。例如:

4.10 其他的特征

       这一节详细阐述Swift的一些其他特性及其配置。

 

4.10.1 健康检查

       健康检查提供一个简单的用来监控swift代理服务器是否处于活跃状态的方法。如果代理服务器可通过path/healthcheck访问到,它会在包体中返回“OK”。

Proxy-server.conf中filter:healthcheck的配置选项。

选项

默认

描述

Log_name

Swift

Log使用的标签

Log_facility

LOG_LOCAL0

系统日志设施

Log_level

INFO

Log等级

 

4.10.2 域重映射

       域重映射是个中间件,它能够把一个域的账户和容器部分翻译成代理服务器能够理解的路径参数。

Proxy-server.conf中filter:domain_remap的配置选项

选项

默认

描述

Log_name

Swift

Log使用的标签

Log_facility

LOG_LOCAL0

系统日志设施

Log_level

INFO

Log等级

Log_headers

False

如果是true,记录每个响应的消息头

Path_root

V1

根路径

Reseller_prefixes

AUTH

代理前缀

Storage_domain

Example.com

用来重映射的域

 

4.10.3 CNAME查找

       CNAME查找是一个中间件,通过记录在DNS中查找给定域的CNAME,将host header中的未知域翻译成以配置过的storage_domain结尾的东西。

Proxy-server.conf中filter:cname_lookup的配置选项

选项

默认

描述

Log_name

Swift

Log使用的标签

Log_facility

LOG_LOCAL0

系统日志设施

Log_level

INFO

Log等级

Log_headers

False

如果是true,记录每个响应的消息头

Lookup_depth

1

CNAME可以是递归的,该值设置查询的层次数

Storage_domain

Example.conf

 

4.10.4 临时URL

       允许创建URL来提供对对象的临时的访问权限。比如,一个网站可能想要提供一个下载swift中大对象的链接,但是swift账户没有公共权限,当web浏览器用户点击这个链接时,浏览器会直接从swift下载这个对象,不需要网站作为请求的代理服务器。如果用户想和他的朋友共享这个链接,或者比如说不小心把链接放在了论坛上,直接的访问权限会在超过时间限制后失效,这个限制在网站创建链接时设置。如何创建这样的临时URL呢?首先,一个X-Account-Meta-Temp-URL-Key消息头必须在swift账户中设置,然后,使用HTTP方法生成一个HMAC-SHA1(RFC2104)签名。

       例如,下面的代码将会生成一个在/v1/AUTH_account/container/object路径上的60秒的GET请求。


       确定使用全路径,包括/v1/前面的部分。假设最终生成的签名是da39a3ee5e6b4b0d3255bfef95601890afd80709,过期时间是1323479485.然后,比如,网站可以提供一个链接:


       资源路径或请求参数的任何变化都会导致401未授权。同样的,在允许GET时使用PUT也是401.如果GET或者PUT是允许的,那么HEAD也是允许的。这和浏览器一起构成了翻译中间件,能够直接从浏览器上传文件到swift中特定的位置。需要注意的是改变X-Account-Meta-Temp-URL-Key会在60s(key的memcache时间)内使之前生成的临时URL都不可用

Proxy-server.conf中filter:tempurl的配置选项

选项

默认

描述

Incoming_allow_headers

 

 

Incoming_remove_headers

x-timestamp

 

Outgoing_allow_headers

x-object-meta-public-*

 

Outgoing_remove_headers

x-object-meta-*

 

 

4.10.5 命名检查过滤器

       命名检查过滤器不允许路径包含任何禁止的字符或者超过定义的最大长度。

Proxy-server.conf中fileter:name_check的配置选项:

选项

默认

描述

Forbidden_chars

 

名字中不允许出现的字符

Max_length

255

名字的最大长度

Forbidden_regexp

“/\./|/\.\./|/\.$|/\.\.$”

禁止的字串,使用正则表达式语法

 

4.10.6 限制

       Swift.conf中的swift-constraints部分改变swift内部非限制。这是调试集群性能的高级特性,使用起来要特别小心。

Swift.conf中的swift-constraints配置选项:

选项

默认

描述

Max_file_size

5368709122

集群中最大普通对象的长度,这也是大对象清单支持的大对象分段的最大长度。该值以字节为单位,把它设置成小于1MB会导致一些测试失败。强烈建议不修改该值

Max_meta_name_length

128

元数据头的名字部分的最大程度,以utf8编码

Max_meta_value_length

256

元数据值的最大长度,以utf8编码

Max_meta_count

90

在一个单独的账户、容器或对象中可存储的最多的元数据keys

Max_meta_overall_size

4096

元数据的最大长度(keys+values),utf8

Mex_object_name_length

1024

对象名的最大长度,utf8

Container_listing_limit

10000

一次容器list的最多数目

Max_account_name_length

256

账户名的最大长度,utf8

Max_container_name_length

256

容器名的最大长度,utf8

 

4.10.7 集群健康状态

       有一个swift-dispersion-report工具来检测整个集群的健康状态。它通过检查分布的容器和对象当前是不是在集群中合适的位置来完成这个功能。比如说,一个普通的部署中每个对象有3个副本。这个对象的健康状态通过检测每个副本是不是在适当的位置上来确定。如果3个副本中只有两个在适当的位置上,那么这个对象的健康值就是66.66%,最佳的是100%。一个单独对象的健康值,特别是一个很久前的对象的健康值,通常能反映出该对象所在的整个分区的健康度。如果我们在集群中不同百分比的分区中创建足够的对象,我们就可以获得一个对整个集群健康度的相当有效的估计。实践显示,使用集群中1%的分区是测量精度和获取结果所需时间的一个均衡点。提供健康值所要做的第一件事就是创建一个专门用于该工作的账户。然后,我们需要向不同的分区里面放置容器和对象。Swift-dispersion-populate工具能完成这个工作,它创建随机的容器和对象名知道他们落在不同的分区里。最后,我们运行swift-dispersiton-tool来进行检测。这些工具需要有对整个集群和ring文件的直接访问权限(在代理服务器上安装这些工具大概能达到这个目的)。Swift-dispersion-populate和swift-dispersion-report使用相同的配置文件/etc/swift/dispersion.conf.


还为conf文件提供了指定dispersion coverage(默认是1%)、并发性、重试次数等的选项,虽然一般情况下默认值就不错。配置好后,运行swift-dispersion-populate来在整个集群中填充容器和对象。然后运行swift-dispersion-report来获得一个分散情况报告或者整个集群的健康度。下面是一个健康的集群的例子:


现在,将一个设备的权重故意调整原来的两倍,然后重新运行dispersion report,如下:


你可以发现集群中对象的健康度明显下降了。当然,这个测试环境只有4个设备,在生产环境下有很多很多的设备,一个设备的影响是非常小的。接下来,运行复制器是所有东西归位,再运行dispersion report:


Dispersion report可以以json格式输出,这使得他更容易被第三方工具使用:


Proxy-server.conf中的dispersion 选项:

选项

默认

描述

Auth_version

1.0

Swift认证API版本

Dispersion_coverage

1

 

Dump_json

‘no’

 

Retries

3

 

Auth_url

 

 

Auth_user

 

 

Auth_key

 

 

Swift_dir

/etc/swift

 

 

4.10.8 静态大对象(SLO)支持

4.10.8.1 上传清单

       用户上传了需要进行串联的对象之后要上传一个清单。这必须是一个PUT请求,请求参数是:?multipart-manifest=put。响应的包体是一个json格式的有序文件列表。为每个分段提供的数据有:

l  Path:分段的路径(不包括账户) /container/object_name

l  Etag: 分段完成PUT后返回的etag

l  Size_bytes:分段的字节大小

列表的格式是:


一个对象的分段数受到一个可配置的数值的限制,默认是1000.除最后一个分段外的每个分段至少1MB(可配置)。上传时,中间件会给每个经过的分段加头部,指定每个的大小和etag。如果其中任何一个不符合要求(找不到、大小或etag不符、小于最小长度),用户会收到一个4XX错误的响应。如果一切都满足要求,那么用户会收到一个2XX响应并且SLO对象可以被下载了。

在上述过程当中,成功的情况下,一个从用户输入生成的json格式的清单会被发送到对象服务器,通过一个X-Static-Large-Object:True头和改过的Content-Type。Swift_bytes=$total_size参数会被添加到现存的Content-Type后面,total_size是所有分段长度的综合。这个额外参数对用户是不可见的。

       清单文件能够引用不同容器中的对象,这能够提高并发上传速度。对象能被多个清单所引用。

4.10.8.2 检索一个大对象

       对清单对象的GET请求会返回清单中对象的连结。如果清单中的某个分区丢失了或者他们的Etag/Content Length不符,那么连接就会终止,在这种情况下,409 Conflict会被记录在代理服务器的log中,用户会收到不完整的结果。

       这个GET或HEAD请求的头部会返回清单对象自身的元数据,有一些异常:

l  Content-Length:SLO的总长度

l  X-Static-Large-Object:True

l  Etag:SLO的etag(和DLO生成的方法一样)

一个带?multipart-manifest=get请求参数的GET请求会返回清单文件本身。生成json格式并且和从原来的multipart-manifest=put发送的数据不一致。这个调用主要的目的是调试。

当清单对象上传后,或多或少保证了清单中的每个分段是存在的并且和规定的参数是一致的。然而,没有什么能够阻止用户通过删除或者替换一个清单中分段的方式破坏下载。这就需要用户操作这些分段时格外小心。

4.10.8.3 删除一个大对象

       DELETE请求只会删除清单对象本身。请求参数为?multipart-manifest=delete的DELETE请求会删除清单中的所有分段,然后如果成功的话,删除清单本身。失败的响应和bulk delete中间件的响应相似。

4.10.8.4 更改一个大对象

       PUT和POST会如期待的那样起作用。PUT只会覆写清单对象。

4.10.8.5 容器列表

       在容器列表中列出的SLO的大小是将清单中所有分段连结起来以后的总大小。容器(对随后的账户也是一样)的X-Container-Bytes-Used不会反映清单中实际文件的大小而是清单中json格式数据的大小。这是因为我们想让容器列表反映出清单对象本身的大小。我们不想在容器和账户的元数据中计算两次已使用的字节数(清单和他指向的分段)。


原创粉丝点击