蓝鲸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.rhkb.cn/news/301205.html

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

相关文章

JavaScript实现全选、反选功能(Vue全选、反选,js原生全选、反选)

简介: 在JavaScript中,实现全选和反选通常是通过操作DOM元素和事件监听来实现; 全选功能:当用户点击一个“全选”复选框时,页面中所有具有相同类名的复选框都将被选中; 反选功能:用户点击一个…

ARP寻址过程

当知道目标的IP但是不知道目标的Mac地址的时候就需要借助ARP寻址获取目标的Mac地址,传输层借助四元组(源IP源端口:目标IP目标端口)匹配,网络层借助IP匹配,数据链路层则根据Mac地址匹配,数据传输…

局域网共享文件夹怎么加密?局域网共享文件夹加密方法介绍

在企业局域网中,共享文件夹扮演着重要的角色。为了保护数据安全,我们需要加密保护局域网共享文件夹。那么,局域网共享文件夹怎么加密?下面我们来了解一下吧。 局域网共享文件夹加密方法 局域网共享文件夹加密推荐使用共享文件夹加…

在git上先新建仓库-把本地文件提交远程

一.在git新建远程项目库 1.选择新建仓库 以下以gitee为例 2.输入仓库名称,点击创建 这个可以选择仓库私有化还公开权限 3.获取仓库clone链接 这里选择https模式就行,就不需要配置对电脑进行sshkey配置了。只是需要每次提交输入账号密码 二、远…

万字源码解析!彻底搞懂 HashMap【一】:概念辨析与构造方法源码解析

HashMap 的底层原理和扩容机制一直都是面试的时候经常被问到的问题,同时也是集合源码中最难阅读的一部分😢,之前更新的 ArrayList 源码阅读收获了很多朋友的喜欢,也给了我很多自信;本次我准备完成一个关于 HashMap 源码…

python练习三

模式A num int(input("请输入模式A的层数:")) for i in range(1, num 1):# 画数字for j in range(1, i 1):print(str(j) "\t", end"")print() 模式B num int(input("请输入模式B的层数:")) for i in ran…

九州金榜|孩子叛逆的原因是什么?

孩子随着年龄增长都会出现叛逆心理,很多家长不知道孩子为什么会出现叛逆心理,也不知道如何去引导孩子,下面九州金榜家庭教育就带大家了解一下孩子出现叛逆的原因。 一、心理需求增加 孩子对新事物的探索以及追求会随着人际交往扩大而增加&am…

2024年MathorCup妈妈杯数学建模思路D题思路解析+参考成品

1 赛题思路 (赛题出来以后第一时间在群内分享,点击下方群名片即可加群) 2 比赛日期和时间 报名截止时间:2024年4月11日(周四)12:00 比赛开始时间:2024年4月12日(周五)8:00 比赛结束时间&…

买卖股票的最佳时机IV

题目链接 买卖股票的最佳时机 IV 题目描述 注意点 1 < k < 1001 < prices.length < 10000 < prices[i] < 1000不能同时参与多笔交易&#xff08;必须在再次购买前出售掉之前的股票&#xff09;最多可以完成 k 笔交易 解答思路 本题与买卖股票的最佳时机…

单例模式--理解

单例模式 单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时&#xff0c;为了防止频繁地创建对象使得内存飙升&#xff0c;单例模式可以让程序仅在内存中创建一个对象&#xff0c;让所有需要调用的地方都共享这一单例对象。 单…

Vue - 你知道Vue组件之间是如何进行数据传递的吗

难度级别:中级及以上 提问概率:85% 这道题还可以理解为Vue组件之间的数据是如何进行共享的,也可以理解为组件之间是如何通信的,很多人叫法不同,但都是说的同一个意思。我们知道,在Vue单页面应用项目中,所有的组件都是被嵌套在App.vue内…

『VUE』14. Style绑定(详细图文注释)

目录 行内css动态样式对象引入数组引入代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 大体上和前面的class绑定是一致的,只是class换成了style. 请注意,实际开发中,我们一般建议用class,因为style的权重太高了,用sty…

能不能换DB吗?--抽象工厂模式

1.1 就不能不换DB吗&#xff1f; 都是换数据库惹的祸。 "我们团队前段时间用.net的C#来开发好一个项目&#xff0c;是给一家企业做的电子商务网站&#xff0c;是用SQL Server作为数据库的&#xff0c;应该说上线后除了开始有些小问题&#xff0c;基本都还可以。而后&#…

【2024】Rancher的安装与介绍

———————————————————————————— 记录一下rancher的学习与使用过程 本部分内容包括rancher的介绍、特点、与k8s关系和部署等内容 ———————————————————————————— Rancher是什么&#xff1f; 简单来说&#xff0c;Ranc…

ChatGPT 在做什么,为什么有效?

原文&#xff1a;What Is ChatGPT Doing … and Why Does It Work? 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 序言 这本简短的书试图从第一原理解释 ChatGPT 是如何工作的。在某种程度上&#xff0c;这是关于技术的故事。但它也是关于科学的故事。以及关于哲学…

MySQL的内连接和外连接

内连接 在之前的MySQL的复合查询时&#xff0c;我们能够通过给两个表做笛卡尔积查询和where子句限定条件来查询想查询的数据&#xff0c;不过MySQL还提供了内连接用来给两个表做笛卡尔积&#xff0c;对比之前的复合查询笛卡尔积来说语法更加简洁。 语法&#xff1a;select 字段…

基于51单片机的温度、烟雾、火焰检测设计

基于51单片机的火灾检测设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.使用MQ-2烟雾采集&#xff0c;使用ADC0832将传感器输出的模拟信号转化为数字信号&#xff0c;再传给单片机。 2.使用DS18B20采集温度。…

Linux中shell脚本的学习第一天,编写脚本的规范,脚本注释、变量,特殊变量的使用等,包含面试题

4月7日没参加体侧的我自学shell的第一天 Shebang 计算机程序中&#xff0c;shebang指的是出现在文本文件的第一行前两个字符 #&#xff01; 1)以#!/bin/sh 开头的文件&#xff0c;程序在执行的时候会调用/bin/sh, 也就是bash解释器 2)以#!/usr/bin/python 开头的文件&#…

动态代理

动态代理 动态代理和静态代理角色一致。 代理类是动态生成的,不是我们直接写好的。 动态代理分为俩大类:基于接口的动态代理、基于类的动态代理 基于接口:JDK动态代理(以下示例就是这个) 基于类:cglib java字节码实现:javasist JDK动态代理 InvocationHandler Proxy …

记一次Cannot deploy POJO class [xxx$$EnhancerBySpringCGLIB$$xxx]的错误

最近项目上需要使用websocket做服务端&#xff0c;那好说啊&#xff0c;直接springboot集成的websocket 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId><versi…