Openstack Swift 学习总结(一)

组件

Swift主要使用到如下组件来提供对象存储服务:

  • Proxy servers

    处理所有请求调用

  • Rings

    将数据映射到物理磁盘上,实际就是记录了逻辑数据存放在哪一块物理磁盘的那个位置上

  • Zones

    对不同区域的数据进行隔离,一个区域中的故障不会影响集群其他区域数据副本

  • Accounts and containers

    每个账户和容器都是分布在集群中的单独的数据库,账户数据库包含了账户下的所有容器,容器数据库包含容器下的所有对象

  • Objects

    对象数据本身

  • Partitions

    一个分区存放了对象、账户数据库、容器数据库,并管理数据在集群中的位置

    Openstack Swift 学习总结(一)

数据存放

swift数据存放

swift数据模型
  • Account:账户(也叫租户)包括了自己的元数据信息和container列表,这些数据被保存在SQLite数据库中

  • Container:容器(在S3中叫桶),可以看成文件系统中的目录,用户可以自己定义容器。其包含了自己的元数据信息和容器内的对象列表,数据同样保存在SQLite中

  • Object:对象,包括对象元数据和对象,以文件形式保存在文件系统中

三者关系如下:

Openstack Swift 学习总结(一)

根据官方文档,知道:

  1. 用户创建container,用来持有对象,container server并不知道对象具体在什么位置
  2. container,对象列表以sqlite数据库文件进行存储,并且在整个集群中复制,追踪container使用的统计信息包括对象数量以及容量
  3. container命名时,名称最大长度为256 bytes,不可以使用 / 字符
  4. 如果container中所有object的大小为0 bytes,那么container看起来就像一个目录
  5. object可以是0 bytes或者包含数据,如果数据大于5 GB时需要特殊处理
  6. object name可以包含 / 字符,看起来像目录,实际它任然是一个object name

数据位置相关概念

swift通过将数据副本拷贝到不同的物理位置上来保证数据的可靠性,主要有

  • Region:地理位置上的区域,如不同城市或者国家的机房

  • Zone:一个数据中心根据物理网络等基础设施分开的独立的区域,如通常将一个机架(Rack)内的服务器分在同一个Zone中

  • Node:节点,一个节点指的是一台物理服务器

  • Disk:磁盘,数据实际存放位置

数据一致性相关服务

  • Replicator:复制服务,会检测本地分区副本和远程副本是否一致,具体是通过对比哈希文件和高级水印来完成,发现不一致时会采用推式(Push)更新远程副本:对于对象的复制,更新只是使用rsync同步文件到对等节点。帐号和容器的复制通过HTTP或rsync来推送整个数据库文件上丢失的记录;另外一个任务是确保被标记删除的对象从文件系统中移除:当有一项(对象、容器、或者帐号)被删除,则一个墓碑文件被设置作为该项的最新版本。复制器将会检测到该墓碑文件并确保将它从整个系统中移除。确保系统的最终一致性。

  • Auditor:审计服务,在本地服务器上会反复地爬取来检查对象,容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误(比如在任何一个容器服务器中都找不到所需的对象列表)会被记录到日志中。恢复数据库和文件数据错误

  • Reaper:账户清理服务,删除账户状态被标记为DELETED的账户数据,包括账户下的所有容器和容器下的所有对象

  • Reconciler:容器调节器,移动在错误存储策略中的对象。确保对象在自己本应在的位置

  • Updater:当对象由于高负载或者系统故障等原因而无法立即更新时,任务将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新;例如成功创建对象后容器服务器没有及时更新对象列表,这个时候容器的更新操作就会进入排队中,更新服务会在系统恢复正常后扫描队列并进行相应的更新处理。

Ring & Ring-builder

proxy server根据账户、容器、对象各自的Ring来确定各自数据的存放位置。Ring的文件形式如下

  • 对象:object.ring.gz

  • 容器:container.ring.gz

  • 账户:account.ring.gz

RingData 数据结构
  • devs: 设备列表,列表中的每一条记录都是一个如下结构的字典
字段名 类型 说明
id integer 设备中唯一的整数标识符
index integer 分区的主节点类表中的偏移
zone integer 设备所在的zone
region integer zone所在的region
weight float 权重
ip string device 的ip地址
port integer device 的 TCP 端口
device string 磁盘上的设备名
meta string 其他信息

- _replica2part2dev_id:分区配置表,可以看做一个二维结构

p a r t i t i o n
0 1 2 3 4 5
repalica 0 3 2 0 1 3 5
1 2 0 3 4 5 1
2 1 4 1 2 0 4

说明:

  • 行:每一行表示一个副本,对副本进行编号,每个副本都可能落在集群的一个分区中,将所有分区顺序编号,每个分区都要有一个唯一的ID

  • 列:每个分区的每个副本都落在不同的disk上

  • _part_shift: 分区位移,为了确定对象分区ID,需要将对象路径(account/container/object) 的MD5 HASH值进行向右移位。_part_shift 决定总分区数为2^(32 - _part_shift),32-_part_shift值叫做分区幂part_power,在使用Ring-builder构建Ring时,需要指定PART_POWER值 。

未完待续…