41

点我达RDS监控系统改造

 4 years ago
source link: http://tech.dianwoda.com/2020/01/06/dian-wo-da-rdsjian-kong-xi-tong-gai-zao/
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.

一、项目背景

目前点我达的数据库集群主要集中在3个区域, 一个是杭州阿里云的rds集群, 一个是上海阿里云idc自建的数据库集群, 还有一个是杭州idc自建数据库集群,总的数据库实例规模大概在500左右, 阿里云rds的监控展示和报警推送,完全依赖于阿里云的云监控。 QzQb22B.jpg!webZRZjqa2.png!web

需要解决的问题

当然,不是说阿里云的云监控不好, 是当集群规模达到一定数量之后

1、实例纵向维度的对比很难做, 无法做时间跨度比较大的监控趋势查看

2、实例横向的对比很难去做,比如订单分片后,各个分片节点rds的负载、请求等情况,无法做横向对比

3、监控指标较单一, 无法新增新的监控指标

4、报警规则比较单一,无法做定制化的报警规则和推送

5、引擎层的监控数据采集频率无法控制,且如果小于60s需要额外付费用

所以基于以上几点原因, 本人做了rds数据库监控的本地化改造, 即将rds的引擎监控、机器层面监控、以及报警推送等转为dba自己来做, 脱离阿里云云监控, 同时监控系统同样适用于idc自建数据库,达到监控体系的统一。

二、项目架构

思考: 本地化监控改造大概分为以下几个部分:

1、定监控体系架构, 决定采用当前比较流行并且本人比较熟悉的prometheus监控体系

2、1对多问题,常规的自建数据库监控一般使用prometheus的官方mysqld_exporter,在ecs上部署一个exporter,1对1进行监控。 但是rds没有实体机器来部署exporter 所以需要对官方的mysqld_exporter 进行改造或者重新开发,让exporter支持1对多的监控。 这里我是采用比较快的方法,直接拿官方mysqld_exporter 进行源码修改。

3、机器层面的监控, node_exportermysqld_exporter 一样, 直接拿官方源码进行修改,支持1对多的监控

4、rds实例过多, 如果一一把配置都写进prometheus比较繁琐,故这里使用prometheus 里的consul config特性,将数据库实例信息注册到consul,然后prometheus 从consul里抓取实例信息,下发给exporter, exporter 再去具体实例上抓取需要的监控信息。

5、报警收敛和分级推送。 点我达已经有了一套报警收敛、推送的自研系统, 所以这里只需把报警推送到Alertmanager 就可以了。

6、监控图表展示, 毫无疑问使用grafana。 grafana里有一个percona的插件,可以直接生成各种监控图表,且能与mysqld_exporter 和node_exporter无缝对接(rds这里不一样,需要自己画图)。

具体架构: 解决了以上6个问题,那么就有了下面的监控体系架构。 zAJRruV.png!web

三、相关服务模块

1、consul注册服务

点我达目前的ops运维管理平台是比较open的,每个人都可以自己开发服务, 开放http接口,然后就可以接入ops平台了。

因为数据库实例的特殊性,一般都是在新建或者删除的时候,才把注册信息更新, 所以这里,我直接用go开发了一个consul注册的服务, 接入了ops管理平台,同时又有了流程审批控制, 一举两得。 目前注册和注销均在点我达ops运维平台里做, 具体流程如下: EbuARfB.jpg!web

注册完成后,consul上显示的信息如下: YN3Iryz.jpg!web

具体注册接口与注册操作方法,详细请参考本人的开源项目:iushas/consul_register

github地址为: consul_register

2、promehteus里的配置

promehteus里的配置最为关键,因为同时涉及到 mysqld_exporternode_exporter ,所以这里同时把两个配置同时贴出来,供大家参考。

1)mysqld_exporter的配置:

同时支持不接入consul,1对1监控和接入consul,实例id下发,1对多监控。 rQJV73A.jpg!web

2)node_exporter的配置:

jUVBvmM.jpg!web

配置里的tag是第一步consul注册的时候注册进去的数据库属性, 可以为 hz-ali 代表杭州的rds, 可以为 sh-idc 代表上海的自建机房。 所以第一步注册信息很重要,后面不同的prometheus里的region和其他属性的区分,都是通过consul里打的tag来实现的。

3、mysqld_exporter

定制化exporter 支持一对多, 由于consul里没有注册每台rds实例的监控账号,所以要求每台实例的监控账号和密码权限统一。 这里只解释下如何实现以对多的监控。 这里配置很简单,只要在.my.cnf里把账号密码配置进去就可以了, host可以随便写。 bU3IRzM.jpg!web

配置好后, 把服务拉起来, Prometheus里的 这一段配置会把向exporter-address:9104 这个请求地址发送的scrape请求,添加上一个参数, target=__address__, 这个__address__是从consul里读取到的rds的 tcp的地址

ZJJ3quj.jpg!web 比如我的这个地址: IJ3Qzmj.jpg!web

下发的给exporter的请求为: jAVjuuy.png!web

然后exporter拿到这个地址请求后,把需要的实例信息解析出来,通过地址去数据库里拿去监控信息, 这样每次protheus下发新的地址后,exporter会拿新的地址去查询,就实现了一个exporter监控多个数据库的功能。

详细的mysqld_exporter的代码介绍和实现参见本人的开源项目, github地址为: mysqld_exporter

4、node_exporter

node_exporter 跟mysqld_exporter 差不多,也是基于Prometheus官方提供的监控插件来修改,但是这里跟mysqld_exporter 不同的是,

1、阿里云rds机器层面的监控,只能通过阿里云aliyun的监控和属性API进行获取,使用阿里云aliyun的 API,又涉及到角色授权等。

2、对于真实的虚拟机监控,还是只能做1对1的监控,即一个node_exporter 对应一个ecs机器。

3、调用阿里云API的监控,可以实现1对多。

所以这里可以看到第二步Prometheus里的配置一部分还是原来的node配置,一部分是新增加的监控参数配置(带Rds的) 详细介绍参见本人的开源项目, github地址为: node_exporter

5、报警推送

这里不再简述了, 就是在prometheus里设置阈值, 然后推送给Alertmanager, 然后Alertmanager后面还有一套报警推送和收敛的系统,详情请看上面的整体监控架构图。

四、图表展示 这里图表展示分为2部分,一部分是引擎层面的监控图,直接使用的是Grafana里的Percona插件。另一部分机器层面的监控需要自己手动画图。 关于这部分,我不打算详细说明,只给大家贴两张图好了。 nINbiif.jpg!webZrui2mR.jpg!web

五、总结

目前市面上还没有将数据库的监控exporter做成1对多的方案, 我的这次修改首次实现了这个功能,结合Prometheus,减少了运维成本。经过这次改造, 点我达的rds监控和本地自建数据库的监控有了一个完整统一的监控体系, 目前仍在持续接入中。我后面会持续更新迭代,解决和优化数据库性能、监控、高可用等方面的问题,并且输出一些其他的高质量实战工具和文章。同时本文章的几个服务已经开源,也希望能给提供给开发能力没有很突出的dba们,感兴趣的同学可以尝试一下。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK