1.背景数据库监控是数据库配套建设中不可或缺的一部分,可以及时发现机器和数据库性能问题,帮助止损。早期Palfish使用开源的prometheus系统监控数据库和机器来满足我们日常的监控和报警需求,但是在这个过程中,我们还是发现了一些使用不方便的地方,主要有以下几个方面:集群是一个unit,集群成员的变化需要修改prometheus对应的监控配置文件。无法自动修改机器指标和数据库指标集合属于不同的出口商。很难在集群或机器维度同时显示两种类型的指标。告警时间段被抑制,配置不是很灵活。日常检查和监控很难定制。基于以上监控告警需求,结合对prometheus、阿里云数据库监控等一些优秀监控系统架构的研究,设计了Palfish数据库。监控系统。与其他监控系统相比,新系统包括以下核心功能:基于集群维度收集机器和数据库指标,集群成员变化,无需修改配置支持机器指标和数据库性能指标数据同时显示在集群和机器维度通过告警模板,支持告警的差异化配置支持告警时间段抑制,告警策略灵活监控面板灵活定制,方便巡检需求下面介绍各个监控组件的设计以及设计背后的一些思路从数据库监控的整体架构上详述。2.监控总体结构Palfish数据库的总体监控结构如下图所示。各组件功能描述如下:agent模块,功能类似于prometheusexporter组件,暴露metric接口,接收schedule模块采集数据请求,获取监控任务,从db获取具体集群信息根据集群名称配置service服务,然后按照监控任务配置的采集时间间隔,定时到相应的agent拉取metrics监控模块,负责监控数据存储/查询,数据分析和规则告警告警模块,公司内部报警服务,支持钉钉和电话报警http服务器模块,负责监控任务配置,报警模板和报警规则,以及监控数据的查询展示2.1数据采集伴侣鱼的数据库监控目前分为两类:数据库服务监控和主机监控,对应data采集,分为主机指标采集和数据库性能指标采集。种类。具体监控采集哪些指标,我们参考了业界一些优秀的开源监控系统,比如阿里云数据库服务监控,来采集我们的监控指标数据。主机指标,包括CPU利用率、磁盘IO使用率、磁盘空间使用率、磁盘空间使用率、机器负载和内存使用率Mongodb服务指标,包括连接数、读写队列长度、服务进出流量、游标数和requestsVolume和其他Redis服务指标,包括TiDB服务指标,如内存使用率、请求数、服务进出流量、每秒失败的key数、key搜索命中率等。数据通过读取prometheus获取TiDB自带的,获取的指标包括raft-Storecpu、processorcpu和duration等。我们针对具体的指标数据采集设计了四种agent。其中,NodeAgent负责收集机器索引数据,因为有些机器索引收集需要在本地执行系统命令,所以在机器初始化的时候就部署了NodeAgent。数据库服务代理部署在公司内部k8s容器,多副本,支持动态添加采集指标。比如TiDB指标的集合,如下图所示,如果要增加某个指标的集合,只需要动态添加对应的指标项和查询语句即可。2.2任务调度schedule任务调度模块负责监控任务的调度和执行,如下图所示。程序在启动时加载监控任务,在指定的采集时间间隔通过集群名称从dbconfig服务中获取对应的集群信息(包括ip、端口、集群角色),并调度对应的任务执行数据收藏。每个集群任务采集成功后,会通知监控模块进行告警分析。2.3数据存储监控数据存储我们选择了当前流行的时序数据库InfluxDB,主要基于以下考虑:InfluxDB易于部署,可以独立部署,无需任何外部依赖。它提供了一种类似于SQL的查询语言,界面友好,使用方便,如下图所示,提供了灵活的数据保留策略(RetentionPolicy)来设置数据的保留时间。高性能写入,最新的数据存储在内存中,标签允许对列进行索引,实现快速查询。2.4报警规则灵活,通过监控任务配置数据采集时间间隔。监控数据采集完成后,我们可以实施细粒度的告警策略。如何设计告警规则,我们做了如下考虑:集群告警配置尽量简单集群告警支持差异化配置灵活的告警粒度配置基于以上需求,我们从告警模板、告警指标三个方面设计了告警规则,和报警策略。2.4.1告警模板告警模板由规则名称、角色、索引、阈值和策略五部分组成,如下图所示。通过服务告警模板,我们可以很方便地将告警指标和策略拼接成规则,应用于各个服务集群进行告警。同时,我们可以轻松实现对单个集群告警的差异化配置。告警模板应用于服务集群,如下图所示。模板中的一条规则,简单来说,其实就是告警触发条件。如何执行告警实际上就是将一条规则映射到数据库查询语句中,查询满足条件的数据是否达到告警阈值。例如,下面的规则简单介绍了如何做映射。首先我们看一下监控表中已经采集到的相应指标的监控数据,如下图所示。其次,当集群在收集任务时,我们可以获取具体的集群信息,包括ip、port、role。告警服务根据告警模板中的规则,将具体的规则映射到查询语句中,如下图所示。最后根据集群、主机、角色维度对满足告警规则的服务进行告警,如下图所示。2.4.2告警指标告警指标可以理解为我们需要监控的项目,比如CPU使用率、机器负载和磁盘空间等,如下图所示。数据指标集合项很多,我们可以选择自己关心的或者可以快速响应服务问题的指标作为告警指标。这里的指标名称与告警模板中的规则名称一一对应,即规则名称与数据库表和查询??条件的映射。2.4.3告警策略目前有两种告警策略,如下图所示。每次采集到数据,都会通知监控模块触发规则分析,检查是否达到报警阈值。每次触发报警时,都会检查上次报警时间,确保在报警时间间隔内不会重复报警。2分钟内,8次中有4次(每分钟采集4次数据)满足条件,钉钉2分钟内报警,8次中有4次(每分钟采集4次数据)满足条件,钉钉和电话通话同时报警,配置如下图2.5监控数据展示数据监控不仅可以为我们提供准实时的状态展示,还可以帮助故障回溯、风险预测、行情监测。对于日常的问题处理和故障恢复,我们希望既可以在一个页面上查看集群中每个角色的机器指标,也可以在一个页面上查看每个角色的数据库性能指标,而不必在每个指标页面上来回跳转,如图在下图中。同时,我们可以使用收集到的监控数据来自定义我们的数据库监控仪表盘。通过监控板,我们可以进行日常巡检,及时发现性能风险,如下图所示。比如我们通过对tidb大盘的排查,发现集群延迟增加,及时解决,降低风险,如下图。3.小结Palfish数据库监控系统已经运行了将近半年。帮助我们发现了多个数据库性能问题并及时解决。目前监控系统在告警收敛、时序数据库的高可用等方面还有一些需要改进的地方。未来,我们将继续挖掘监控系统的潜力,为Palfish数据库保驾护航。
