25

服务树系列(一):什么是服务树及其核心功能

 3 years ago
source link: https://studygolang.com/articles/30389
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

服务树 这个名词几乎所有运维和运维开发同学都不陌生,但是服务树的原理和为啥用服务树估计大家并不了解,本文先来讨论下这些基本概念,下文讨论如何实现,下图为其核心组件stree-index

iaEbi2R.png!mobile

服务树与资源管理

其实无论是引入CMDB或服务树的一个重要目的是完成对应用运行所依赖的资源管理

资源包含什么

既然是应用运行时依赖的,那么自然能想到的是诸如ecs/elb/rds/dcs/domain/等

  • ecs:就是机器,具体可以是虚拟机/物理机,可以轻松的设计出这一张表
+-------------------+--------------+------+-----+-------------------+----------------+
| Field             | Type         | Null | Key | Default           | Extra          |
+-------------------+--------------+------+-----+-------------------+----------------+
| id                | int(11)      | NO   | PRI | NULL              | auto_increment |
| uid               | varchar(100) | NO   | UNI | NULL              |                |
| name              | varchar(200) | NO   |     | NULL              |                |
| hash              | varchar(100) | NO   |     | NULL              |                |
| cloud_provider    | varchar(20)  | NO   |     | NULL              |                |
| account_id        | int(11)      | NO   |     | NULL              |                |
| region            | varchar(20)  | NO   |     | NULL              |                |
| tags              | json         | YES  |     | NULL              |                |
| instance_type     | varchar(100) | NO   |     | NULL              |                |
| charging_mode     | varchar(10)  | YES  |     | NULL              |                |
| private_ip        | json         | YES  |     | NULL              |                |
| public_ip         | json         | YES  |     | NULL              |                |
| availability_zone | varchar(20)  | NO   |     | NULL              |                |
| vpc_id            | varchar(40)  | YES  |     | NULL              |                |
| subnet_id         | varchar(40)  | YES  |     | NULL              |                |
| status            | varchar(20)  | NO   |     | NULL              |                |
| security_groups   | json         | YES  |     | NULL              |                |
| created_at        | datetime     | NO   |     | NULL              |                |
| create_time       | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
| update_time       | datetime     | NO   |     | CURRENT_TIMESTAMP |                |
+-------------------+--------------+------+-----+-------------------+----------------+
  • elb:代表负载均衡器,elb可以分为L4/L7,承接服务的入口和转发流量
  • rds:代表关系型数据库,engine可以分为 mysql/PostgreSQL
  • dcs:代表nosql型缓存,engine可以分为redis/memcached
  • domain:代表域名常,可以解析到elb/ecs
  • 其余资源:凡是能应用运行所依赖的并且需要管理的都可以继续添加资源

资源记录维护模式

基于物理机房的采购入库模式

info-agent

基于公有云的信息同步方式

  • 如果是基于公有云的形式,那么新增/删除资源等操作最终都需要到具体的云上操作
  • 如果公有云能提供每次增量更新的信息(比如几点几分新开了10台规格为xx的ecs),并将这个信息以类似公有云消息通知服务 SMN 推送到注册好的借口即可完成对资源的增量更新
  • 那么多个公有云账号下面其实有资源的全局视图
  • 所以只能通过一个 sync-worker 组件定时同步,然后在sync中做 to_add,to_del,to_mod 的set 做增量更新

引入树级结构目的

  • 经过上面讨论的内容我们已经有了若干张资源表:ecs/elb/rds/dcs
  • 但是资源和业务好像没有什么关联
  • 所以要引入一颗树

树级结构组织形式

  • 一个三级树结构展示
祖父层级一:
  父层级一:
    子层级一
    子层级二
    子层级三
  父层级二:
    子层级一
    子层级二
    子层级三
祖父层级二:
  父层级三:
    子层级一
    子层级二
    子层级三
  • 服务树单一标识的表现形式:使用 . 分隔父子结构 比如 a.b.c

服务的标示

具体要几级完全取决于树级结构的实现方式及其合理的业务解释

命名规范一 三层 {产品组}.{项目}.{应用} group.project.app G.P.A
基础架构部
监控
query
infrastructure.monitor.query

资源和服务节点绑定关系

  • 资源 资源绑定在服务/应用级别
  • 即资源绑定在A上面,所有资源都围绕A
  • 所以上面的G.P.A三段模型不能扩展成G.P.A.R

    • 其中R代表region,因为有的资源无法绑定在R维度
    • region只应该作为一个查询tag使用

资源和服务节点如何绑定

  • 可以给资源记录打上G.P.A三个tag

服务树核心功能

  • 说了半天了我们现在可以得出服务树核心功能包括:资源查询、资源管理、授权
  • 其中 灵活的筛选业务与资源的关联关系 是核心功能中的核心

查询

一个好的服务树查询组件应该支持业务/资源维度任何标签组合的结果

查询模式

- eq 等于            : key=value 
- not_eq 不等于      : key!=value
- reg 正则匹配       : key=~value
- not_reg 正则非匹配 : key!~value
- 对比               : key> value

几种查询举例

查询业务与资源的关系

  • 举例1:查询a组下b项目使用ecs情况:得到结果是两个ecs

i2U3AbE.png!mobile

  • 举例2:查询a组下b项目c应用使用elb情况

查询条件叠加一个标签的分布情况

  • 举例1: 查询infrastructure.monitor.query项目中ecs按照规格分布情况,可以看到这个gpa的cluster标签有四个,展示他们的分布情况

ymeEFb.png!mobile

根据资源元数据标签查询

  • 举例1: 查询region region-a 使用ecs情况

复杂查询

  • 举例1: 查询region为c,ip以10.10开头的,属于 infrastructure.monitor.query项目并且规格不是4c_8g的ecs列表

翻译成查询条件

nyyUR3Q.png!mobile

其中type字段在代码中的对应关系为

byeU7zz.png!mobile

资源统计功能

这个功能其实是查询延伸出来的,区别是查询是 被动而且局部的 ,资源统计是 主动而且全局的

全局资源统计

3ABF7jM.png!mobile

查询gpa下属服务ecs按照云厂商分布

juiuamF.png!mobile

ecs特殊统计

按规格统计:可以看到几c几g

ruMbAfe.png!mobile

ecs核数

aUjimqE.png!mobile

ecs内存g

UNN3Yr7.png!mobile

管理

  • 资源申请
  • 资源流转
  • 资源回收

授权

因为team可以绑定在g/p/a任意维度

  • 举例: team-a:包含两个人(张三和李四)
  • 有gp:infrastructure.monitor下属两个a为query和alert
  • 可以将team-a和infrastructure.monitor.query绑定也可以绑定到

infrastructure.monitor上代表team-a拥有不同的权限

  • 王五使用发布系统对infrastructure.monitor.query发布时,可以查看发布请求人王五是否在对应的授权team中来判断是否放行此次发布

权限分类

  • 分类一:增删team中user的权限
  • 分类二:查看gpa资源权限
  • 分类三:管理gpa资源权限

未完待续。。。

有疑问加站长微信联系

iiUfA3j.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK