同步资源服务搭建CMDB
引导式阅读
Go
同步资源服务搭建CMDB
作者
C***
上架时间
2020-12-26 07:01:42

场景简介

本场景是资源管理服务Resource Management Service(后称RMS)的一个关于资源同步和CMDB搭建的使用示例。它主要利用RMS获取华为云用户的云上资源,可帮助用户搭建CMDB并保证云资源数据的最终一致性。

前置条件

若您想要让该场景正常工作,您需要一个拥有云资源的华为云账号,并且您需要配置RMS中的资源记录器功能,其中您尤其需要关注的是SMN主题(本场景通过HTTP协议订阅SMN主题来接收由资源管理服务发出的消息通知)。

本场景示例使用MySQL5.7用作数据存储。

最终一致性

在本场景中,我们使用两种同步机制,分别是全量同步和增量同步来保证CDMB中资源数据的最终一致性。为了保证最终一致性,我们在示例代码中引入了两个字段checksumqueryAt来检查一个资源是否应该被更新。

  • checksum:一个检查资源是否发生变化的指标。资源的任何属性发生变化,它都会改变。
  • queryAt:从RMS查询到某个资源的最新时间戳。

注意

> - 无论是全量同步还是增量同步,只有当CMDB中资源的checksum和从RMS查询到的不相等并且queryAt相比从RMS查询到的更早时,我们才会更新CMDB中的资源。 >- 对于CMDB中的资源,我们只做伪删除(标记资源的删除状态并更新queryAt时间戳)。

全量同步

全量同步每天运行一次,它将您在配置了的华为云上的所有资源同步到CMDB。考虑到您华为云上的资源量可能很大,我们将按照资源类型和区域的粒度进行同步。

cn-north-1****中的ecs.cloudservers**资源为例。当触发全量同步时,本场景示例将执行以下操作:

  1. 从RMS查询到的cn-north-1中的所有ecs.cloudservers视为集合A。
  2. 从CMDB查询到的cn-north-1中的所有ecs.cloudservers视为为集合B。
  3. 计算集合A和B的交集和两个差集
  4. 对三个结果集进行对应的增删改操作

假设集合A的数量为N,集合B的数量为M,则区分全量同步中一个区域中一种资源类型所有资源操作状态的时间复杂度为O(max(N,M))。

增量同步

增量同步从SMN接收消息来实时同步资源。

当收到经过验证的合法消息后,我们将根据其通知类型采取不同的措施。在该场景实例中,我们只处理资源变更类型的通知,该通知包含三种事件类型创建更新删除,根据事件类型,我们在CMDB上执行相应的操作。

您可能担心消息丢失和消息乱序这两种非典型情况会影响到CMDB中资源数据的一致性。

消息丢失

以单个资源为例,暂时不考虑消息乱序,我们将以表格的形式向您展示如何在资源变更消息通知丢失的情况下保证资源的一致性。

事件类型 是否为最后一条消息通知? 如何保证一致性?
创建 下一次全量同步
创建 下一次资源变更消息或下一次全量同步
更新 下一次全量同步
更新 下一次资源变更消息或下一次全量同步
删除 只能是最后一条消息通知 下一次全量同步

消息乱序

众所周知,在单个资源的所有资源变更消息通知中,有且仅有一个创建事件类型的通知,最多一个删除事件类型的通知以及许多更新事件类型的通知。

以单个资源为例,暂时不考虑消息丢失,我们将以表格的形式向您展示如何在资源变更消息通知乱序的情况下保证资源的一致性。

正常消息顺序 乱序消息顺序 如何保证一致性?
创建->更新 更新->创建 更新会在CMDB中成功插入资源,当创建来时,对比checksum不同,但是CMDB中资源的queryAt比消息中来的资源的queryAt更晚,所以不更新资源。
更新1->更新2 更新2->更新1 更新2会更新CMDB中的资源,当更新1来时,对比checksum不同,但是CMDB中资源的queryAt比消息中来的资源的queryAt更晚,所以不更新资源。
更新->删除 删除->更新 删除会删除CMDB中的资源,当更新来时,CMDB中资源的queryAt比消息中来的资源的queryAt更晚,所以不更新资源。
创建->删除 删除->创建 删除不会对CMDB产生任何影响,此时还没有数据,当创建来时,会在CMDB成功插入数据从而造成数据不一致直到下一次全量同步。

示例代码

目前只开源了GO版本示例代码,未来还将开源其它编程语言版本的示例代码。

注意

>场景示例中的cron调度是单机版的. 如果您的生产环境是分布式的,请参考一些分布式调度程序比如RichardKnop/machinery.