用于 JSON 数据模型的实验性组件¶
https://blueprints.launchpad.net/congress/+spec/json-data-model
将 JSON 原始数据转换为表格化 Congress 数据,会使 Congress 开发人员的有限资源成为 Congress 用户灵活地尝试/使用任何数据源和数据字段的障碍,而这些数据源和字段是他们在策略用例中需要的。 本规范提出了一种通过移除转换步骤,从而保留原始 JSON 数据模型进行实验的方法,这是一种克服该限制的有希望的途径。
问题描述¶
在云计算中,大部分原始数据都是 JSON 格式。 在 Congress 模型中,开发人员会仔细理解和整理原始数据,以开发数据源驱动程序,从而以表格形式向最终用户提供数据。 转换为表格模型的好处是向编写数据的用户呈现更简单、更一致的数据模型。
然而,由于存在大量的数据源,并且现有源通过频繁的微版本更新添加了新数据(例如,Nova),Congress 开发人员不可能预见并跟上所有数据源,甚至无法跟上最终用户希望的给定数据源中的所有数据字段。 通常,当用户编写策略时,用户会发现策略需要额外的字段或源。 在这种情况下,用户需要联系上游开发人员,等待他们添加字段或源,然后等待新版本,然后升级到最新版本。 在最终用户可以测试所需的策略之前,所有这些都是必要的。
为了更好地支持那些具有快速出现和不断发展的用例的运营商,我们需要尝试一种额外的模型:移除循环中的转换和开发人员策划,允许用户在无需代码更改的情况下集成新的数据源。
提议的变更¶
创建一个 Congress 的实验性组件(暂定名称 congress-json),以允许对存储在 PostgreSQL json 数据模型中的 json 数据编写策略。
Congress-CloudState 将主要以原样(JSON 格式)将源数据摄取到 PostgreSQL 数据库中,使用 PostgreSQL 中的 JSONB 列类型。 PostgreSQL JSON 语法(请参阅 策略 部分中的示例)将允许规则(SQL 视图)直接对 JSON 数据进行操作。
由于不需要转换,因此可以配置新的数据源而无需更改代码。 例如,以下示例 YAML 配置文件将 Congress-CloudState 配置为轮询 nova 端点。 它告诉 Congress-CloudState 轮询路径 servers/detail,使用 jsonpath 表达式 $.servers[:] 提取结果,并最终将 nova.servers 表填充结果。
name: nova
poll: 60
authentication:
type: keystone_password
user: congress_access
password: secret
api_endpoint: https://stack.org/compute/v2.26
tables:
servers:
api_path: servers/detail
api_verb: get
jsonpath: $.servers[:]
架构¶
该架构非常简单。 Congress-CloudState 具有两个主要组件。
数据摄取器通过 API 轮询云服务,并将数据填充到数据库中。 摄取器还接受 webhook 通知。
执行器从数据库读取以确定要执行的操作,然后调用云服务中的适当 API 来执行操作。
用户主要直接与数据库交互,以添加/删除策略规则和查询策略结果。
下图显示了高级组件和数据流。
+----------------------------------------------------------+
| Cloud Services |
+--------------------------------------------------^-------+
| |
| |
+------v--------+ +---------------+ +----------------+
| Congress-JSON | | | | Congress-JSON |
| Data Ingestor +----> PostgreSQL +----> Executor |
| | | | | |
+---------------+ +----------^----+ +----------------+
| |
| |
+----v----------+
| |
| Users |
| |
+---------------+
优势¶
备选方案¶
直接修改 Congress 无关策略引擎以支持 JSON 数据
以下是实施类似功能所需工作量的粗略估计。
设计一种支持 JSON 的新型 Datalog 语言。 这一步很难。 截至目前,Datalog 社区尚未就如何最好地做到这一点达成共识。
对 congress/datalog/* 进行重大更改以处理新语言。
对策略引擎进行重大更改以支持新语言。
更改 congress/dse2/* 以适应 JSON 数据。
与其尝试上述所有工作,我们建议创建一个非常简单的组件,该组件利用 PostgreSQL 允许对 JSON 数据进行策略处理。 如果这种方法被证明是成功的,那么将来可以决定允许 congress-json 用作从 JSON 数据提取其他 Congress 部分(例如,agnostic、z3)所需表格数据的工具。
自行构建支持 JSON 数据的策略引擎,而不是使用现成的策略引擎
这将需要大量的、不必要的开发和维护工作。
选择 PostgreSQL 以外的数据存储
以下是数据存储的主要要求
JSON 数据支持
广泛采用的声明性语言
高性能(非键)连接
对规则(视图)的支持
事务性写入
具有适当许可的强大的开源社区
高度可用的部署选项
细粒度权限
大多数著名的 NoSQL 解决方案不提供高性能的非键连接。
MySQL/MariaDB 支持 JSON 数据,但索引支持有限(通常要求将索引值声明为虚拟列)。
在所有评估的选项中,PostgreSQL 最能满足要求,具有以下显著特点
灵活的 JSONB 数据类型索引,支持高性能的非键连接
非常强大的开源社区和宽松的许可
大量的(第一方和第三方)工具和在线知识,用于学习、查询编写、查询调试和性能调整
灵活且表达力强的权限系统
我们建议从 PostgreSQL 开始,同时保留通过插件架构在未来添加对其他数据存储的支持的选项。
策略¶
在这里,我们提供几个示例来演示如何创建策略和规则。 为了方便读者理解,每个交互都显示在经典的 Congress 交互以及 Congress-CloudState 交互中。
示例数据¶
nova.servers 表是表示服务器的所有 JSON 文档的集合,每个文档在一行中,包含一个包含文档的单个列 d。 每个服务器由 Nova 的 list servers (detailed) API 提供的 JSON 文档表示。 以下是表示 Nova 服务器的简化示例 JSON 文档(UUID 已替换为更易读的字符串以便说明)。
{
"id":"server-134",
"name":"server 134",
"status":"ACTIVE",
"tags":[
"production",
"critical"
],
"hostId":"host-05",
"host_status":"ACTIVE",
"metadata":{
"HA_Enabled":false
},
"tenant_id":"tenant-52",
"user_id":"user-830",
"flavor": {
"disk": 1,
"ephemeral": 0,
"extra_specs": {
"hw:cpu_policy": "dedicated",
"hw:mem_page_size": "2048"
},
"original_name": "m1.tiny.specs",
"ram": 512,
"swap": 0,
"vcpus": 1
}
}
示例 1¶
创建策略(模式)。
Congress 语法
congress policy create vm_error
Congress-CloudState 等效项
CREATE SCHEMA vm_host_down;
创建策略规则(视图),识别主机宕机的服务器。
Congress 语法
congress policy rule create vm_host_down ' error(server_id) :- nova:servers(id=server_id, host_id=host_id), nova:hypervisors(id=host_id, state="DOWN")'
Congress-CloudState 等效项
CREATE VIEW vm_host_down.error AS SELECT d->>'id' AS server_id FROM nova.servers WHERE d->>'host_status' = 'DOWN';
关于语法说明:
->>运算符访问 JSON 对象字段的内容,并将结果作为文本返回。
查询策略表中的结果。
Congress 语法
congress policy row list vm_host_down error
Congress-CloudState 等效项
SELECT * FROM vm_host_down.error;
创建策略规则(视图),识别标记为“critical”且主机宕机的服务器。
Congress 语法
congress policy rule create vm_host_down ' critical(server_id) :- nova:servers(id=server_id, host_id=host_id), nova:hypervisors(id=host_id, state="DOWN"), nova:tags(server_id=server_id, tag="critical")'
Congress-CloudState 等效项
CREATE VIEW vm_host_down.critical AS SELECT d->>'id' AS server_id FROM nova.servers WHERE d->>'host_status' = 'DOWN' AND d->'tags' ? 'critical';
关于语法说明
->运算符访问 JSON 对象字段的内容,并将结果作为 JSON 返回。 在此示例中,d->'tags'返回与每个服务器关联的标签数组。?运算符检查字符串是否是 JSON 结构中的顶级键/元素。 在此示例中,d->'tags' ? 'critical'条件检查字符串“critical”是否在d->'tags'返回的标签数组中。
示例 2¶
创建策略(模式)。
Congress 语法
congress policy create production_stable
Congress-CloudState 等效项
CREATE SCHEMA production_stable;
创建策略规则(视图),识别使用不稳定镜像的生产服务器。
Congress 语法
congress policy rule create production_stable ' error(id) :- nova:servers(id=id, image=image_id), nova:tags(id=id, tag="production"), glance:tags(image_id=image_id, tag="unstable")'
Congress-CloudState 等效项
CREATE VIEW production_stable.error AS SELECT server.d->>'id' AS server_id, image.d->>'id' AS image_id FROM nova.servers server JOIN glance.images image ON server.d->'image'->'id' = image.d->'id' WHERE (server.d->'tags' ? 'production') AND (image.d->'tags' ? 'unstable');关于语法说明:连接条件
server.d->'image'->'id' = image.d->'id'将 glance 镜像与镜像 ID 匹配 glance 镜像 ID 的服务器匹配。
示例 3¶
此示例说明访问深度嵌套数据相对简单。
以下视图(规则)识别所有使用具有 cpu 策略“dedicated”的 flavor 的服务器。 尽管信息被埋藏在几层深处,但只需按照结构即可相对轻松地访问。
CREATE VIEW dedicated_servers AS
SELECT *
FROM nova.servers
WHERE d -> 'flavor' -> 'extra_specs' ->> 'hw:cpu_policy' = 'dedicated';
策略动作¶
策略操作将与 agnostic 引擎类似。 策略编写者将定义一个策略规则(视图),指定在每一行中调用哪个服务执行什么操作,并使用什么参数值。
与 agnostic 引擎一样,新组件将查询“execute”表,然后根据每个策略的“execute”表中的行调用适当的客户端/API 方法。
数据源¶
引入一种通过 YAML 文件配置并以原始 JSON 格式存储数据而不进行转换的新类型数据源。
数据模型影响¶
对数据模型没有影响。
REST API 影响¶
最小的 REST API 影响。 配置 JSON 数据源时,webhook 模型用于接受 webhook 自然扩展。
安全影响¶
当未显式启用实验性组件时,不会产生安全影响。 启用后,存在额外的访问数据,该数据将由 Congress 设置的 PostgreSQL 权限保护。
通知影响¶
没有影响。
其他最终用户影响¶
最终用户可以选择使用众所周知的 PostgreSQL 语法直接对源数据格式编写策略,从而直接访问所有源数据字段。
性能影响¶
初步性能测试表明,在 100,000 条记录上,数据摄取和查询评估的性能都足够了。 如果出现查询性能问题,则有大量的工具和知识可用于调整 PostgreSQL 中的查询性能。
其他部署者影响¶
用于控制新实验性组件部署的附加配置/命令行选项。
开发者影响¶
预计 congress-json 将是一个非常简单的组件。 因此,预计 congress-json 将需要开发人员进行非常少的维护。
依赖项¶
唯一的主要新依赖项是 PostgreSQL,它已经在 OpenStack 部署中使用了。 需要版本 9.4 或更高版本(Ubuntu xenial 附带 9.5)。 它仅影响启用新的实验性组件的人员。
测试¶
针对新组件的简单 tempest 场景。 它们可以 piggyback 在现有的 congress-tempest-postgres 作业上。
文档影响¶
预期新组件的标准文档。