返回首页
当前位置: 主页 > 互联网技术 > 虚拟化 >

基于服务树的监控系统实践

时间:2017-09-18 23:38来源:电脑教程学习网 www.etwiki.cn 编辑:admin

一、传统监控系统的困扰

说到监控,大家肯定能列举不少,zabbix、nagios、open-falcon、Prometheus等。凤凰网和其他大多数互联网公司一样,一开始选择了开源的zabbix来做为公司的监控系统。就这样,相安无事,多年过去了。随着公司服务器的不断增长,我们遇到了一些难题:

  1. 当服务器量级达到3000左右时,监控数据存储和查询遇到瓶颈。
  2. 业务上报监控系统不方便,没有相应的接口或SDK。
  3. zabbix中的组概念没有层次和依赖关系,不利于服务治理。
  4. 一些定制化的监控需求难以满足(集群监控等)。

相信第一个问题很多体量稍大的公司都遇到过,大家用得最多的一个解决方案是拆分zabbix,部署多套来分担压力。但是后端查询过慢的问题没有从根本上解决,而且增加了维护成本,考虑到zabbix后端是c语言写的,二次开发有一定难度,于是我们打算自己造个轮子。

二、自建监控系统需求分析

2.1关于服务树

先简单介绍下几个概念:

服务树:某些公司为了方便管理服务集群,利用树形结构建立起了一种服务组织关系,方便集群          服务治理,以服务集群节点为管理单元,而不是某台机器。

Open-Falcon:是小米开源的一套分布式高性能监控系统,支持服务树管理。

有人可能会问,你们为什么不直接用开源的 open-falcon ,不得不承认, open-falcon 的某些设计还是非常不错的,我们也从中学习了很多思路。但是由于小米公司当时没有开源出结合监控的服务树,我们不得不自己设计一套适合自己,也可能适合你的服务树。

基于服务树,我们可以更方便的管理自己的服务, 服务树是整个监控系统的基础服务,后来我们开发的发布系统也是基于服务树实现的。基于 golang 的运维友好性和高性能,整个服务树是用 golang 实现的,对于新手来说,上手难度也不高。服务树架构图如下:

监控系统

服务树架构图

2.2关于高可用

考虑到服务树(service registry)组件的重要性,架构上一定是高可用的,于是我们底层数据存储 store 层多实例是基于 raft 算法保证数据一致性的,最底层是用了 boltDB 来存储服务树的数据,另外为了提高服务树的读性能我们还为 store 层添加了支持 lru 算法的 cache 模块, cache 结构体如下:

// Cache implements a non-thread safe fixed size LRU cache. type Cache struct {    mu        sync.RWMutex    count     int    evictList *list.List    items     map[string]map[string]*list.Element    size    uint64    maxSize uint64    enable bool    logger *log.Logger }

在启动服务树的时候,我们可以指定服务树开启的内存大小,现在我们开启了 50M , 效果还是非常不错的。

2.3关于扩展性

如果你启动了 3 个实例,正常情况下 raft 底层是有一个 leader 和两个 follower 的,写操作必须落在 leader 上才能成功,很多开源软件也都是这样的,但是这样服务树就有状态了,对于用户提交数据不是特别友好。

于是我们在 cluster 这一层会做判断,如果进来一个写操作,直接尝试本机,如果失败了,再把请求转发到 leader 上,底层帮助用户做数据转发,这样用户不用关心那个是 leader ,3台对他来说是一样的,前端加个负载均衡可以随便接受请求了。

在这里我们底层还做了一些工作,就是把 cluster 监听的 TCP 端口和 raft 数据同步的端口复用,这样,用户的配置也就精简了。

另外服务器可以根据一定策略自动注册到服务树上的某个服务节点当中,机器,报警,权限在服务中都是一种资源,这种资源都有增删改查的操作,对于服务树来说这些没有什么区别,只是人定义了它,服务树中一切皆资源,后期扩展极为方便。

2.4关于性能

zabbix 很大的一个问题就是用结构型数据库来存储了时序性数据。考虑到整个监控系统的配置数据和监控指标数据是有不同特点的:

  • 配置数据:量小、读取频繁、可用性要求高
  • 监控数据:量大、读取冷热分明、可用性要求高

可以考虑把监控配置数据抽象城资源存储到服务树中,保证数据可用性,而对于监控指标数据可以存储到时序性数据库当中,开源的有 OpenTSDB、InfluxDB、Prometheus等。

2.5关于业务数据上报

业务上有越来越多上报打点需求,我们可以考虑从 agent 端开放出接口,把业务上报的数据作为普通数据一起打包入库,这样也复用了监控系统数据传递的整条链路,同时降低了系统维护难度。对于一些标准的基础服务采集,我们采用插件的方式来实现,在 zabbix 中叫模板,比如 nginx 的一些指标, mysql 的一些指标等。

------分隔线----------------------------
标签(Tag):服务树 监控系统
------分隔线----------------------------
推荐内容
猜你感兴趣