今天高考的日子,想想六年前的今天,哥也在参加高考呢。上海这雨下的有点毁天灭地的气势哈。言归正传
3. 安装openstack对象存储系统
这一章的内容其实就是我写的 http://blog.csdn.net/gjhnorth/article/details/90364934. OpenStack对象存储系统管理
这一章的内容非常多,也是整个管理手册的重点,里面还有很多我看不懂的东西,希望能看懂的朋友们可以帮忙解释一下。我这么懒,而且还有很多其他的任务,肯定不会一天都翻译完的,慢慢来吧,一点点更新。4.1 理解对象存储如何工作
l Ring
一个ring代表了存储在磁盘上的实体的名字和他们物理位置的映射。账户、容器和对象有不同的ring。当其他的组件需要操作一个对象、容器或者账户时,他们需要和适当的ring进行交互来决定这个操作在集群中的位置。
Ring使用区(zones)、设备(devices)、分区(partitions)和副本(replicas)维护这个映射。Ring中的每个分区(partition)都做了副本,默认是跨集群的三个副本,分区的位置信息存储在ring维护的映射中。Ring还负责在发生故障时决定设备如何切换。
数据和ring中zone的概念是独立的,每个分区副本确保存储在不同的zone中。一个zone能够代表一个drive、一个server、一个cabinet(这是啥)、一个交换机或一个数据中心。
在OpenStack对象存储安装时,ring的分区(也就是一致性哈希环的所有虚拟节点)被平均分配到所有的设备上。当分区需要被移动时(比如一个设备被加到一个集群上),ring确保一次移动最少数量的分区,一次只移动分区的一个副本。
可以使用权重来均衡分区在集群的drive中的分布。当集群中的硬盘使用不同的大小时,使用权重的功能是有用的。
Ring由代理服务器和一些后台进程执行(比如副本)
l 代理服务器
代理服务器负责把OpenStack对象存储的其他结构联系在一起。对于每一个请求,它会查询账户、容器或对象在ring中的位置,然后把据此路由该请求。公共的API也是通过代理服务器被外部获知的。
代理服务器也处理大量的错误。比如,如果一个服务器对于一个对象的PUT请求不可用,那么代理服务器会询问ring,进行服务器的切换并把请求路由到新的可用的服务器。
当对象向对象服务器流入或者从对象服务器流出时,对象数据直接通过代理服务器流向用户或者从用户流入,代理服务器并不进行缓存。
可以通过配置代理服务器的配置文件来将账户管理在代理服务器进行。
l 对象服务器
对象服务器是一个非常简单的大对象存储服务器,它能够存储、检索和删除在本地设备存储的对象。对象作为二进制文件存储在文件系统上,对象的元数据存储在文件的扩展属性(xattrs)中。这就要求对象服务器的底层文件系统能够支持xattrs,比如ext3,它的xattrs是默认关闭的。
每个对象的存储使用一个从对象名的哈希和操作的时戳生成的路径。最后一次写总是能成功,能够确保总是使用最新的对象版本提供服务。一个删除操作也被当做是文件的一个版本(一个以“.ts”结尾的0字节文件,代表tombstone,也就是墓碑)。这能保证被删除的文件能被正确地复制,旧的版本不会由于故障重新出现。
l 容器服务器
容器服务器的基本工作是处理对象列表。它并不知道这些对象在哪里,只是知道特定的容器中有哪些对象。这些列表作为一个sqlite数据库文件存储,像对象一样在集群间创建副本。对象的总数和容器的总使用量等数据也会被跟踪记录。
l 账户服务器
账户服务器和容器服务器非常相似,只不过账户服务器负责列出容器的列表而不是对象。
l 副本
副本被设计用来在比如网络中断或驱动故障等临时出错的情况下保持系统的一致性。
副本程序比较本地和每个远程的数据拷贝来确保所有的都包括最新的版本。对象副本使用一个哈希列表来快速比较每个partition的subsections,容器和账户副本使用一个combination of hashes 并且共享high water marks。(这句话不懂什么意思)
l 更新器
有时容器和账户数据不会被立刻更新,这在失效情形或负载较高时经常出现。如果更新失败了,更新操作会被放到文件系统的本地队列中,更新器会处理失败的更新操作,这时一个最终一致性的窗口很有可能会执行。比如,假设一个容器服务器欠载(under load),一个新的对象要被加入到系统中,在代理服务器向客户端返回成功消息后,这个对象是立即可读的,然而,容器服务器没有更新对象列表,所以这个更新操作会入队,等待下一次的更新,所以容器列表就不能立即包括刚加入的对象。
在实际应用中,一致性窗口的大小和更新器运行的频率是一样大的并且在代理服务器向第一个有响应的容器服务器路由list请求时就不会再被关注了。
l 审计器
审计器抓取本地服务器(crawl)来检测对象、容器和账户的完整性。如果发现了问题,比如一个bit位出错了,出问题的文件会被隔离,副本会代替出问题的文件。如果发现了其他的错误那么会被记录下来,比如一个对象的列表在任何容器服务器中都找不到了。