如何在CMDB中落地应用的概念?

我们前面讲了应用是整个微服务架构体系下运维的核心,而CMDB又是整个运维平台的基石。今天我就讲讲在CMDB中如何落地应用这个核心概念,以及如何建立应用集群分组的思路。

如何有效组织和管理应用

微服务架构下会有很多应用产生出来,少则十几、几十个,多则上百甚至上千个。这时我们面临的第一个问题就是如何有效地组织和管理这些应用,而不是让它们在各处散乱,命名方式和层次结构可能还不统一。

你可能接触过“服务树”的概念,这个提法是小米在早期互联网运维实践的分享中传播出来的。我第一次听到这个概念是在13年阿里技术嘉年华大会上听小米运维的分享。再往前,这个概念应该是从百度的运维体系中借鉴出来的。

这里的服务实际对应的就是我们前面提到的应用这个概念。据我了解,在阿里和腾讯都是叫作应用,现在业界比较通用的叫法也是应用。其实叫什么并不重要,关键还是要学习到对这个概念的管理方式。

从服务树这个名字中,我们就可以了解到,有效组织和管理应用的方式,就是把它组织成一个树形的层次结构。这种管理模式,无论是在BAT,还是在其它的互联网公司,基本都是一样的思路和模式,所以叫法虽然不同,但是思路上却是相通的,可谓异曲同工。

基于业务维度的拆分,对应产生了我们的应用拆分原则。比如对于电商公司,大的维度会有电商、支付、广告、流量和搜索等业务领域;进一步,电商业务领域里最典型的会有用户、会员、商品、交易、商家、店铺以及物流等;这里面还可以再进一步细分,比如商品会有详情、SKU、SPU、库存、评价、标签等。

讲到这里,我们再看一下技术团队的组织架构,基本上是对应着整个业务技术架构的拆分的。也就是业务架构决定了技术架构,而技术架构又决定了一个研发团队的组织架构,这个组织架构中不同的团队单元分别承担着对应业务的需求开发和实现职责。

上面这个组织架构建设的逻辑和思路,也是我们在组建团队和职责划分时可以参考的。

这样一个逻辑讲下来,我们的应用管理思路其实也就明晰了:产品线-业务团队-应用

这里举个电商商品的例子就是:电商技术-商品团队-商品中心-商品详情等。

当然因为每个公司对组织架构定义的方式不同,也可以用一、二级部门这样的方式来指代。但是具体团队的分工和职责,一定是来自于业务架构决定的技术架构,只有这样,各业务团队才会职责清晰,配合协作才会顺畅起来。

对于应用名定义,要设定规范,比如:

  • 应用名必须以大小写英文字母以及下划线组合
  • 应用名长度不超过40个字符,尽量简单易懂
  • 不允许出现机房代号和主机名称这样的信息

简单举例,商品中心命名为itemcenter,商品详情命名为detail。

这里做个小结:到了软件运维阶段,运维工作是否可以高效地组织开展,很大程度上,在前面的业务架构拆分阶段就决定了。也就是业务架构拆分得是否合理、职责是否明晰,决定了后续团队组织架构是否合理、团队职责是否明晰。如果这点没做好,到了运维阶段必然就是混乱的。

这一点我在开篇词中也提到过,运维能力的体现,一定是整体技术架构能力的体现,割裂两者单独去看,都是没有意义的。同时,对于当前仍然把运维割裂建设的研发团队,也需要去思考一下在组织架构建设上的合理性了。

应用的集群服务分组建设

上述讲到的是应用的组织管理,看上去逻辑思路相对清晰,组织起来也不复杂,但是再往下,应用的集群服务分组建设就会相对复杂了。

为什么会有集群服务分组呢?我们一起来看这么几个需求场景。

  • 场景一:多环境问题。

    我们常见的环境会有开发联调环境、集成测试环境、预发环境、线上环境等等。后面我们讨论持续交付时会讲到,实际场景下所需要的环境会更多。
  • 场景二:多IDC问题。

    对于大型互联网业务,会做业务单元化,或者有海外业务拓展需求的场景,我们会在多个IDC机房部署应用,应用代码是相同的,但是配置可能会不同。
  • 场景三:多服务分组问题。

    这个场景就跟具体业务场景相关了。举个例子,比如商品中心IC这样一个核心应用,对外会有商品详情、交易下单、订单、购物车、评价、广告、秒杀活动、会场活动、商家、店铺等一系列应用依赖它,但是这些依赖它的应用优先级是不一样的。

    • 核心应用和非核心应用:比如交易支付链路上的应用属于核心应用,任何时候都必须要优先保障,但是对于评价、商家和店铺这些应用优先级就低一些。反过来理解就是一个应用出现故障,是不是会影响业务收入,如果影响就属于核心应用,如果不是或者影响非常小,那就属于非核心应用。所以IC这个应用下面,就会有IC的交易分组,IC的广告分组、IC的电商分组等,这些分组就会相对固定和静态。
    • 场景因素决定。这个对于电商就会比较典型,比如大促时的秒杀场景,对于参加秒杀活动的商品,瞬时的访问量就会非常大,而不参加活动的商品就不会有这么大的访问量。所以这时为了隔离较大的流量,就需要有多个不同的秒杀IC分组,从资源层面进行隔离;同时上层秒杀活动的应用在配置中心配置依赖时,就要配置到对应的秒杀IC集群分组上,这样即使秒杀IC出现问题,也不会影响正常的商品IC访问。所以根据场景,不同阶段就会有IC的大促秒杀分组,这种类型的分组就需要根据实际的业务场景来决定,是个动态调整的过程,需要开发和运维一起来讨论和验证。

一般情况下,集群服务分组会有以上三个维度中的一个或多个来决定。还是以商品中心IC为例,按照上面的介绍,就会对应如下关系:

至此,“应用-集群服务分组-资源”的对应关系就建立起来了。这里我们叫它“应用树”或者“服务树”都可以,不管叫什么,这个信息是CMDB中最为关键和核心的信息。为什么是最关键和核心的呢?

CMDB在基础服务体系中的核心位置

这里我们以应用为核心来看,CMDB中会保存“应用-分组-资源”的对应关系,这个关系对于周边系统来说都是需要的,举例如下。

监控系统。

我们需要以上的对应关系,监控到每个应用、每个集群以及每台机器上的关键信息。

发布系统。

我们需要将每个应用对应的代码进行编译打包,然后发布到对应集群的主机上,也需要这个对应关系,这一点我在后面的持续交付中还会讲到。

服务化框架。

需要依赖应用和集群分组两个信息,其中主要是对应用名和集群分组名的依赖,对于服务化框架来说,更多的是通过其配置管理中心注册的应用名,来实现应用的服务和API管理,这里要做到与CMDB统一。同样,像LVS和Nginx这样的四七层负载,以及ZK这样的开源分布式配置管理,凡是涉及服务注册、服务发现以及服务上下线的基础服务,都是类似思路。

基础服务中。

如分布式DB、分布式缓存和消息等,就需要应用的应用名,以及应用与资源IP的对应关系,或者集群分组与IP的对应关系。

  • 应用名,是因为要建立应用与分布式服务实例之间的关系。如应用与缓存NameSpace的对应关系,应用与消息Topic的对应关系等,以便于这些基础服务的生命周期管理和自动化开发。

  • 应用与资源的对应关系,是因为有些核心资源是要做ACL访问控制的。比如对于用户、交易或支付这样非常敏感的数据,它们对应的数据库就不允许随意连接,而应该是仅限于授权过的应用访问。这时就要针对应用对应的IP地址进行白名单配置。一方面,可以通过分布式DB中间件进行配置;另一方面,也可以通过在DB层面进行设置,比如MySQL就可以直接配置白名单策略;同时也可以在机器的iptables上配置,至于如何配置就看具体需求了,但是无论怎样,应用与资源的对应关系是非常重要的。

稳定性保障平台,或者叫服务治理平台。

针对系统的稳定性,我们会在应用中做很多的降级限流和开关预案策略,这些都是跟应用直接关联的。而且按照我们前面介绍的,不同的集群分组,策略可能会有不同,所以又会跟集群分组相关。同时,这些策略最终下发到具体服务器上运行的应用实例上,所以这里就会需要应用、集群分组以及对应的资源关系。

总结一下,简单示意图如下:

总结

通过上述的分析,我们可以看到基于以应用为核心的CMDB中,又衍生出“应用-集群服务分组-资源”这样一个运维体系中的核心关系。经过这三部分的分析,我们之前所说的基于应用为核心的运维视图就可以建立出来了,我们再次示意如下:

今天我们讨论的内容提到了,监控、发布、基础服务以及稳定性平台会依赖CMDB中“应用、集群服务分组-资源”的对应关系信息,但是当CMDB中的这些关系信息发生变化,比如新增一个IP,或者下线一个IP,这些信息是如何传递到其它平台的呢?这些平台又是如何查询这些关键信息的呢?

精品提问

  1. 我想问下,cmdb需要体现应用的依赖关系吗?

    不需要,应用的依赖更多体现在服务调用层面,cmdb里面的应用粒度还是会比较粗。这一点后面会有文章讲到。
  2. 对于小的开发团队或者初创的开发团队可能在基础设施架构的管理上并没有过多的资源,而更偏向于使用云端的设施或架构,甚至如serverless之类的计算服务。这方面的运维管理会有较大的差异或者模式上的差别吗?

    体量不同,管理方式和采用的技术手段必然不一样,就跟数据量大的表和量小的表,查询方式和索引方式一定是不一样的。
    量不大的时候可以怎么快怎么来,即使没有运维,问题也不大,但是要有意识,如果业务量开始快速增长了,就要有规划和设计了。
  3. 应用所在容器不固定如何处理关系呢,比如弹性扩容所容以及应用down了重新启动一个docker镜像?

    应用跟运行载体不一定是ip,容器id或者pod的对应关系也可以
  4. cmdb提供API或者命令用来查询应用 资源的信息 当cmdb信息有变化的时候其他平台通过API或者命令同步最新的信息

    量大的话可以通过消息方式处理变更
  5. 框架已经搭好,接下来就期待博主能讨论一个具体的实施方法了,比如说是纯粹基于name还是引入了tag,比如相关的组策略等等

    Tag模式适用于场景更复杂,体量更大的情况下,这种情况需要更为灵活的查询和分类,我建议体量不大的话尽量简化设计。我们自己就当前情况,一直是通过相对固定的分组模式来管理。

如何在CMDB中落地应用的概念?的更多相关文章

  1. 如何在.Net中使用MongoDB

    最近在研究mongodb,针对.net 中使用mongodb的文章要么是早期的驱动版本,要么资料很少,所以写个随笔记录一下 本文主要记录 1.什么是MongoDB 2.MongoDB windows ...

  2. 服务化改造实践 | 如何在 Dubbo 中支持 REST

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) “架构风格以及基于网络的软件架构设计” 中提出来的 ...

  3. 二、消息队列之如何在C#中使用RabbitMQ(转载)

    二.消息队列之如何在C#中使用RabbitMQ 1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源 ...

  4. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  5. 如何在Javascript中利用封装这个特性

    对于熟悉C#和Java的兄弟们,面向对象的三大思想(封装,继承,多态)肯定是了解的,那么如何在Javascript中利用封装这个特性呢? 我们会把现实中的一些事物抽象成一个Class并且把事物的属性( ...

  6. 如何在 Laravel 中灵活的使用 Trait

    如何在 Laravel 中灵活的使用 Trait  Laravel/ 3个月前/  1740 /  4 / 更新于 3个月前   @这是小豪的第九篇文章 好久没有更新文章了,说好了周更结果还是被自己对 ...

  7. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  8. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  9. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

随机推荐

  1. go-admin在线开发平台学习-3[细节解析]

    本章节主要的内容是对go-admin中的一些有趣编码进行分析,为自己以后提供一些借鉴 使用cli方式启动项目 使用cobra[眼镜蛇]完成强壮cli的工具,确保稳定. 使用cli的方式启动项目的好处显 ...

  2. oracle中的in参数超过1000的解决方案

    在oracle中,使用in方法查询记录的时候,如果in后面的参数个数超过1000个,那么会发生错误,JDBC会抛出"java.sql.SQLException: ORA-01795: 列表中 ...

  3. net里面using的使用

    起初using就明白一个作用  那就是引用命名空间.当面试官听到我回答这个问题的时候,马上就还问我,还有什么作用?我就只能摇头了,今天在网上看了下using的作用. 1.using指令.using + ...

  4. jQuery编写组件的几种方式

    原文链接:https://w.cnblogs.com/xiao-xi/p/8572471.html 三种方式: 1.通过$.extend()来扩展jQuery 2.通过$.fn 向jQuery添加新的 ...

  5. 渗透测试--Nmap主机识别

    通过本篇博客可以学到:Nmap的安装和使用,列举远程机器服务端口,识别目标机器上的服务,指纹,发现局域网中存活主机,端口探测技巧,NSE脚本使用,使用特定网卡进行检测,对比扫描结果ndiff,可视化N ...

  6. DOS打开方式

    一.CMD窗口 Ⅰ.普通身份 按下键盘组合键:Windows + R --> 出现'运行'窗口,在'打开'的输入框中输入'cmd' --> 点击确定 打开'开始'菜单 --> 找到' ...

  7. Linux fork()一个进程内核态的变化

    [前言]用户态的变化,耳熟能详不在赘述.现在支持读时共享,写时复制. 一.内核态的变化 1.fork一个子进程代码 #include <stdio.h> #include <stdl ...

  8. 【HTB系列】靶机Netmon的渗透测试

    出品|MS08067实验室(www.ms08067.com) 本文作者:是大方子(Ms08067实验室核心成员) 总结和反思: win中执行powershell的远程代码下载执行注意双引号转义 对po ...

  9. Java实现贪吃蛇

    游戏界面基本布局 贪吃蛇是基于JFrame的一款小游戏.它主要有两部分组成,一个是显示区域,一个是按钮区域.这两个区域都用JPanel来实现. 首先需要创建一个基于JFrame的类,例如创建一个MyF ...

  10. 解决:layUI数据表格+简单查询

    解决:layUI数据表格+简单查询 最近在用layui写项目,在做到用户查询时,发现在layui框架里只有数据表格,不能增加查询.于是自己摸索了一下,写个笔记记录一下. 我想要的效果: 1.定义查询栏 ...