来源:《OpenStack 管理手册》对象存储章节 + PPT《09 OpenStack 计量管理》。
Swift 之前只讲过概念(三兄弟、三大关键技术),这篇补上真正的重头------建环实验:给 Swift 加盘、建 Ring、验证多副本。Ceilometer 只有理论,一节讲透。

一、Swift 定位补全:它不是文件系统
之前讲过:Swift 是对象存储,与 Cinder(块存储)、Manila(文件存储)并列持久存储三兄弟。补三条容易忽略的定位描述:
- Swift 不是文件系统、也不是实时数据存储系统------它面向「永久类型的静态数据」的长期存储,这些数据可以检索、调整、必要时更新,但不适合频繁改写的场景;
- 最适合存的数据:虚拟机镜像、图片、邮件存储、存档备份;
- 没有中心单元或主控节点------这是 Swift 扩展性、冗余和持久性更强的根本原因(对比:传统存储总有单点)。
常用观察命令:swift stat------显示 Swift 中的账户、容器和对象的信息。
二、Ring:三张映射表
Swift 为账户、容器、对象分别定义了 Ring(环):
| Ring | 对应服务端口 | 管什么 |
|---|---|---|
| Account Ring | 6002 | 账户(租户)级映射 |
| Container Ring | 6001 | 容器(对象的组织单元)级映射 |
| Object Ring | 6000 | 对象(真正的数据)级映射 |
Ring 记录了存储对象与物理位置的映射关系 ,通过四个要素维护:Zone(区域)、Device(设备)、Partition(分区)、Replica(副本)------把虚拟节点(分区)映射到一组物理存储设备上。
对照记忆:上篇 Heat 的 HOT 模板是「一份描述反复建资源」,Ring 是「一张映射表反复找位置」------分布式系统都用「先算后找」代替「中心查询」。
三、建环实验:给 Swift 加两块「真磁盘」
实验环境里 Swift 默认挂的是一个虚拟回环设备(swiftloopback)。实验目标是:加一块 20GB 新盘,分两个区做两个存储点,让 2 副本真的落在两个不同的分区上。
3.1 新添磁盘:分区、格式化、挂载
控制节点新添加一块 20GB 磁盘(/dev/sdb),分成两个区并格式化为 xfs:分区一对应 obs1,分区二对应 obs2。
bash
# 卸载并清理原来的 swift 虚拟设备分区
umount /srv/node/swiftloopback
cd /srv/node
rm -rf swiftloopback/
mkdir obs1 obs2 # 创建新的挂载目录,分别对应 sdb1、sdb2
# 配置 /etc/fstab:注释原 swiftloopback 行,添加两行新挂载
/dev/sdb1 /srv/node/obs1 xfs defaults 0 0
/dev/sdb2 /srv/node/obs2 xfs defaults 0 0
mount -a # 挂载;若提示 fstab 已改但 systemd 用旧版,先 systemctl daemon-reload
df # 确认 obs1、obs2 已挂载
# 改属主:Swift 服务用户要能读写
chown swift:swift obs1
chown swift:swift obs2
3.2 创建 Ring:create → add → rebalance
进 /etc/swift/ 目录。先查三个服务的 bind_port(account 6002 / container 6001 / object 6000),然后对三个 builder 各做一遍三步曲(以 object 为例):
bash
cd /etc/swift/
# 第 1 步:create 建环
# 三个数字:12 = 分区数量 2^12;2 = 2 个副本;1 = 最少 1 小时后才允许再改 ring 配置
swift-ring-builder object.builder create 12 2 1
swift-ring-builder account.builder create 12 2 1
swift-ring-builder container.builder create 12 2 1
# 第 2 步:add 加设备(zone-IP:端口/挂载点 权重100;两个分区分属 z1、z2)
swift-ring-builder object.builder add z1-192.168.108.10:6000/obs1 100
swift-ring-builder object.builder add z2-192.168.108.10:6000/obs2 100
# account 用 6002、container 用 6001,同样的 z1/z2 各加一遍
# 第 3 步:rebalance 重平衡(重新分配分区,生成 .ring.gz)
swift-ring-builder object.builder rebalance
swift-ring-builder account.builder rebalance
swift-ring-builder container.builder rebalance
create 12 2 1 的三个数字是必背点:2^12 个分区、2 副本、1 小时变更保护。
3.3 验证:2 副本真的落了两份
界面或命令上传一个文件后:
bash
find /srv/node -name *data
# /srv/node/obs1/objects/317/0fe/13d34c83.../1727591964.07735.data
# /srv/node/obs2/objects/317/0fe/13d34c83.../1727591964.07735.data
同一份对象数据在 obs1 和 obs2 各存了一份------2 副本落盘成功,Ring 的分配生效。分区一、分区二分属 z1、z2 两个 zone,坏一块盘数据还在,这就是「多副本冗余」的直观形态。
四、华为 OBS 体验:云上的对象存储
华为云 OBS(Object Storage Service)是 Swift 思路在公有云上的同源产品:桶(bucket)+ 对象 + REST 访问。实验里走了一遍从开通到控制台上传下载的流程,体感上和 Swift 的「容器 + 对象」一一对应------对象存储的抽象模型在各家都是通的。
五、Ceilometer:OpenStack 的电表

5.1 定位
Ceilometer(计量服务)是 OpenStack 的「电表」------把各服务的资源用量统一测出来、存起来、供查询和计费。没有它,云平台的「谁用了多少」就没处出报表。
5.2 发展与衍生
Ceilometer 早期包揽三件事:数据收集 + 数据存储 + 告警,后来项目拆分:
- 存储 拆给 Gnocchi(时序数据库);
- 告警 拆给 Aodh;
- Ceilometer 专注收集。
5.3 整体架构与工作流程
数据流四步:收集 → 处理 → 存储 → 告警/访问。
数据收集用两种代理,方向相反:
| 代理 | 方式 | 说明 |
|---|---|---|
| 轮询代理 Polling | 主动「要」 | 周期性地向各服务 API 请求计量数据 |
| 通知代理 Notification | 被动「听」 | 监听消息总线上各服务发出的事件通知 |
数据处理:对原始数据做采样、转换,经管道(pipeline)输出成统一的计量样本(sample)。
数据存储:样本(sample)与事件(event)落到存储后端(现代部署是 Gnocchi),供 API 查询;界面「计量」面板看资源用量,云平台账单从这出。
告警(Aodh) :对计量数据设阈值,触发时执行动作------比如「CPU 连续 5 分钟超 80% 就扩容」。计量管记账,告警管盯梢,两者配合是 Heat 自动伸缩的数据基础。
六、命令速查与概念锚点
| 命令 | 说明 |
|---|---|
swift stat |
查看账户/容器/对象统计信息 |
swift-ring-builder <builder> create 12 2 1 |
建环:2^12 分区 / 2 副本 / 1 小时保护 |
swift-ring-builder <builder> add z1-IP:PORT/挂载点 100 |
加存储设备(zone-IP:端口/目录 权重) |
swift-ring-builder <builder> rebalance |
重平衡,生成 ring.gz |
find /srv/node -name *data |
验证多副本落盘 |
三个必背锚点:
- 三环三端口:Account 6002 / Container 6001 / Object 6000;
- create 12 2 1:分区数、副本数、变更保护小时数;
- Ring 四要素:Zone / Device / Partition / Replica。
附:关键英文全称
| 缩写/术语 | 全称 | 含义 |
|---|---|---|
| OBS | Object Storage Service | 华为云对象存储服务 |
| Ring | --- | 环,对象到物理位置的映射表 |
| Partition | --- | 分区,Ring 的虚拟节点单位(2^12 即 4096 个) |
| Replica | --- | 副本数(实验为 2) |
| Gnocchi | --- | 时序数据库,计量数据存储后端 |
| Aodh | --- | 告警服务(从 Ceilometer 拆分) |
| Polling / Notification | --- | 轮询(主动要)/ 通知(被动听)两种收集代理 |
📖 Ring 原理图与 OBS 截图见《OpenStack 管理手册》对象存储章节;Ceilometer 架构图见 PPT《09 OpenStack 计量管理》。Swift 与 Cinder/Swift/Manila 三兄弟的对比见 10-28 篇《Cinder 是怎么把一块卷交给虚拟机的?》第一节。