EfficientMetering
目录
OpenStack 计量蓝图
项目主页: Ceilometer
会议: https://wiki.openstack.org/Meetings/MeteringAgenda
用例
- 需要一个工具来收集每个客户的使用情况
- 需要一个 API 来查询现有计费系统中的收集到的数据
- 所需数据,每个客户,小时级粒度,包括
- 计算 - Nova
- 实例 (类型,可用区) - 每小时使用量
- cpu - 每小时使用量
- ram - 每小时使用量
- nova volume 块设备 (类型,可用区) - 每小时使用量
- 保留
- 已用
- 网络 (数据进/出,可用区) - 每小时字节数 + 总字节数
- 区分内部和外部端点
- 外部浮动 IP - 每小时字节数 + 总字节数
- 计算 - Nova
- 存储 - Swift
- 总存储数据
- 数据进/出 - 每小时字节数 + 总字节数
- 区分内部和外部端点
建议设计
计量
当前已实现计量器的更完整列表可在 https://docs.openstack.org/developer/ceilometer/measurements.html 找到
以下是需要收集的计量器的初始列表,以便计费系统执行其任务。此列表必须随着时间的推移而可扩展,并且每个管理员必须能够根据其本地需求启用或禁用每个计量器。
| 计量器名称 | 组件 | 资源 ID | 单位 | 有效载荷 | 注意 | |
| c1 | instance | nova compute | 实例 ID | 分钟 | type | 类型是使用的实例 flavor ID |
| c2 | cpu | nova compute | 实例 ID | 分钟 | type | Arm|x86|x86_64]) |
| c3 | ram | nova compute | 实例 ID | 兆字节 | ||
| c4 | disk | nova compute | 实例 ID | 兆字节 | 系统磁盘在实例关闭但未终止时保留,必须进行统计 | |
| c5 | io | nova compute | 实例 ID | 兆字节 | 磁盘 IO 每秒兆字节对服务可用性有很大影响,可以单独计费 | |
| v1 | bd_reserved | nova volume | volume ID | 兆字节 | ||
| v2 | bd_used | nova volume | volume ID | 兆字节 | (可选) | |
| n1 | net_in_int | nova network | IP 地址 | 千字节 | 从内部网络源接收的数据量 | |
| n2 | net_in_ext | nova network | IP 地址 | 千字节 | 从外部网络源接收的数据量 | |
| n3 | net_out_int | nova network | IP 地址 | 千字节 | 发送到内部网络目标的数据量 | |
| n4 | net_out_ext | nova network | IP 地址 | 千字节 | 发送到外部网络目标的数据量 | |
| n5 | net_float | nova network | IP 地址 | 分钟 | type | 类型根据其分配策略区分公共 IP,例如 IPv6 或 IPv4_FROM_RIPE 或 IPv4_FROM_OVH 等。浮动 IP 的获取或维护成本可能取决于其分配策略。 |
| o1 | obj_volume | swift | swift 帐户 ID | 兆字节 | 存储的总对象体积 | |
| o2 | obj_in_int | swift | swift 帐户 ID | 千字节 | 从内部网络源接收的数据量 | |
| o3 | obj_in_ext | swift | swift 帐户 ID | 千字节 | 从外部网络源接收的数据量 | |
| o4 | obj_out_int | swift | swift 帐户 ID | 千字节 | 发送到内部网络目标的数据量 | |
| o5 | obj_out_ext | swift | swift 帐户 ID | 千字节 | 发送到外部网络目标的数据量 | |
| o6 | obj_number | swift | swift 帐户 ID | 容器 | 存储在容器中的对象数量。资源 ID 是容器 ID。 | |
| o7 | obj_containers | swift | swift 帐户 ID | 容器数量 | ||
| o8 | obj_requests | swift | swift 帐户 ID | type | HTTP 请求数量,类型是请求类型 (GET/HEAD/PUT/POST…) | |
| i1 | image_upload | glance | 镜像 ID | (离散) | 1 | 让我们统计创建的镜像数量,或者为每次上传收取固定费用 |
其他可能的计量器
- 服务处理程序 (负载均衡器、数据库、队列...)
- 服务使用情况
注意网络计量器 (n1-n4): 区分内部和外部流量需要显式列出代理配置中的内部网络。
注意(dhellmann): 这将无法扩展到实际系统,租户可能会创建自己的网络。我们应该只收集每个网络的的数据,让计费系统决定以什么费率收费 (可能内部网络为 $0)。
存储
| 字段名称 | 类型 |
| 来源 | ? |
| user_id | 字符串 |
| project_id | 字符串 |
| resource_id | 字符串 |
| resource_metadata | 字符串 |
| meter_type | 字符串 |
| meter_volume | 数字 |
| meter_duration | 整数 |
| meter_datetime | 时间戳 |
| message_signature | 字符串 |
| message_id |
- 数据库不能通过 API 以外的任何方式直接访问
- 必须有一个进程从代理收集消息并存储数据
- 一个进程可以对照 nova 事件数据库验证计量器
- 一个进程可以验证消息是否丢失
- 一个进程可以验证帐户状态是否与 keystone 同步
注意: instance_metadata 字段内容针对每个计量器重复。例如,它将针对所有 c? 字段重复。存储优化将在 Ceilometer 的未来版本中处理。
注意: 存储可以折叠记录,或者 API 可以折叠记录以优化减少返回的信息量。例如,如果两个连续 c1 计数器的所有字段相等,并且它们在时间上相邻 (即 meter_datetime[second] - meter_datetime[first] == meter_duration[second] - meter_duration[second]),则可以删除第一条记录,因为它具有冗余性。
替代计量设计
在 Folsom ODS 会议期间,讨论了一种替代设计,其中事件而不是记录 delta,将记录计量器的绝对值。这将需要扩展事件以包含与计量器关联的“对象 ID” (实例、网络、卷)。
delta 模型可以从绝对模型导出,这意味着它在缺少 delta 注册时具有弹性。
代理
- 每个 nova compute 节点上的代理,以累积和发送 c1、c2、c3、c4、c5、n1、n2、n3、n4 的计量器。该代理可能正在从 libvirt 中提取此信息。
- c5 可以使用 libvirt 的 virDomainBlockStats 获取磁盘 I/O 统计信息
- n3 / n4 可以使用 iptables 记账规则? (外部流量?)
- n1 / n2 可以使用 libvirt 的 virDomainInterfaceStats? (所有流量?)
- 每个 nova volume 节点上的代理,以累积和发送 v1、v2 的计量器
- 每个 swift 代理上的代理,以转发现有的记账数据 o1 并累积和发送 o2-o5
注意: nova network 节点不需要累积和发送 n5 的计量器,因为它们可以直接从 nova 数据库中提取 (例如 nova-manage floating list)
架构
请参阅 EfficientMetering/ArchitectureProposalV1
- 一个代理在每个 OpenStack 节点 (裸机) 上运行,并本地收集数据
- 如果计量器来自现有的 OpenStack 组件,则应使用它
- 一个独立的 Ceilometer 代理实现尚未由现有的 OpenStack 组件提供的计量器
- 存储守护程序与代理通信以收集其数据并进行聚合
- 收集数据的代理经过身份验证以避免污染计量服务
- 数据通过受信任的消息传递系统 (RabbitMQ?) 从代理发送到存储守护程序
- 代理和存储守护程序之间交换的消息使用通用的消息格式
- 存储的内容通过提供聚合的 REST API 提供
- 消息队列与其它队列 (例如 nova 队列) 分开
- 队列中的消息已签名且不可否认 (http://en.wikipedia.org/wiki/Non-repudiation)
注意(jking-6): 消息格式应使用协议缓冲区。JSON 字节字符串占用太多带宽和解析时间。
注意: 记录一些用例场景以真正确定架构。谁向计量服务发出信号?API 服务还是 nova、quantum、swift、glance、volume?
注意: 理想情况下,所有计量器都来自负责给定资源的 OpenStack 组件 (例如,临时磁盘的磁盘 I/O 在 nova 中可用)。但是,假设它始终可以实现是不现实的。在 OpenStack 节点上运行的独立的 Ceilometer 代理提供了在 OpenStack 组件不提供计量器时的访问权限。在 Ceilometer 代理中实现的计量器应始终贡献给 OpenStack 组件。这种针对每个给定计量器的孵化 (首先在 Ceilometer 代理中实现,然后在 OpenStack 组件中实现) 既对短期目的实用,也是一种健全的长期实践,可以避免分叉代码。
消息传递用例
实例创建
- 创建实例,nova 发送消息 ( https://wiki.openstack.org/SystemUsageData )
- 计量存储代理侦听 nova 队列并获取创建消息
- 计量存储代理将创建事件本地存储,并带有时间戳
- 代理通知计量存储守护程序,实例创建于五分钟前,并将此信息聚合到租户记录中
API
数据量
计量系统始终会生成大量数据。为了估计您的云可能生成的数据量,已提出 Google 表格。
贡献给 Ceilometer
开发人员文档正在形成 在源代码中 并且也以更友好的格式发布在 http://ceilometer.readthedocs.org 上。
项目团队在 Freenode 的 #openstack-metering 频道中闲逛,欢迎随时加入并停留尽可能长的时间来讨论您的未来实现。我们使用 OpenStack 通用邮件列表 进行我们的电子邮件讨论,主题标记为 [metering]。
如果您想知道可以为 Ceilometer 贡献什么,这里有一个我们缺少的功能列表。
路线图
See EfficientMetering/RoadMap
免费软件计费系统
当可用时,可以使用计量系统的计费系统实现列表。
- Dough https://github.com/lzyeval/dough [截至 2015-03-06 返回 404]
- trystack.org 计费 https://github.com/trystack/dash_billing
- nova-billing https://github.com/griddynamics/nova-billing
相关资源
- 存储记账记录的定义 http://www.ogf.org/Public_Comment_Docs/Documents/2012-02/EMI-StAR-OGF-info-doc-v2.pdf
- UsageRecord 格式 http://www.ogf.org/documents/GFD.98.pdf
- 捕获交换 https://github.com/rackspace/stacktach
- 系统使用情况消息 https://wiki.openstack.org/SystemUsageData
- http://etherpad.openstack.org/EfficientMetering
- 使用 https://github.com/stackforge
- lzyeval 代码库: [截至 2015-03-06 返回 404]
- trystack.org 代码库
- https://wiki.openstack.org/utilizationdata
- Nova 计费 https://github.com/griddynamics/nova-billing
- Swift
- 2012年4月邮件列表关于计费的讨论 https://lists.launchpad.net/openstack/msg10334.html
- Virgo (可脚本化的计量数据收集代理): https://github.com/racker/virgo
- 联系 Rackspace 的 Brandon Philips - brandon.philips@rackspace.com
- Ovirt DWH http://www.ovirt.org/wiki/Ovirt_DWH 以及相关的数据库模式 http://gerrit.ovirt.org/gitweb?p=ovirt-dwh.git;a=blob;f=data-warehouse/historydbscripts_postgres/create_tables.sql;h=2e05299a2de1b79634e862e5f1811dda3f303a96;hb=0271e5205ad29109c2e2313e7f6fb900e76a757a#l377
- Swift http://folsomdesignsummit2012.sched.org/event/d9135eabdd775432c74c3f1d32a325d3 和 http://etherpad.openstack.org/FolsomSwiftStatsd
- 从 libvirt 收集计量数据 https://github.com/ss7pro/rescnt
- Doug Hellman 沙盒 https://github.com/dhellmann/metering-prototype/
- Ceilometer 原型实现 http://github.com/woorea/ceilometer-java 和讨论 https://lists.launchpad.net/openstack/msg11410.html
资源
- Julien Danjou 在 2012 年 7 月用来展示 Ceilometer 的 幻灯片。
常见问题解答
问:为什么重复造轮子?XXXX 已经实现了它。
答:请将您认为可以完成这项工作的工具发到邮件列表,除非它已经在下面列出。
- https://wiki.openstack.org/SystemUsageData 例如,是专门针对 nova 的,而计量旨在汇总所有 OpenStack 组件
- collectd、munin 等都有一些拼图碎片,但它们没有全部,并且没有为计费而设计,不适合这个蓝图
- Riemann -- http://aphyr.github.com/riemann/concepts.html 我能够在下午搭建一个基本的仪表板。即使它不适合这个项目,也有很多值得借鉴的好点子:协议缓冲区、基于推送的数据流图、极其简单的 API(流处理器只是接受单个参数的函数,即事件消息)。