2.技术选型:

 

prometheus、zabbis、nagios、open-falcon进行选型

 

监控系统       语言       成熟度    扩展性    性能       社区活跃       容器支持       企业使用

zabbix            c+php    高           高           低           中                  低                  高

nagios           c             高           中           中           低                  低                  低

open-falcon   go          中           高           高           中                  中                  中

prometheus   go          中           高           高           高                  高                  高

 

zabbix、open-falcon可以自定义脚本,zabbix可以推拉都支持,prometheus定义了监控数据规范,可以通过开发各种exporter扩展系统采集能力

 

zabbix用mysql导致性能有硬伤,nagios和open-falcon都是rdd环形数据库存储模式,但是open-falcon是做了一致性hash实现数据分片的,还能对接OpenTSDB,prometheus是自研了时序数据库,每秒千万级数据存储

 

open-falcon基本是国内公司活跃

 

skywalking往往是用他来做APM,系统性能监控(每分钟访问量、接口延迟)+ 链路追踪,prometheus+grafana -> 所有机器的可视化监控(cpu、内存、磁盘、io、网络),ELK存储日志是国内大部分公司都常见的

 

3.prometheus监控数据指标的分类讲解

 

counter,只增不减,机器启动时间(从系统启动开始计算到现在为止的时间)、http总访问量一类的,跟rate配合,看各个时间段里的指标变化情况,比如QPS,每秒的http请求数,以及这个变化率,就是通过counter可以算出来的

 

gauge,仪表盘,指标实时变化情况,cpu和内存使用量,网络io大小,总量恒定,但是变化的时候可大可小

 

summary,数据分布状况,比如接口响应时间,TP50、TP75、TP90、TP95、TP99,50%的接口请求都是少于20ms,75%的请求少于50ms,90%的请求少于100ms,95%可能是300ms,99%可能是1s,50%小于几毫秒、75%、90%、95%、99%

 

histogram,区间内样本个数

 

4.Prometheus联邦集群部署架构设计

两层架构,每个prometheus server负责监控一部分的机器,上层有联邦节点,负责汇总下层节点的数据,但是这里有一个问题,那就是负责监控部分机器的单个server还不是高可用的,这是有问题的

 

后来有一个国外公司开源的Prometheus高可用方案,叫做Thanos,无缝集成Prometheus

 

querier,sidercar,store,compactor

 

每个prometheus上都得部署一个sidercar,他是负责代理querier对server数据的读取的,另外还会把本地存储数据写到对象存储中去,querier接收http的promql查询,负责数据查询汇聚,向sidecar发送grpc请求,sidecar调用prometheus api获取数据,querier聚合数据在一起

 

查询数据的时候,如果查询的是历史数据,querier调用store接口,直接从对象存储里获取数据,compactor是屁处理组件,针对对象存储进行压缩,把雄安对象合并压缩成大对象,节约磁盘占用

 

5.Prometheus本地TSDB时序数据存储设计

时序数据,按照时间来排序和组织再一起的一段数据,存储和查询都是按照时间熟悉来进行查找的,mysql(b树索引来存储+基于索引来查询+事务),hbase(按照rowkey来进行kv格式的数据存储),InfluxDB、OpenTSDB和prometheus自研TSDB是按照时间顺序来组织和存储数据的

 

 

 

监控数据按照时间分隔成block,大小不固定,按照步长倍数递增,最小的block保存2h监控数据,步数为3,步长为3,block的大小就是2h、6h、18h,小block合并大block,二个2h的block合并为6h的block

 

block文件名是创建时间,可以按时间对block排序

 

block有4个部分,chunks、index、meta.json、tombstones,chunks就是压缩后的时序数据,每个chunk是512mb

 

index是对数据进行检索设计的,记录chunk里时序的offset,TOC表是index入口,记录index文件里其他表的位置,写入其他表的是之前,先把当前offset作为该表地址记录下来,读取index先读取TOC表

 

symbol table,tsdb对磁盘里的标签是避免重复存储的,都是用符号表里的索引来代替的,时序列表,series,记录block中每个时序的标签以及这些时序关联的chunk块,label index table,把相同标签组合知道一起,postings表,代表标签和时序的关联关系

 

查询某个时间段某个指标的监控数据,先根据时间段找到block,加载每个block的index文件,读取index的TOC表找到其他表,最后52个字节就是TOC表(6个表*每个表8字节的offset+4字节的crc校验和),接着找到符号表,确定指标标签在符合表里的索引id,接着基于这个索引id继续查找

 

指标标签是在标签索引表里,找到标签再postings table的位置,找到具体的posting,这样就能找到这个标签对应的时序了,找到对应的时序后,根据时序表查找他在block里的位置,就可以读取磁盘加载监控数据了

 

tombstone是对数据进行软删除的

 

meta.json是block的元数据

 

 

WAL,预写日志,为了防止暂存内存中的数据丢失,引入WAL,分隔为默认大小为128mb的文件segment,数字命名,00000001一类的,WAL的写入单位是page,每个page是32kb

 

 

远端存储,是一套接口,引入adapater适配器,把读写请求转化为第三方远端存储接口,InfluxDB、OpenTSDB,CreateDB、TiDB、Cortex、M3DB等等,http post请求+protobuf编码,调用adapter的读写接口,接口定义再remote.proto文件里,读请求是同步的,但是写请求是异步的

 

多个分片队列,合并数据后异步一次性发送数据过去,分片队列默认是1个,10s重新计算一次,动态可变,合并后再给adapter就可以了