重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
open-falcon是小米开源的监控工具。open-falcon有三种安装方式,一种是单机安装(分后端和前端安装,建议各一台服务器)、一种是Docker安装、最后一种是在多台机器上分布式安装。
创新互联专注于永康网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供永康营销型网站建设,永康网站制作、永康网页设计、永康网站官网定制、成都小程序开发服务,打造永康网络公司原创品牌,更为您提供永康网站排名全网营销落地服务。
重点:本案介绍第一种,单机安装(其实是分两台服务器,一台安装后端服务、一台是安装前端服务)。
分布式安装也很简单,就是把open-falcon二进制包git下来,每台服务器只留需要的模块文件夹和open-falcon执行脚本,然后更改模块文件夹下配置文件,最后启动即可。生成环境环境一般建议分布式部署,参考链接:https://book.open-falcon.org/zh_0_2/distributed_install/
open-falcon监控一般是用各种插件。
架构图:
open-falcon官网架构图
互联网上图
组件描述表:
组件名称 | 用途 | 服务端口 | 备注 |
Agent | 部署在需要监控的服务器上 | http: 1988 | http://192.168.153.134:1988/ |
Transfer | 数据接收端,转发数据到后端的Graph和Judge | http: 6060 rpc: 8433 socket: 4444 | |
Graph | 操作rrd文件存储监控数据 | http: 6071 rpc:6070 | |
Query | 查询各个Graph数据,提供统一http查询接口 | http: 9966 | |
Dashboard | 查询监控历史趋势图的web | http: 8081 | 需要python环境,需要连接数据库dashborad实例、graph组件 |
Task | 负载一些定时任务,索引全量更新、垃圾索引清理、自身组件监控等 | http: 8082 | 需要连接数据库graph实例 |
Aggregator | 集群聚合模块 | http: 6055 | |
Alarm | 告警 | http: 9912 | |
Api | API | http: 8080 | |
Gateway | Gateway | http: 16060 | |
Hbs | 心跳服务器 | 6030 | |
Judge | 告警判断 | http: 6081 rpc: 6080 | |
Nodata | 告警异常处理 | http: 6090 | |
MySQL | 数据库 | 3306 | |
redis | 缓存服务器 | 6379 |
工作原理:
Falcon-agent(客户端):
每台服务器,都有安装falcon-agent,falcon-agent是一个golang开发的daemon程序,用于自发现的采集单机的各种数据和指标,这些指标包括不限于以下几个方面,共计200多项指标。
CPU相关
磁盘相关
IO
Load
内存相关
网络相关
端口存活、进程存活
ntp offset(插件)
某个进程资源消耗(插件)
netstat、ss 等相关统计项采集
机器内核配置参数
只要安装了falcon-agent的机器,就会自动开始采集各项指标,主动上报,不需要用户在server做任何配置(这和zabbix有很大的不同),这样做的好处,就是用户维护方便,覆盖率高。当然这样做也会server端造成较大的压力,不过open-falcon的服务端组件单机性能足够高,同时都可以水平扩展,所以自动多采集足够多的数据,反而是一件好事情,对于SRE和DEV来讲,事后追查问题,不再是难题。
另外,falcon-agent提供了一个proxy-gateway,用户可以方便的通过http接口,push数据到本机的gateway,gateway会帮忙高效率的转发到server端。
falcon-agent,可以在我们的github上找到 : https://github.com/open-falcon/falcon-plus
Transfer(传输者):
falcon-agent将数据上报给transfer,它们之间建立的长链接。
transfer,接收客户端发送的数据,做一些数据规整,检查之后,转发到多个后端系统去处理。在转发到每个后端业务系统的时候,transfer会根据一致性hash算法,进行数据分片,来达到后端业务系统的水平扩展。
transfer 提供jsonRpc接口和telnet接口两种方式,transfer自身是无状态的,挂掉一台或者多台不会有任何影响,同时transfer性能很高,每分钟可以转发超过500万条数据。
transfer目前支持的业务后端,有三种,judge、graph、opentsdb。judge是我们开发的高性能告警判定组件,graph是我们开发的高性能数据存储、归档、查询组件,opentsdb是开源的时间序列数据存储服务。可以通过transfer的配置文件来开启。
transfer的数据来源,一般有三种:
falcon-agent采集的基础监控数据
falcon-agent执行用户自定义的插件返回的数据
client library:线上的业务系统,都嵌入使用了统一的perfcounter.jar,对于业务系统中每个RPC接口的qps、latency都会主动采集并上报
说明:上面这三种数据,都会先发送给本机的proxy-gateway,再由gateway转发给transfer。
Judge集群(告警判断):
falcon-agent将数据上报给transfer后,transfer转发给Judge集群,使用一致性hash做数据分片。一个实例只处理一部分数据。
Graph集群(数据存储、规定、查询接口):
falcon-agent将数据上报给transfer后,transfer转发给Graph集群,使用一致性hash做数据分片。一个实例只处理一部分数据。rrdtool的数据归档方式存储,同时提供RPC接口。
Alarm(告警):
Judge判断后,放到redis队列。alarm从redis队列读取报警事件做处理,该发短信发短信、该发邮件发邮件,该回调接口就回调。告警合并也在alarm里面做的,专门发送报警的sender模块,告警合并依赖的links模块。
Query:
因为Graph做过分片处理,query要采用和transfer一致的一致性hash数据分片。对外提供一个http接口。query是go写的后端模块。
Dashborad:
在dashborad里面查询监控数据,是python做的web。
Portal:
portal是python做的web,配置监控策略,然后写入数据库。
Heartbeat server:
心跳服务器,falcon-agent每分钟都会发送心跳给heartbeat server,上报自己的版本、hostname、ip等。从heartbeat拉取要执行的插件和特殊采集项等。这些信息需要heartbeat访问 Portal的数据库要获取。Judge要做告警判断,需要先从portal数据库中读取报警策略,但是Judge实例比较多,都去读取数据库会造成很大压力,所以可以让heartbeat成为db cache缓存,heartbeat从数据库中读取数据缓存到内存,Judge调用heartbeat的rpc接口,获取报警策略。
数据存储:
对于监控系统来讲,历史数据的存储和高效率查询,永远是个很难的问题!
数据量大:目前我们的监控系统,每个周期,大概有2000万次数据上报(上报周期为1分钟和5分钟两种,各占50%),一天24小时里,从来不会有业务低峰,不管是白天和黑夜,每个周期,总会有那么多的数据要更新。
写操作多:一般的业务系统,通常都是读多写少,可以方便的使用各种缓存技术,再者各类数据库,对于查询操作的处理效率远远高于写操作。而监控系统恰恰相反,写操作远远高于读。每个周期几千万次的更新操作,对于常用数据库(MySQL、postgresql、MongoDB)都是无法完成的。
高效率的查:我们说监控系统读操作少,是说相对写入来讲。监控系统本身对于读的要求很高,用户经常会有查询上百个meitric,在过去一天、一周、一月、一年的数据。如何在1秒内返回给用户并绘图,这是一个不小的挑战。
open-falcon在这块,投入了较大的精力。我们把数据按照用途分成两类,一类是用来绘图的,一类是用户做数据挖掘的。
对于绘图的数据来讲,查询要快是关键,同时不能丢失信息量。对于用户要查询100个metric,在过去一年里的数据时,数据量本身就在那里了,很难1秒之类能返回,另外就算返回了,前端也无法渲染这么多的数据,还得采样,造成很多无谓的消耗和浪费。我们参考rrdtool的理念,在数据每次存入的时候,会自动进行采样、归档。我们的归档策略如下,历史数据保存5年。同时为了不丢失信息量,数据归档的时候,会按照平均值采样、最大值采样、最小值采样存三份。
// 1分钟一个点存 12小时 c.RRA("AVERAGE", 0.5, 1, 720) // 5m一个点存2d c.RRA("AVERAGE", 0.5, 5, 576) c.RRA("MAX", 0.5, 5, 576) c.RRA("MIN", 0.5, 5, 576) // 20m一个点存7d c.RRA("AVERAGE", 0.5, 20, 504) c.RRA("MAX", 0.5, 20, 504) c.RRA("MIN", 0.5, 20, 504) // 3小时一个点存3个月 c.RRA("AVERAGE", 0.5, 180, 766) c.RRA("MAX", 0.5, 180, 766) c.RRA("MIN", 0.5, 180, 766) // 1天一个点存1year c.RRA("AVERAGE", 0.5, 720, 730) c.RRA("MAX", 0.5, 720, 730) c.RRA("MIN", 0.5, 720, 730)
对于原始数据,transfer会打一份到hbase,也可以直接使用opentsdb,transfer支持往opentsdb写入数据。