组件
Swift主要使用到如下组件来提供对象存储服务:
-
Proxy servers
处理所有请求调用
-
Rings
将数据映射到物理磁盘上,实际就是记录了逻辑数据存放在哪一块物理磁盘的那个位置上
-
Zones
对不同区域的数据进行隔离,一个区域中的故障不会影响集群其他区域数据副本
-
Accounts and containers
每个账户和容器都是分布在集群中的单独的数据库,账户数据库包含了账户下的所有容器,容器数据库包含容器下的所有对象
-
Objects
对象数据本身
-
Partitions
一个分区存放了对象、账户数据库、容器数据库,并管理数据在集群中的位置
数据存放
swift数据存放
swift数据模型
Account:账户(也叫租户)包括了自己的元数据信息和container列表,这些数据被保存在SQLite数据库中
Container:容器(在S3中叫桶),可以看成文件系统中的目录,用户可以自己定义容器。其包含了自己的元数据信息和容器内的对象列表,数据同样保存在SQLite中
Object:对象,包括对象元数据和对象,以文件形式保存在文件系统中
三者关系如下:
根据官方文档,知道:
- 用户创建container,用来持有对象,container server并不知道对象具体在什么位置
- container,对象列表以sqlite数据库文件进行存储,并且在整个集群中复制,追踪container使用的统计信息包括对象数量以及容量
- container命名时,名称最大长度为256 bytes,不可以使用 / 字符
- 如果container中所有object的大小为0 bytes,那么container看起来就像一个目录
- object可以是0 bytes或者包含数据,如果数据大于5 GB时需要特殊处理
- object name可以包含 / 字符,看起来像目录,实际它任然是一个object name
数据位置相关概念
swift通过将数据副本拷贝到不同的物理位置上来保证数据的可靠性,主要有
数据一致性相关服务
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值 。
未完待续…
|
请发表评论