蓝鲸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,任务查看

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql知识点梳理

mysql知识点梳理 一、InnoDB引擎中的索引策略,了解过吗?二、一条 sql 执行过长的时间,你如何优化,从哪些方面入手?三、索引有哪几种类型?四、SQL 约束有哪几种呢?五、drop、delete、truncate的区…

勒索病毒最新变种.rmallox勒索病毒来袭,如何恢复受感染的数据?

导言: 随着信息技术的飞速发展,网络安全问题日益突出,其中勒索病毒便是近年来备受关注的网络安全威胁之一。在众多勒索病毒中,.rmallox勒索病毒以其独特的传播方式和强大的加密能力,给广大用户带来了极大的困扰。本文…

java算法题每日多道十六

502. IPO 题目 假设 力扣(LeetCode)即将开始 IPO 。为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 力扣 设计完成最多…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号混知近2000篇历史文章在线查看,找文章方便了

关于公众号文章批量下载,我之前写过很多文章: 视频更新版:批量下载公众号文章内容/话题/图片/封面/音频/视频,导出html,pdf,excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

牛客小白月赛90(C\D\E)

C 小A的数字(思维,考虑特殊情况) 一、题目要求 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 小A给定一个数字 n,请你帮她找出从低位对齐后任意一位均与 n对应数位不同的最小正整数。 对于本题…

大型语言模型(LLMs)面试常见问题解析

概述 这篇文章[1]是关于大型语言模型(LLMs)的面试问题和答案,旨在帮助读者准备相关职位的面试。 token? 在大型语言模型中,token 指的是什么? 分词(Tokenization):可以将…

IDEA/PyCharm/GoLand同时打开2个分支

背景 想对比2个分支的代码,或者在A分支开发时,需要看B分支,切来切去太麻烦,而且新写的代码还没法直接切到B分支。 操作方法 假如有A、B 2个分支。 通过git worktree为B分支新建1个worktree,然后通过打开新项目的方式…

list使用与模拟实现

目录 list使用 reverse sort unique splice list模拟实现 类与成员函数声明 节点类型的定义 非const正向迭代器的实现 list成员函数 构造函数 尾插 头插 头删 尾删 任意位置插入 任意位置删除 清空数据 析构函数 拷贝构造函数 赋值重载函数 const迭代器的…

【c++】初阶模版与STL简单介绍

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好,本篇文章介绍一下模版和对STL进行简单的介绍,后续我们进入对STL的学习! 目录 模版1.泛型编程2.函数模板2.1函数模板的原理2.2模版的实例化…

03.28_111期_C++_vector特性和使用

如果写出vector这个类的时候不用缺省值&#xff0c;也不用初始化列表 那么可以编写如下构造函数&#xff0c;利用半缺省参数给没有初始化的vector实例进行赋空 但如果存在下面这两句话的设计 template <class InputIterator> vector(Inp…

前端学习<四>JavaScript基础——07-基本数据类型:Number

数值型&#xff1a;Number 在 JS 中所有的数值都是 Number 类型&#xff0c;包括整数和浮点数&#xff08;小数&#xff09;。 var a 100; // 定义一个变量 a&#xff0c;并且赋值整数100console.log(typeof a); // 输出变量 a 的类型​var b 12.3; // 定义一个变量 b&#…

大语言模型LLM《提示词工程指南》学习笔记02

文章目录 大语言模型LLM《提示词工程指南》学习笔记02设计提示时需要记住的一些技巧零样本提示少样本提示链式思考&#xff08;CoT&#xff09;提示自我一致性生成知识提示 大语言模型LLM《提示词工程指南》学习笔记02 设计提示时需要记住的一些技巧 指令 您可以使用命令来指…

【ubuntu】Vim配置记录

一、Vim介绍 vim是一个高度可定制的文本编辑器&#xff0c;有许多丰富的功能&#xff0c;扩展性极强&#xff0c;用户可以通过多种方式来增强vim vim有非常多的优点&#xff0c;例如高效率的移动&#xff0c;可以不用鼠标&#xff0c;完全用键盘操作&#xff0c;占用系统资源较…

159 Linux C++ 通讯架构实战14,epoll 函数代码实战

ngx_epoll_init函数的调用 //&#xff08;3.2&#xff09;ngx_epoll_init函数的调用&#xff08;要在子进程中执行&#xff09; //四章&#xff0c;四节 project1.cpp&#xff1a;nginx中创建worker子进程&#xff1b; //nginx中创建worker子进程 //官方nginx ,一个…

深入解析Python的lxml库:高效处理XML和HTML的利器

更多Python学习内容&#xff1a;ipengtao.com Python中的lxml库是一个强大的XML和HTML处理库&#xff0c;它基于libxml2和libxslt库&#xff0c;提供了高效的XML解析和处理功能。本文将详细介绍lxml库的安装、特性、基本功能、高级功能、实际应用场景和总结&#xff0c;帮助读者…

phpstorm设置头部注释和自定义注释内容

先说设置位置&#xff1a; PhpStorm中文件、类、函数等注释的设置在&#xff1a;setting-》Editor-》FIle and Code Template-》Includes-》PHP Function Doc Comment下设置即可&#xff0c;其中方法的默认是这样的&#xff1a; /** ${PARAM_DOC} #if (${TYPE_HINT} ! "…

Unity与CocosCraetor对比学习三

一、计时器 1.在Creator中 void start() {// js中的计时器// 延迟1秒后执行一次&#xff0c;不受Cocos限制setTimeout(() > {console.log("haha");}, 1000);// 每隔1秒执行一次setInterval(() > {console.log("haha");}, 1000);// creator中的计时…

计算机网络的分层结构及模型

1.计算机网络分层的基本原则 &#xff08;1&#xff09;各层之间相互独立&#xff0c;每层只实现一种相对独立的功能 &#xff08;2&#xff09;每层之间的交互尽可能少 &#xff08;3&#xff09;结构上可分割开&#xff0c;每层都采用最合适的技术来实现 &#xff08;4&…

Linux第4课 Linux的基本操作

文章目录 Linux第4课 Linux的基本操作一、图形界面介绍二、终端界面介绍 Linux第4课 Linux的基本操作 一、图形界面介绍 本节以Ubuntu系统的GUI为例进行说明&#xff0c;Linux其他版本可自行网搜。 图形系统进入后&#xff0c;左侧黄框内为菜单栏&#xff0c;右侧为桌面&…

在订单流程中锁定库存的最佳时机

目录 1. 用户点击结算时锁定库存 2. 用户提交订单时锁定库存 3. 用户支付成功后锁定库存 最佳时机选择 1. 用户点击结算时锁定库存 优点&#xff1a;确保用户在决定购买时商品是可用的&#xff0c;增加了用户的购买信心。缺点&#xff1a;如果用户在结算后放弃购买&#x…