摘要:GaussDB在大规模集群上运行的过程中,随着时间推移,部分节点可能会出现性能严重下降的情况。此时这些节点仍然能对外提供服务,但响应明显变慢,处理同样的请求所需时间较其他正常节点大很多,从而影响了整个集群的性能。这样的节点称为“亚健康节点”,或“慢节点”。

本文分享自华为云社区《GaussDB(DWS)新技术 集群慢节点竟然无处可藏》,原文作者:菜花 。

背景

慢实例简介

GaussDB在大规模集群上运行的过程中,随着时间推移,部分节点可能会出现性能严重下降的情况。此时这些节点仍然能对外提供服务,但响应明显变慢,处理同样的请求所需时间较其他正常节点大很多,从而影响了整个集群的性能。这样的节点称为“亚健康节点”,或“慢节点”。

大规模集群中亚健康节点的准确识别本身是一个难题。经过深入观察和分析,我们发现节点响应慢还可能是业务倾斜导致的,例如对某些数据的集中访问,或是某些业务需要较多的运算,导致某些节点的工作量剧增。此外,这样的节点不属于性能低下的慢节点。如果单纯通过响应时间判断慢节点容易导致误判,而频繁的误报警则会降低用户的体验,增加工程人员的排查负担。本特性实现需要在充分考虑业务倾斜等因素的前提下,迅速、准确地识别出慢节点。

慢实例的获取机制

Gauss DB中的等待状态视图pg_thread_wait_status可以显示每个实例上各线程的瞬时状态。通过深入分析其监控原理,结合现网的时间,我们发现通过该视图有效地发现响应慢的节点。平均低来讲,节点响应越慢,上面的等待事件就越多,二者存在正相关,因此可以通过查询该视图中各节点的等待事件数量来衡量节点响应的快慢。根据现网的经验,如果等待状态视图中等待的DN大多数是同一个节点上的DN,则这个节点大概率是慢节点。

以图1所示的工行集群上的等待状态视图查询结果为例,890这个节点上的事件等待数量在连续多次查询中均为全网之冠,且占全网等待数量的比例在50%以上。最终硬件检测表明890节点确实存在硬件故障,导致运行缓慢。

GaussDB的数据节点(Datanode)采用主备模式。如果一个物理机器上的Datanode全是备机,该物理机器并不会直接对外提供服务,也无法通过pg_thread_wait_status视图查询等待事件的数量。但是主DN需要向备DN同步日志。如果这样的“全备机”物理机器恰好是一个慢节点,由于同步日志缓慢,会影响主DN的性能。虽然主机上的pg_thread_wait_status视图等待数量会有所增加,但因为该物理机器对应的主DN被分散到多个物理节点上,单个物理节点上等待数量可能并不能达到阈值。针对这种情况,还需要对等待视图中主DN对应的备DN做进一步计算,间接得到“全备机”物理机器的等待数量。

图1.1 通过等待视图识别慢节点

由于主备切换,数据倾斜等原因,集群中各节点的负载并不均衡,负载高可能也会造成节点响应缓慢。为了避免误报,需要消除负载倾斜对于亚健康节点识别的干扰。为了简化判断,我们进一步假定负载倾斜和故障不会同时出现在同一节点上。也就是说,如果一个节点的负载水平较高,响应慢被认为是正常的,不会被当成慢节点而告警。

节点的负载水平可以通过数据的访问量和运算量来衡量,而后者可以通过IO的数量、消耗CPU时间以及网络数据流量来进行量化计算。GaussDB内部对IO的数量(block数)、CPU时间和网络数据流量进行了打点统计,并通过多种视图呈现出来。通过定期访问这些视图,可以获得节点在单位时间内的工作量,进而获得每个节点在各个时段的负载水平。

与等待事件的数量一样,“全备机”的物理机器的负载水平,也需要通过其对应的主DN的负载水平间接推算。由于备机很少参与运算,主要工作是接收日志,因此主要通过主DN的IO数量和网络流量来衡量备机的繁忙程度。并且由于间接推算的准确性相对较差,只有“全备机”节点才会采用这种方式。只要某台物理机器上有主DN的存在,就直接采用主DN的数据。

对慢实例进行监控

场景分析

根据客户需求分析,可以将客户需求定义为集群中慢节点发生次数与频率的时间序列及详情展示。包含以下主要功能:

  1. 开启关闭慢实例检测功能
  2. 配置慢实例检测参数
  3. 采集慢实例信息上报DMS数据库
  4. 将慢实例触发次数及慢实例名称等信息以时间序列展示在页面上

方案整体架构设计

图 2.1 慢实例监控整体架构图

整体方案属于慢实例检测端到端的新增项,并调用健康检查相关模块进行慢实例数据生产。

① dms-agent调用健康检查脚本并传入collection下发的配置参数,主要操作包括初始启动调用,以及进程中断重启调用;

② 健康检查脚本采集慢节点数据到用户数据库中

③ dms-agent通过查库获取相关数据

④ dms-agent根据dms-collection下发的上报频率进行数据上报

⑤ dms-collection接收dms-agent上报的数据进行dms数据库入库等。

⑥ dms-monitoring查询dms数据库获取慢节点数据展示到dws-console前端页面

⑦ dws-console通过dms-monitoring下发启停配置到dms-agent,并通过dms-monitoring将启停信息持久化到dms数据库中; dws-console通过dms-monitor持久化监控参数配置到dms数据库中。

⑧ dms-monitoring将修改后的配置通过grpc下发到dms-agent,dms-agent按照新的上报频率以及配置进行数据采集上报

⑨ dms-agent在配置更新后,按照新配置进行健康检查脚本的重启操作。

慢实例数据详解及数据处理

慢实例表结构设计

drop table if exists dms_mtc_cluster_slow_inst cascade;create table dms_mtc_cluster_slow_inst(ctime bigint not null,                                                   -- 采集时间virtual_cluster_id int not null,                                       -- 虚拟集群idcheck_time bigint,                                                        -- 检测时间host_id int,                                                                   -- 主机idhost_name varchar(128),                                             -- 主机名inst_id varchar(64),                                                      -- 集群分配的实例idinst_name  varchar(128),                                             -- 实例名称primary key(virtual_cluster_id, inst_id, check_time)
);

慢实例数据处理

数据入库Dms-collection接收agent上报的数据进行入库

insert intodms_mtc_cluster_slow_inst (ctime, virtual_cluster_id, check_time, host_id,host_name, host_id, inst_name)
values(#{sinst.ctime}, #{ sinst.virtual_cluster_id}, #{sinst.check_time},#{sinst.host_id}, #{sinst.host_name}, #{sinst.inst_id}, #{sinst.inst_name});

数据查询

Dms-monitoring查询慢实例时间序列以及数量

selectcheck_time, count(*) as slow_inst_num
fromdms_mtc_cluster_slow_inst
wherevirtual_cluster_id =(selectvirtual_cluster_idfromdms_meta_clusterwherecluster_id = #{clusterId})
andcheck_time >= #{from}
andcheck_time <= #{to}
group bycheck_time;Dms-monitoring查询慢实例数据详情
selectt1.check_time, t1.host_name, t1.inst_name, t2.trigger_times
from(selectcheck_time, host_name, inst_namefromdms_mtc_cluster_slow_instwherevirtual_cluster_id = (selectvirtual_cluster_idfromdms_meta_clusterwherecluster_id = #{clusterId})andcheck_time = #{checkTime}) as t1inner join(selectinst_name, count(*) as trigger_timesfromdms_mtc_cluster_slow_instwherevirtual_cluster_id = (selectvirtual_cluster_idfromdms_meta_clusterwherecluster_id = #{clusterId})andcheck_time >= (#{checkTime} - 86400000)andcheck_time <= #{checkTime}group byinst_name) as t2ont1.inst_name = t2.inst_name; 

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~

点击关注,第一时间了解华为云新鲜技术~

教你一招:让集群慢节点无处可藏相关推荐

  1. 手把手教你搭建MinIO分布式集群

    手把手教你搭建MinIO分布式集群 要求: MinIO集群规格:2节点2个磁盘. Minio域名:test_minio.com 数据目录:/opt/minio/data1,/opt/minio/dat ...

  2. mfc 制作不同的文档模板mdi不同的子窗体_制作ACK集群自定义节点镜像的正确姿势...

    随着云原生时代的到来,用户应用.业务上云的需求也越来越多,不同的业务场景对容器平台的需求也不尽相同,其中一个非常重要的需求就是使用自定义镜像创建ACK集群. ACK支持用户使用自定义镜像创建Kuber ...

  3. ES集群新增节点无法加入集群 timed out while waiting for initial discovery state - timeout: 30s

    ES : 7.5.0 ES集群新增节点无法加入集群 timed out while waiting for initial discovery state - timeout: 30s   ES集群需 ...

  4. Tomcat集群---Cluster节点配置(转)

    <!-- Cluster(集群,族) 节点,如果你要配置tomcat集群,则需要使用此节点.className 表示tomcat集群时,之间相互传递信息使用那个类来实现信息之间的传递.chann ...

  5. 使用Kubeadm创建k8s集群之节点部署(三十二)

    前言 由于上次忘开申明原创,特再发一次. 本篇部署教程将讲述k8s集群的节点(master和工作节点)部署,请先按照上一篇教程完成节点的准备.本篇教程中的操作全部使用脚本完成,并且对于某些情况(比如镜 ...

  6. redis集群添加节点报错Either the node already knows other nodes (check with CLUSTER NODES) or contains some k

    [README] redis集群添加节点报错 [ERR] Node 192.168.163.202:6380 is not empty. Either the node already knows o ...

  7. Redis集群添加节点

    Redis集群添加节点 1:首先把需要添加的节点启动 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf  /usr/ ...

  8. 容器编排技术 -- Kubernetes 重新配置活动集群中节点的 Kubelet

    容器编排技术 -- Kubernetes 重新配置活动集群中节点的 Kubelet 1 Before you begin 2 重新配置集群活动节点上的 Kubelet 2.1 基本工作流程概览 2.2 ...

  9. elastic集群单节点停机维护

    为了elastic时时提供服务,需要elastic至少状态维持在yellow状态.所有,维护时需要依次对elastic单个节点进行维护. 操作步骤如下: 1.停止elastic的自动分配功能 curl ...

最新文章

  1. delphi socket 怎样把接收到的二进制数据转换成字符串显示_广东qp用户数据免费咨询...
  2. 聊聊HystrixEventNotifier
  3. 华为网络设备上的常用安全技术(一)
  4. Minor GC和Full GC触发条件
  5. table中加表单元素怎么验证_045、DOM编程实例和表单
  6. tensorflow里面函数记录
  7. 三条中线分的六个三角形_数学中三角形的“五心”你会了吗?教你马上学会。(中考生必看)...
  8. python dataframe 取每行的最大值_在pandas DataFrame中查找列的值最大的行
  9. 判断IP是否为搜索引擎蜘蛛或爬虫
  10. 使用tushare数据进行backtrader回测
  11. 安装EUCALYPTUS
  12. 如何有效破解PDF文件的密码?
  13. 带你玩转软件项目测试管理——项目研发管理模式(一)
  14. java指令打印 驱动打印总结 打印不需要手动选择打印机 愿你编码半生 都不会用到
  15. 30 行代码实现,支付宝蚂蚁森林自动收能量!
  16. 蓝桥杯练习题之 Fibonacci数列
  17. 建立网站费用大概需要多少钱?如何计算建立网站的成本?
  18. 《推荐系统实战》读书笔记(三)
  19. 微信小程序网址请求封装
  20. android 家长控制app下载,任天堂家长控制app下载-任天堂家长控制 安卓版v1.0.2-PC6安卓网...

热门文章

  1. html(+css)/01/html语言基础,标记,标记语法,html文档结构
  2. jggrid 设置了自适应宽度仍然有滚动条的问题
  3. 实践 | Centos 7搭建LVS+Keepalived高可用Web服务群集群
  4. mysql repos_mysql yum源安装
  5. python原理及代码_lightgbm原理以及Python代码
  6. UnixLinux大学教程目录
  7. webpack自定义打包命令
  8. angularjs学习大纲
  9. 关于tomcat5.5或6.0免安装版,点击startup.bat启动自动消失问题
  10. 如何用SQL生成SQL批处理文件?