跟我学:基于Prometheus+Grafana的PolarDB-X监控体系
摘要:本文整理阿里云数据库技术专家吴迪,在PolarDB-X动手实践系列的分享。
本篇内容主要分为四个部分:
1. 动手实践系列介绍
2. 环境准备
3. 原理介绍
4. 演示内容
一、动手实践系列介绍
PolarDB-X采用Shared-nothing与存储分离计算架构进行设计,系统由4个核心组件组成。PolarDB-X社区版围绕开源PolarDB-X,对应商业2.0版本。
PolarDB-X社区版主要面向应用开发者、架构师、DBA等。
PolarDB-X是一款基于云架构理念,同时支持在线事务处理与在线分析处理,融合型分布式数据库产品。专注解决海量数据存储、超高并发吞吐、大表瓶颈以及复杂计算效率等数据库瓶颈难题,助力企业加速完成业务数字化转型。
二、环境准备
在搭建环境之前,用户需要确定系统是CentOS 7或8;macOS;Ubuntu在18以上;Windows 10以上。相关配置需要大于等于8C32G。搭建环境需要的软件有:Docker&K8S;PolarDB-X 2.1.0。
PolarDB-X采用Shared-nothing与存储计算分离架构进行设计,系统由4个核心组件组成。主要包括:计算节点、存储节点、元数据服务以及日志节点。
计算节点是系统的入口,采用无状态设计,包括SQL解析器、优化器、执行器等模块。
存储节点负责数据的持久化,基于多数派Paxos协议提供数据高可靠、强一致保障,同时通过MVCC维护分布式事务可见性。
元数据服务负责维护全局强一致的Table/Schema,Statistics等系统Meta信息,维护账号、权限等安全信息,同时提供全局授时服务(即TSO)。
日志节点提供完全兼容MySQL Binlog格式和协议的增量订阅能力,提供兼容MySQL Replication协议的主从复制能力。
三、原理介绍
如何对PolarDB-X进行运维管理呢?K8S是不二选择。阿里在K8S集群构建了相应的扩展,提供了PolarDB-X Operator。Operator让PolarDB-X在K8S集群,进行相应的创建以及生命周期的管理。
与此同时,Operator提供了弹性伸缩、高可用以及监控审计等运维能力。监控能力便是在K8S之上,基于开源的Prometheus和Kubernetes进行打造。与此同时,Operator的代码也在Github进行开源。
四、演示内容
首先,安装PolarDB-X Monitor。PolarDB-X通过Prometheus和Grafana来监控PolarDB-X集群。PolarDB-X Monitor集成了kube-promethus组件栈,通过安装PolarDB-X Monitor即可一键部署监控所需的资源和组件。大家可以在Github页面上找到详细的监控文档。
首先,准备运行中的K8s集群,安装PolarDB-X Operator 1.2.0及以上的版本。
然后,安装Helm包。创建一个名为polardbx-monitor的命名空间。安装PolarDB-X Monitor CRD。用户也可以通过PolarDB-X的Helm Chart仓库进行安装。
Prometheus和Grafana都采用默认配置,便于快速体验。如果部署在生产集群,用户可以参考定制PolarDB-X Monitor配置。
如果用户在minikube上,安装PolarDB-X Monitor。可能会因为资源不够导致组件无法创建,可以参考配置Prometheus和Grafana规格调整组件的规格
PolarDB-X Monitor安装完成后,会在K8s集群的polardbx-monitor命名空间下,创建prometheus和grafana等组件,以此来监控K8s内的PolarDB-X,通过如下命令检查相关组件是否正常,确认所有的pod都处于Running状态。
完成上述操作后,开启PolarDB-X监控。PolarDB-X集群的监控采集功能,默认是关闭的。用户需要为监控的PolarDB-XCluster创建PolarDB-XMonitor对象,然后进行开启。
其中,spec.clusterName的意思是:需要开启监控的PolarDB-X集群名称;spec.monitorInterval的意思是:监控数据采集频率,一般默认30s;
spec.scrapeTimeout的意思是:监控数据采集的超时时间,一般默认10s。
接下来,开始访问Grafana Dashboard。用户在默认情况下,执行相关命令,将Grafana端口转发到本地。然后,在浏览器中输入:http://localhost:3000,即可访问PolarDB-X Dashboard。其中,默认的用户名和密码都是admin。
在gms里,给出了gms节点的CPU、内存使用情况,网络指标。在cn节点,除了基本的节点资源利用率,还展示了历史资源利用率。所有信息通过表格,展示节点的资源利用率。监控图表展示历史监控曲线。
由于Grafana的配置存储在ConfigMap中,用户在Grafana中修改的密码或者新增的Dashboard不会被持久化,一旦Grafana Pod重建,这部分配置会丢失,所以请注意提前保存。
如果用户的K8s集群,支持LoadBalancer,用户可以为Grafana的Service配置LoadBalancer进行访问。
如果用户的K8s集群内有多个PolarDB-X Cluster,可以通过Grafana页面上面的下拉框切换Namespace和PolarDB-X Cluster。
上图中的QPS指标分成逻辑QPS和物理QPS。逻辑QPS代表,cn节点收到的应用服务器发来的逻辑请求,它产生了所有的QPS。物理QPS将用户应用侧服务器,转换的逻辑SQL进行相应的分布式计算和路由。然后,转换成对应的物理SQL,下发到每个dn产生的QPS。
如果一个业务系统的逻辑QPS和物理QPS基本接近。说明业务场景,偏向点查点写。基本只涉及单分片的查询或写入。这是比较好的表现。
上图是Prometheus的架构图。Prometheus Server主要负责数据采集和存储,提供PromQL查询语言的支持。
Prometheus Server包含了三个组件,Retrieval获取监控数据;TSDB是时间序列数据库,可以简单的理解为一个优化后用来处理时间序列数据的软件,并且数据中的数组是由时间进行索引的。HTTP Server为告警和出图提供查询接口。
其中,TSDB的大部分时间都是顺序写入操作,很少涉及修改数据;TSDB的删除操作都是删除一段时间的数据,而不涉及到删除无规律数据;TSDB的读操作一般都是升序或者降序
左图是所有采集的监控指标,主要有GMS,DN,DN,CDC,Node。每个指标都包含了exporter。除此之外,PolarDB-X监控架构采集CPU、内存等信息。
Prometheus Cluster通过K8S自带的Prometheus Operator进行管理,它能部署和管理k8s的Prometheus的集群。PolarDB-X monitor通知Prometheus需要监控的对象,然后及时采集每个PolarDB-X集群的监控指标。
接下来,演示PolarDB-X监控,服务发现的部分。首先扩容CN,然后检查Prometheus target的状态,最后通过Grafana查看新增的CN监控。
访问Prometheus,在浏览器中输入:http://localhost:9090,即可访问到Prometheus页面。如果K8s集群支持LoadBalancer,可以为Prometheus的Service配置LoadBalancer进行访问。
接下来,简单介绍一下监控指标,然后手动计算QPS。对于Prometheus而言,它的监控指标的格式都是<metric name>{<label name>=<label value>,.….}
上图的监控指标,意思是CN pod收到的所有SQL请求,其总数是一个累计值。
polardbx_stats_request_count是请求总数;polardbx_name是实例名称;polardbx_role是pod角色,主要有cn,dn,cdc,gms;schema是逻辑库名;Pod是pod的名称。
接下来,在Prometheus页面查看监控指标。点击Prometheus,回到查询页面。每个指标都有对应的值,本质上要计算累计值的变化趋势,对应的是QPS情况。
查询pxc-demo实例sysbench库的请求总量,输入:
polardbx_stats_request_count_total{polardbx_name="pxc-demo",schema="sysbench"}
查询pxc-demo实例sysbench库的QPS,输入:
Irate(polardbx_stats_request_count_total{polardbx_name="pxc-demo",schema="sysbench"}[1m])
其中,rate是计算区间向量v在时间窗口内平均增长速率。Irate是通过区间向量中最后两个样本数据来计算区间向量的增长速率,更好的灵敏度。
查询pxc-demo实例的QPS,输入:
sum(irate(polardbx_stats_request_count_total{polardbx_name="pxc-demo"}[1m]))
查询pxc-demo实例每个CN节点的QPS,输入:
sum(irate(polardbx_stats_request_count_total{polardbx_name="pxc-demo"}[1m]))by(pod)