Elastic/Kibana核心技术解析:Saved Objects机制详解
kibana Your window into the Elastic Stack 项目地址: https://gitcode.com/gh_mirrors/ki/kibana
一、Saved Objects基础概念
Saved Objects(持久化对象)是Kibana插件开发中的核心机制,它允许开发者将自定义实体持久化存储在Kibana系统索引中(通常称为.kibana
索引)。这套机制本质上是一个面向Elasticsearch的对象文档映射器(ODM),为Kibana插件提供了类似传统数据库的持久化能力。
典型应用场景包括:
- 仪表盘(Dashboards)配置存储
- 可视化组件(Lens)定义
- 画布工作区(Canvas workpads)
- 索引模式(Index patterns)
- 案例管理系统(Cases)
- 机器学习任务(ML jobs)
- 高级设置项(Advanced settings)
二、核心架构设计
1. 数据访问层
开发者通过SavedObjectClient进行对象管理,与常规Elasticsearch数据访问形成明确分层:
- 业务数据 → 通过Data插件的Search服务访问
- 配置/元数据 → 通过Saved Objects机制管理
2. 引用关系管理
为支持导入导出及多空间共享功能,Saved Objects需显式声明对象间的引用关系。设计原则为:
- 父对象持有子对象引用(而非反向)
- 导出父对象时自动包含子对象
- 导出子对象时不包含父对象
三、版本兼容与迁移方案
当Saved Object类型发生破坏性变更时(如属性类型修改、字段删除等),必须编写迁移脚本确保旧数据兼容:
// 典型迁移示例
const migration = {
'1.0.0': (doc) => {
return { ...doc, attributes: { ...doc.attributes, newField: 'default' } };
},
'2.0.0': (doc) => {
const { deprecatedField, ...rest } = doc.attributes;
return { ...doc, attributes: rest };
}
};
四、安全控制体系
1. 权限模型
- Kibana特权模型:控制Saved Objects访问
- Elasticsearch特权模型:控制常规数据索引访问
2. 空间感知(Space Awareness)
- 对象创建于特定空间
- 可共享到其他空间
3. 细粒度权限控制
- 基于角色的访问控制(RBAC)
- 按对象类型设置读/写权限
- 未来将支持对象级安全(OLS)特性
五、高级特性解析
1. 存储优化策略
默认情况下所有类型共享单个索引,对于以下场景建议使用独立索引:
- 对象包含大量独特字段
- 预计会产生海量对象实例
- 典型案例:Reporting、Task Manager
// 配置独立索引示例
{
name: 'custom_type',
indexPattern: '.kibana_custom'
}
2. 搜索限制说明
由于存储在系统索引中,Saved Objects无法像常规数据那样被搜索。这也是为什么会出现"[X] as data"这类表述的原因。
3. 存储模式对比
| 模式 | 描述 | 典型场景 | |-------------|-----------------------------|-------------------------| | By Reference | 通过引用ID关联独立对象 | 可视化组件保存到库后再添加到仪表盘 | | By Value | 对象完整数据嵌套在父对象中 | 未保存的临时可视化直接嵌入仪表盘 |
六、多空间共享机制
自Kibana 7.12起支持的共享策略:
- multiple-isolated:对象仅存在于单一空间
- multiple:对象可存在于多个空间
- agnostic:对象全局存在于所有空间
迁移建议:
- 新类型:直接选用multiple/multiple-isolated
- 旧类型(legacy):需按规范迁移至新命名空间类型
七、最佳实践建议
- 引用设计:始终保持父→子的单向引用关系
- 版本管理:任何破坏性变更必须配套迁移脚本
- 安全规划:提前设计好空间和权限策略
- 性能考量:海量数据对象应考虑独立索引
- 用户体验:合理选择by value/by reference存储模式
通过深入理解Saved Objects机制,开发者可以构建出更健壮、更易维护的Kibana插件,同时为用户提供一致的数据管理体验。
kibana Your window into the Elastic Stack 项目地址: https://gitcode.com/gh_mirrors/ki/kibana
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考