关于GaussDB:教你一招让集群慢节点无处可藏

38次阅读

共计 3844 个字符,预计需要花费 10 分钟才能阅读完成。

摘要: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,                                       -- 虚构集群 id
      check_time bigint,                                                        -- 检测时间
      host_id int,                                                                   -- 主机 id
      host_name varchar(128),                                             -- 主机名
      inst_id varchar(64),                                                      -- 集群调配的实例 id
      inst_name  varchar(128),                                             -- 实例名称
      primary key(virtual_cluster_id, inst_id, check_time)
);

慢实例数据处理

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

insert into
       dms_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 查问慢实例工夫序列以及数量

select
      check_time, count(*) as slow_inst_num
from
      dms_mtc_cluster_slow_inst
where
      virtual_cluster_id =
            (select
                    virtual_cluster_id
             from
                    dms_meta_cluster
             where
                    cluster_id = #{clusterId})
and
      check_time >= #{from}
and
      check_time <= #{to}
group by
      check_time;
    Dms-monitoring 查问慢实例数据详情
select
      t1.check_time, t1.host_name, t1.inst_name, t2.trigger_times
from
             (select
                    check_time, host_name, inst_name
             from
                    dms_mtc_cluster_slow_inst
             where
                    virtual_cluster_id = (
                           select
                                  virtual_cluster_id
                           from
                                  dms_meta_cluster
                           where
                                  cluster_id = #{clusterId})
             and
                    check_time = #{checkTime}) as t1
      inner join
             (select
                    inst_name, count(*) as trigger_times
             from
                    dms_mtc_cluster_slow_inst
             where
                    virtual_cluster_id = (select
                           virtual_cluster_id
                    from
                           dms_meta_cluster
                    where
                           cluster_id = #{clusterId})
             and
                    check_time >= (#{checkTime} - 86400000)
             and
                    check_time <= #{checkTime}
             group by
                    inst_name) as t2
      on
             t1.inst_name = t2.inst_name; 

想理解 GuassDB(DWS) 更多信息,欢送微信搜寻“GaussDB DWS”关注微信公众号,和您分享最新最全的 PB 级数仓黑科技,后盾还可获取泛滥学习材料~

点击关注,第一工夫理解华为云陈腐技术~

正文完
 0