[云计算]OpenStack - Swift
Swift在OpenStack中的位置
Swift是OpenStack云存储服务的重要组件,它提供了高可用、分布式、持久性、大文件的对象存储服务。此外Swift还可以利用一系列的便宜硬件存储设备,提供安全、可靠的存储服务。
Swift特点
- 完全对称、面向资源的分布式系统架构设计
Swift组件
组件 | 功能 |
---|---|
Proxy Server | 对外提供对象服务 API,由于采用无状态的 REST 请求协议,可以进行横向扩展来均衡负载 |
Account Server | 提供账户元数据和统计信息,并维护所含容器列表的服务,每个账户的信息被存储在一个 SQLite 数据库中 |
Container Server | 提供容器元数据和统计信息,并维护所含对象列表的服务,每个容器的信息也存储在一个 SQLite 数据库中 |
Object Server | 提供对象元数据和内容服务,每个对象的内容会以文件的形式存储在文件系统中,元数据会作为文件属性来存储,建议采用支持扩展属性的 XFS 文件系统 |
Replicator | 检测本地分区副本和远程副本是否一致,发现不一致时会采用推式(Push)更新远程副本,并且确保被标记删除的对象从文件系统中移除 |
Updater | 当对象由于高负载的原因而无法立即更新时,任务将会被序列化到在本地文件系统中进行排队,以便服务恢复后进行异步更新 |
Auditor | 检查对象,容器和账户的完整性,如果发现比特级的错误,文件将被隔离,并复制其他的副本以覆盖本地损坏的副本;其他类型的错误会被记录到日志中 |
Account Reaper | 移除被标记为删除的账户,删除其所包含的所有容器和对象 |
Swift原理
一致性哈希
- 通过计算可将对象均匀分布到虚拟空间的虚拟节点上。
- 在增加或删除节点时可大大减少需移动的数据量。
- 在实际部署的时候需要经过仔细计算得到合适的虚拟节点数,以达到存储空间和工作负载之间的平衡。
数据一致性模型
- N:数据的副本总数;
W:写操作被确认接受的副本数量;
R:读操作的副本数量。 - 强一致性:R+W>N,以保证对副本的读写操作会产生交集,从而保证可以读取到最新版本。
- 弱一致性:R+W<=N,如果读写操作的副本集合不产生交集,就可能会读到脏数据,适合对一致性要求比较低的场景。
- Swift 默认配置是 N=3,W=2>N/2,R=1或2,即每个对象会存在 3 个副本,这些副本会尽量被存储在不同区域的节点上;W=2 表示至少需要更新 2 个副本才算写成功;当 R=1 时意味着某一个读操作成功便立刻返回,此种情况下可能会读取到旧版本(弱一致性模型);当 R=2 时,需要通过在读操作请求头中增加 x-newest=true 参数来同时读取 2 个副本的元数据信息,然后比较时间戳来确定哪个是最新版本(强一致性模型)。
如果数据出现了不一致,后台服务进程会在一定时间窗口内通过检测和复制协议来完成数据同步,从而保证达到最终一致性。
数据模型
- 层次数据模型,共设三层逻辑结构:Account/Container/Object(即账户/容器/对象)
- 每层节点数均没有限制,可以任意扩展
Ring
-
将虚拟节点(分区)映射到一组物理存储设备上
-
Account Ring、Container Ring、Object Ring
-
包括:
- 存储设备列表,设备信息包括唯一标识号(id)、区域号(zone)、权重(weight)、IP 地址(ip)、端口(port)、设备名称(device)、元数据(meta)。
-
分区到设备映射关系(replica2part2dev_id数组)
-
计算分区号的位移(part_shift整数)
API
- Swift通过Proxy Server向外提供基于HTTP的REST服务接口,对账户、容器和对象进行CRUD等操作。
Swift命令
- swift upload
- swift download
- swift stat
- swift-get-nodes 获取对象的partition信息
- swift-object-info 从.data文件获取账户/容器/对象信息
- swift-ring-builder 各种ring操作
Swift问题定位
- 检查服务状态
- cps template-instance-list --service swift swift-store
- cps template-instance-list --service swift swift-proxy
- 日志路径
- /var/log/fusionsphere/component/swift-proxy/
- /var/log/fusionsphere/component/swift-store/
- 检查Swift分区空间
- df -h