蓝鲸6.1 CMDB 事件推送的开源替代方案

本文来自腾讯蓝鲸智云社区用户:木讷大叔爱运维

背景

在蓝鲸社区“社区问答”帖子中发现这么一个需求:

--fec098ae72bbac0dded46d693e234b45.png

究其原因,我在《不是CMDB筑高墙,运维需要一定的开发能力!》一文中已经介绍,在此我再简单重复下:

  • 蓝鲸5.1 自带“事件推送”功能,当配置信息发生变化的时候,实时通知到关联的系统中;
  • 蓝鲸6.1 不再提供“事件推送”功能,而是由“监听资源变化事件”的一个 CMDB API 实现,需要我们自行查询;

CMDB 版本的迭代,或许说明老版本的“事件推送”已经不符合蓝鲸的设计理念,作为此功能的对接使用者感同深受:

  • 事件推送功能全面性,基本覆盖了CMDB全场景的信息变化;
  • 事件推送更类似一个图形化的API,通过界面就让开发者知道该如何使用;
  • “简单的背后的逻辑复杂化”,这是在对接事件推送接口的第一感受;
  • 由于功能的全面性,意味着数据格式的多样性,对接过程你懂得;

通过对事件推送功能对接过程的回顾以及对替代服务resource watch的使用对比,就非常理解蓝鲸社区推陈出新的做法了!

需求

既然是小伙伴们“插眼关注”的问题,与其等待答案,不如我们自己去寻找答案!

API分析

该 watch 功能的主要特性包括:

  • 在有限的时间内(目前为 3 小时,可能会调整,请勿依赖此时间)为用户提供高可用的数据变更 watch 服务。
  • 在有限时间内,用户可以根据自己上一次事件的 cursor(游标)进行事件回溯或者追数据,适用于异常数据回溯,或者系统变更进行数据补录。
  • 支持根据时间点进行变更数据回溯,支持根据游标进行变更数据回溯,支持从当前时间点进行数据变更 watch。
  • 支持根据事件类型进行 watch 的能力,包括增、删、改。事件中包含全量的数据。
  • 支持主机与主机关系数据变化的事件 watch 能力。
  • 采用短长链的设计,当用户通过游标进行事件 watch 时,如果没有事件,则会保持会话连接,在 20s 内有事件变更则直接直接将事件推回。避免用户不断请求,同时保证用户能及时的拿到变更的数据。
  • 支持批量事件 watch 能力,提升系统吞吐能力。
  • 支持定制关注的事件数据字段,满足用户轻量级的 watch 需求。

链接:https://bk.tencent.com/docs/document/6.1/190/14399

事先先行

对接CMDB属于事件驱动,因此事件先行,先来分析通过API都能获取哪些事件:

  • host 代表主机详情事件
  • host_relation 代表主机的关系事件(主要使用)
  • biz 代表业务详情事件
  • set 代表集群详情事件
  • module 代表模块详情事件
  • process 代表进程详情事件
  • object_instance 代表通用模型实例事件
  • mainline_instance 代表主线模型实例事件
  • biz_set 代表业务集事件
  • biz_set_relation 代表业务集和业务的关系事件

以上事件未必都能用到,我们只要按需获取即可,这也体现了watch服务的灵活性!

动作其次

每类事件都有其相应的动作:

  • create 创建
  • delete 删除
  • update 更新

我们的工作重点就是从事件中将增、删、改的动作分离出来,对下游系统进行事件回放,从而保证数据同步。

时间/事件回溯

虽然时间回溯最长间隔为3小时,我们还是希望对不同粒度的事件进行区分,原则如下:

  • host_relation 主机关系事件,实时生效;
  • module 模块事件,实时生效;
  • set 集群事件、biz 业务事件等,可适当在不同时间间隔生效;

时间回溯保证我们能查到历史数据,而事件回溯的cursor游标能够保证我们避免重复的事件。
因此我们对于时间/事件回溯要有一个清醒的理解!

功能需求

通过API的分析,其实我们的功能需求也就同时梳理了出来:

  • 核心目标:CMDB驱动资产同步,按业务/集群/模块/主机的结构与下游系统实现关系对应;
  • 事件驱动:
    1)biz 业务名同步;
    2)set 集群名同步;
    3)module 模块名同步;
    4)host_relation 主机关系同步;
    5)其他名称或关系同步;

开发框架

根据”监听资源变化事件“接口的特性,我梳理了下开发过程的几个要点:

  • 对于事件的获取、与下游系统同步,这是两个步骤。不需要等待同步完成再去获取事件,要进行解耦
    1)事件获取,异步执行;
    2)与下游系统对接,同步执行;
  • 不同事件变化的频繁度不同,我们要按需获取,因此就需要一个调度器,可自定义调度计划;

通过以上分析,我们初步确认了python + celery + rabbitmq的几个组件:

  • celery 用于对不同时间回溯间隔的调度;
  • rabbitmq 通过交换机、路由、队列分别保存celery调度的任务;
  • python对不同事件结果封装统一的数据与其他运维系统进行资产同步;

其具体的实现流程如下图:
--a15fed825c203b5ee29fad5997dacae9.png

具体部署

依赖组件

1.Python 3.9
2.Celery
3.Rabbitmq 保存celery调度任务

安装

1.python环境

conda create -n resource-watch python=3.9
source activate resource-watch
pip install  requests celery pyamqp flower kombu

2.rabbitmq环境

# 安装rabbitmq
yum install rabbitmq-server
systemctl start rabbitmq-server
systemctl enable rabbitmq-server

# 开启 RabbitMQ 的web管理界面
rabbitmq-plugins enable rabbitmq_management
# 创建admin用户并授权
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p '/' admin '.' '.' '.*'
rabbitmqctl list_users
rabbitmqctl list_user_permissions admin
systemctl restart rabbitmq-server

# 访问rabbitmq管理界面
http://ip:15672

1.路由队列

针对不同事件,使用不同的队列

交换机路由队列备注
cmdbcmdb.host_relationcmdb.host_relation主机关联关系事件
cmdbcmdb.modulecmdb.module模块事件
cmdbcmdb.setcmdb.set集群事件
cmdbcmdb.bizcmdb.biz业务事件

2.运行

cd /app/resource-watch
# 启动beat,将定时任务发送至worker
celery -A celery_cmdb beat -l INFO --detach

# 启动worker,异步执行任务,绑定相应事件队列
celery -A celery_cmdb worker -Q cmdb.host_relation -l INFO -c 1 -D
celery -A celery_cmdb worker -Q cmdb.module -l INFO -c 1 -D
celery -A celery_cmdb worker -Q cmdb.set -l INFO -c 1 -D
celery -A celery_cmdb worker -Q cmdb.biz -l INFO -c 1 -D

# 启动flower,任务查看

总结

整个开发过程比较重要的是“对不同事件结果数据的封装”,除了部分开发经验外,就是要不断的试错,这样才能保证我们完成对最终的数据格式的解析,从而更好的匹配下游运维子系统!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519889.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Apache Pulsar源码解析之Lookup机制

引言 在学习Pulsar一段时间后,相信大家也或多或少听说Lookup这个词,今天就一起来深入剖析下Pulsar是怎么设计的它吧 Lookup是什么 在客户端跟服务端建立TCP连接前有些信息需要提前获取,这个获取方式就是Lookup机制。所获取的信息有以下几种…

[机器学习]人工智能为小米智架保驾护航

前言 小米汽车作为小米集团进军汽车行业的新尝试,吸引了广泛的关注。其结合了小米在科技和创新方面的优势,以及对智能出行的愿景,为汽车行业注入了新的活力。虽然小米汽车工厂还处于初期阶段,但其积极采用人工智能和机器学习等前沿…

基于Pytorch+昇腾NPU部署baichuan2-7B大模型

一、模型介绍 Baichuan 2 是百川智能推出的新一代开源大语言模型,采用 2.6 万亿 Tokens 的高质量语料训练。Baichuan 2 在多个权威的中文、英文和多语言的通用、领域 benchmark 上取得同尺寸最佳的效果。 它基于 Transformer 结构,在大约1.2万亿 tokens…

docker进行jenkins接口自动化测试持续集成实战

文章目录 一、接口功能自动化测试项目源码讲解二、接口功能自动化测试运行环境配置1、下载jdk,maven,git,allure并配置对应的环境变量2、使用docker安装jenkins3、配置接口测试的运行时环境选择对应节点4、jenkins下载插件5、jenkins配置环境…

解决element-plus table组件 fixed=“right“(left)浮动后横向滚动文字穿透的问题

BUG 版本:element-plus 2.6.1 浏览器:360极速浏览器22.1 (Chromium内核) 组件:el-table组件 问题:在头部/尾部浮动加上斑马条纹后,横向滚动存在文字穿透的问题。具体如图: 白色背景行的文字&#xff0c…

【关于窗口移动求和的两种计算方法】

窗口移动计算方法 例子方法1方法2运行结果: 例子 在很多算法中都会涉及到窗口滑动,比如基于新息序列更新的自适应卡尔曼滤波器算法中便会使用到。 已知一个数列:OCV [1;2;3;4;5;6;7;8;9;10;11;12;13;14;15],定义窗口长度为5,每次…

Python自带的集成开发和学习环境IDLE 中安装工具包的pip文件修复和重置解决方法————以win 7系统下Python 3.8 32-bit为例

Python自带的集成开发和学习环境IDLE 中安装工具包的pip文件修复和重置解决方法————以win 7系统下Python 3.8 32-bit为例 目录 Python自带的集成开发和学习环境IDLE 中安装工具包的pip文件修复和重置解决方法————以win 7系统下Python 3.8 32-bit为例一、IDLE简介和特点…

软考111-上午题-【计算机网络】-URL和DNS

一、URL解析 org:各类组织结构(非盈利团队) 1-1、顶级域 顶级域名是域名的最后一个部分,即是域名最后一点之后的字母,例如:www.baidu.com这个域名中,顶级域是.com(或.COM&#xff…

2024/4/5 ACM格式练习

一、知识点: (1)行数不固定:用Scanf的err返回值判断是否读到EOF。 (2)每行数据个数不固定:一个一个读数据和它后面的字符,判断后面的字符是否是换行符。如果是就说明读完了一行数据…

重读Java设计模式: 桥接模式详解

引言 在软件开发中,经常会遇到需要在抽象与实现之间建立连接的情况。当系统需要支持多个维度的变化时,使用传统的继承方式往往会导致类爆炸和耦合度增加的问题。为了解决这一问题,我们可以使用桥接模式。桥接模式是一种结构型设计模式&#…

计算机网络—HTTP协议:深入解析与应用实践

​ 🎬慕斯主页:修仙—别有洞天 ♈️今日夜电波:ヒステリックナイトガール 1:03━━━━━━️💟──────── 5:06 🔄 ◀️ ⏸ ▶️ ☰…

vue 实现的h5 页面,如何设置页面中的 title

修改页面中的title 公共修改方式在App.vue 中: created() {document.title "测试标题"; },单个页面修改,就在单个页面编写就ok

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程,算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库,Kafka存业务数据,MySQL存维度数据 采集工具是Kettle和Flume,Flume采集Kafka数据,Kettle采集MySQL数据 离线数仓是Hi…

JVM专题——垃圾回收

本文部分内容节选自Java Guide和《深入理解Java虚拟机》, Java Guide地址: https://javaguide.cn/java/jvm/jvm-garbage-collection.html 🚀 基础(上) → 🚀 基础(中) → 🚀基础(下&…

2024-04-05 问AI: 介绍一下深度学习中的Leaky ReLU函数

文心一言 Leaky ReLU(Leaky Rectified Linear Unit)函数是深度学习领域中的一种激活函数,主要用于解决ReLU(Rectified Linear Unit)函数在负值区域为零的问题。ReLU函数在输入为正时保持原样,而在输入为负…

(学习日记)2024.04.07:UCOSIII第三十五节:互斥量实验

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

通过 Cookie、Redis共享Session 和 Spring 拦截器技术,实现对用户登录状态的持有和清理(三)

本篇内容对应 “2.4 生成验证码” 小节 和 “4.7 优化登陆模块”小节 视频链接 1 Kaptcha介绍 Kaotcga是一个生成验证码的工具。 你的网站验证码是什么? 在我们这个牛客论坛项目,验证码分为两部分 给用户看的是图片,用户根据图片上显示的…

跨境电商独立站是什么?为什么要做独立站?

跨境电商独立站就是跨境电商自行搭建的销售网站,服务器、域名都是自主购买的,并由跨境电商独立运营与营销推广。 近些年来,各类第三方电商平台虽然流量大,但是随着进驻电商数量的增加,流量竞争也愈发激烈,…

基于顺序表实现通讯管理系统!(有完整源码!)

​​​​​​​ 个人主页:秋风起,再归来~ 文章专栏:C语言实战项目 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安!​​​​​​​ 目录 1、实现思路 ​…

C语言中strlen函数的实现

C语言中strlen函数的实现 为了便于和strlen函数区别,以下命令为_strlen。 描述:实现strlen,获取字符串的长度,函数原型如下: size_t strlen(const char *str);_strlen实现: size_t _strlen(const char*…