Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Greenplum集群监控小试

Greenplum集群监控小试

作者头像
jeanron100
发布于 2020-06-06 15:36:36
发布于 2020-06-06 15:36:36
77400
代码可运行
举报
运行总次数:0
代码可运行

对于PostgreSQL的监控,行业里多多少少还是有不少的开源方案可用的,基本上拿过来修修补补就能跑起来。但是对于Greenplum集群的监控方案比较少,有的同学会说GPCC也可以啊,我有以下的几点考虑。

1)GPCC的监控还是缺少一些系统层的监控细节,比如缺少每个数据segment节点网卡的流量,比如每个数据segment节点的IO负载历史,监控历史的区间范围过大等,同时一般的监控我们可能会跑偏方向,更多是在Master上面监控,但是显然这样是缺少一些真实信息的。

2)GPCC的功能会有独立的数据档案库gpperfmon,程序交互是一个独立的客户端

3)GPCC偏重于集群管理,还有防火墙变更等系统管理功能

4)对于监控选项不能够灵活扩展

我的核心需求是关于Greenplum的监控,在监控方面可以实现扩展,所以也算是做了一个尝试。

这个过程也碰到几个问题。

1)数据字典的选取,PG和GP的大部分数据字典是兼容的,但是GP体系有自己独有的数据字典,比如重要的gp_segment_configuration,整体的信息主要是通过专有的数据字典完成的

2)关于psycopg2版本的兼容性,驱动psycopg2的版本对于Python的版本比较敏感,导致会有一些比较尴尬的情况,比如GP自带的Python驱动是3.6.9,而操作系统层默认的是3.6.3左右,结果不同的用户调用就会有完全不同的结果。补充操作是对.bash_profile刻意做区分,做不同的配置选项。

3)监控脚本的补充和完善,目前这块的脚本是比较少的,所以也就自己在PG的基础上开始做一些改动。

整个改造的过程整体还是比较顺利的,能够基本实现集群信息概览,系统资源概览。

对数据segment节点的系统资源使用取平均值,去除毛刺,这样能够看到一个整体的使用情况。

对网卡流量进行聚合,可以看到整个集群的吞吐量情况。

关于监控的脚本,是在TCollector中PostgreSQL的脚本基础上改进的。对于单机多实例,同事也帮忙在统一接入的地方做了整合,在一个独立的配置文件中,使用的是一个JSON配置,

{"ip":"xxxxx","port":5432,"idc":"xxxx","service":"xxxxx"}

监控脚本内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import sys
import os
import time
import socket
import errno
try:
    import psycopg2
except ImportError:
    psycopg2 = None  # handled in main()
COLLECTION_INTERVAL = 15  # seconds
CONNECT_TIMEOUT = 2  # seconds
SCAN_INTERVAL = 300
from collectors.lib import utils
from collectors.etc import greenplumconf
# Directories under which to search socket files
SEARCH_DIRS = frozenset([
    "/var/run/postgresql",  # Debian default
    "/var/pgsql_socket",  # MacOS default
    "/usr/local/var/postgres",  # custom compilation
    "/tmp",  # custom compilation
])
def now():
    return int(time.time())
def find_sockdir():
    """Returns a path to PostgreSQL socket file to monitor."""
    for dir in SEARCH_DIRS:
        for dirpath, dirnames, dirfiles in os.walk(dir, followlinks=True):
            for name in dirfiles:
                # ensure selection of PostgreSQL socket only
                if (utils.is_sockfile(os.path.join(dirpath, name))
                        and "PGSQL" in name):
                    return (dirpath)
def postgres_connect(host, port):
    """Connects to the PostgreSQL server using the specified socket file."""
    user, password = greenplumconf.get_user_password()
    try:
        return psycopg2.connect("host='%s' port='%s' user='%s' password='%s' "
                                "connect_timeout='%s' dbname=postgres"
                                % (host, port, user, password,
                                   CONNECT_TIMEOUT))
    except (EnvironmentError, EOFError, RuntimeError), e:
        utils.err("Couldn't connect to DB :%s" % (e))
def collect(db, tags_str):
    """
    Collects and prints stats.
    Here we collect only general info, for full list of data for collection
    see http://www.postgresql.org/docs/9.2/static/monitoring-stats.html
    """
    try:
        cursor = db.cursor()
        # general statics
        cursor.execute("SELECT pg_stat_database.*"
                       " FROM pg_database JOIN"
                       " pg_stat_database ON pg_database.datname ="
                       " pg_stat_database.datname WHERE pg_stat_database.datname"
                       " NOT IN ('template0', 'template1', 'postgres')")
        ts = time.time()
        stats = cursor.fetchall()
        #  datid |  datname   | numbackends | xact_commit | xact_rollback | blks_read  |  blks_hit   | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted | conflicts | temp_files |  temp_bytes  | deadlocks | blk_read_time | blk_write_time |          stats_reset          |     size
        result = {}
        for stat in stats:
            database = stat[1]
            result[database] = stat
        for database in result:
            for i in range(2, len(cursor.description)):
                metric = cursor.description[i][0]
                value = result[database][i]
                try:
                    if metric in ("stats_reset"):
                        continue
                    print ("greenplum.%s %i %s database=%s %s"
                           % (metric, ts, value, database, tags_str))
                except:
                    utils.err("got here")
                    continue
        # DB connections
        cursor.execute("SELECT datname, count(datname) FROM pg_stat_activity"
                       " GROUP BY datname")
        ts = time.time()
        dbconnections = cursor.fetchall()
        for database, connection in dbconnections:
            print ("greenplum.dbconnections %i %s database=%s %s"
                   % (ts, connection, database, tags_str))
        # DB segment status
        cursor.execute("select role,count(*) from gp_segment_configuration "
                       "  group by role")
        ts = time.time()
        segment_roles = cursor.fetchall()
        for segment_role, role_no in segment_roles:
            print ("greenplum.segment_roles %i %s segment_role=%s %s"
                   % (ts, role_no, segment_role, tags_str))
        cursor.execute("select status,count(*) from gp_segment_configuration "
                       "  group by status")
        ts = time.time()
        segments_status = cursor.fetchall()
        for segment_status, status_no in segments_status:
            print ("greenplum.segment_status %i %s segment_role=%s %s"
                   % (ts, status_no, segment_status, tags_str))
        cursor.execute("select count(*) from gp_segment_configuration where status='d' ")
        ts = time.time()
        dead_segments_no = cursor.fetchone()
        for dead_segemnt_no in dead_segments_no:
            print ("greenplum.dead_segement_no %i %s %s"
                   % (ts, dead_segemnt_no, tags_str))
    except (EnvironmentError, EOFError, RuntimeError,), e:
        if isinstance(e, IOError) and e[0] == errno.EPIPE:
            # exit on a broken pipe. There is no point in continuing
            # because no one will read our stdout anyway.
            return 2
        utils.err("error: failed to collect data: %s" % e)
def scan_for_instances():
    try:
        f = open("/etc/tcollector/greenplum_tags.conf")
    except IOError, e:
        tils.err("error: can't open /etc/tcollector/tags.conf : %s" % e)
        return None
    f.seek(0)
    out = {}
    for each_data in f:
        tags = eval(each_data)
        port = tags["port"]
        # tags_str = "endpoint=%s port=%s idc=%s service=%s cluster_type=%s db_soft=%s db_engins=%s" % (tags["ip"], tags["port"], tags["idc"], tags["service"], tags["cluster_type"], tags["db_soft"], tags["db_engine"])
        tags_str = "endpoint=%s port=%s idc=%s service=%s" % (tags["ip"], tags["port"], tags["idc"], tags["service"])
        out[port] = {}
        out[port]["tags_map"] = tags
        out[port]["tags_str"] = tags_str
    return out
def main(args):
    """Collects and dumps stats from a PostgreSQL server."""
    if psycopg2 is None:
        utils.err("error: Python module 'psycopg2' is missing")
        return 13  # Ask tcollector to not respawn us
    # sockdir = find_sockdir()
    # if not sockdir: # Nothing to monitor
    #  utils.err("error: Can't find postgresql socket file")
    #  return 13 # Ask tcollector to not respawn us
    last_scan = now()
    instances = scan_for_instances()
    if not len(instances):
        return 13
    while True:
        ts = now()
        if ts - last_scan >= SCAN_INTERVAL:
            instances = scan_for_instances()
            last_scan = ts
        for port in instances:
            tags_str = instances[port]["tags_str"]
            tags_map = instances[port]["tags_map"]
            db = postgres_connect(tags_map["ip"], tags_map["port"])
            collect(db, tags_str)
        sys.stdout.flush()
        time.sleep(COLLECTION_INTERVAL)
if __name__ == "__main__":
    sys.stdin.close()
    sys.exit(main(sys.argv))

剩下的就是不断的调试和修正,直到看起来还像回事。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在Docker中快速体验GreenPlum 7.0.0和gpcc 7.0.0
GreenPlum 7.0.0正式版已于2023.09.29发布,基于PG 12.12内核版本。
AiDBA宝典
2023/11/16
1K0
在Docker中快速体验GreenPlum 7.0.0和gpcc 7.0.0
GreenPlum官方监控工具之GPCC 6.8.3安装配置
GPCC 监控系统性能指标,分析集群健康状况,并使数据库管理员能够在 Greenplum Database 环境中执行管理任务。它提供了一个本地浏览器的 HTML5 图形控制台,用于查看 Greenplum Database 系统指标和执行某些数据库管理任务。
AiDBA宝典
2023/04/27
9510
GreenPlum官方监控工具之GPCC 6.8.3安装配置
在Docker中快速体验GreenPlum 7.0.0
地址:https://hub.docker.com/r/lhrbest/greenplum/tags
AiDBA宝典
2023/08/10
1.4K0
在Docker中快速体验GreenPlum 7.0.0
Greenplum 实时数据仓库实践(9)——Greenplum监控与运维
想要一个数据库长久健康的运行,离不开完备的运维工作,切忌只运而不维。针对Greenplum分布式数据库,集群由大量服务器组成,对运维人员或DBA,不仅要关注数据库本身,还要注意集群中各硬件的状况,及时发现并处理问题。本篇介绍权限与角色管理、数据导入导出、性能优化、例行监控、例行维护、推荐的监控与维护任务六方面常规工作内容,目标是满足Greenplum系统维护、使用等方面的要求,保证提供稳定高效的数据库服务。
用户1148526
2022/04/13
4.2K0
Greenplum 监控与运维
(1)查看master与segment的状态与配置 # 概要信息 gpstate # 配置详细信息 gpstate -s
用户1148526
2021/12/07
3.8K0
Greenplum 7 新特性整理
参考:https://www.xmmup.com/zaidockerzhongkuaisutiyangreenplum-7-0-0.html
AiDBA宝典
2023/10/16
1.5K0
Greenplum 7 新特性整理
Greenplum集群问题修复案例
我看了下GP Master端,看到负载并不高,当然这是一个初步的检测,如果集群响应缓慢,则很可能是segment节点上出现了延迟。一看则吓一跳,这是一个segment节点的load负载。
jeanron100
2018/08/22
9020
Greenplum集群问题修复案例
Prometheus+Grafana PG监控部署以及自定义监控指标
Prometheus:是从云原生计算基金会(CNCF)毕业的项目。Prometheus是Google监控系统BorgMon类似实现的开源版,整套系统由监控服务、告警服务、时序数据库等几个部分,及周边生态的各种指标收集器(Exporter)组成,是在当下主流的监控告警系统。
数据和云
2021/08/27
4.5K0
Prometheus+Grafana PG监控部署以及自定义监控指标
GreenPlum 7.1.0新特性介绍
GreenPlum 7.0.0于2023-09-28发布,大约半年后,GreenPlum 7.1.0于2024-02-09发布。
AiDBA宝典
2024/02/26
1.1K1
GreenPlum 7.1.0新特性介绍
Greenplum集群主机名问题及修复
昨天写了一篇Greenplum数据仓库迁移小记,看起来一起都在计划中,一切都在掌握中,今天早上的时候,统计组的同学反馈说写入GP的时候报了下面的错误。
jeanron100
2018/07/26
1.2K0
Greenplum备份安全与高可用
3.3.2 Back up an AO table if one of the following operations is performed
小徐
2020/09/10
9240
Greenplum备份安全与高可用
greenplum常用的pg_catalog监控语句
目录 1、Greenplum  基本查询信息 1.1、Greenplum 常用查询 1.2、Greenplum 触发器,锁,类型等相关信息 1.3、Greenplum 故障检测相关的信息 1.4、Greenplum 分布式事务有关信息 1.5、 Greenplum  segment 有关信息 1.6、Greenplum 数据文件状态有关信息 1.7、Greenplum 有关储存的信息 2、Greenplum 插件相关信息 3、Greenplum 分区表的相关信息 4、Greenplum 资源队
小徐
2019/09/18
3.2K0
greenplum常用的pg_catalog监控语句
GreenPlum为master和segment添加镜像
在已经安装的 Greenplum DB ,给 master 节点添加 standby master 节点 。
AiDBA宝典
2023/11/18
6310
GreenPlum为master和segment添加镜像
Greenplum数据库巡检报告
4.2.4 查看所有segment是否可达,确保QD(query dispatching)正常 16
小徐
2020/04/20
2.8K0
Greenplum数据库巡检报告
Snova架构篇(二):Greenplum核心组件
当PostgreSQL的后台进程Postgres接收到查询语句后,首先将其传递给查询分析模块,进行词法、语法和语义分析。若是功能性命令(例如建表、创建用户、备份等)则将其分配到功能性命令处理模块;对于查询命(SELECT/INSERT/DELETE/UPDATE)则要为其构建查询树(Query结构体),然后交给查询重写模块。
snova-最佳实践
2019/12/23
1.5K0
Snova架构篇(二):Greenplum核心组件
故障分析 | Greenplum Segment 故障处理
我们知道Greenplum集群由Master Severs和Segment Severs组成。其中故障存在三种类别:Master故障、Segment故障、数据异常。之前我们已经聊过“Master故障”和“数据异常”的处理方式,今天将介绍Segment故障的处理方式。
爱可生开源社区
2023/02/02
2.2K0
Greenplum集群扩容总结
5.1.4 文件修改/etc/security/limits.d/90-nproc.conf(针对RedHat6.x系统) 6
小徐
2020/10/09
2.8K1
Greenplum集群扩容总结
GreenPlum数据分布机制
GreenPlum是Coodinator/Segment架构,集群通常由一个Coodinator节点和一个standby coodinator节点以及多个segment节点组成,其中数据放置在segment节点上。Coodinator是整个数据库的入口,客户端只会连接到Coodinator上并执行相关查询操作,Standby节点为Coordinator提供高可用支持,Mirror为primary的备。
yzsDBA
2022/09/06
6200
GreenPlum数据分布机制
Greenplum备份安全与高可用
3.3.2 Back up an AO table if one of the following operations is performed 11
小徐
2020/09/03
1.2K0
Greenplum备份安全与高可用
GreenPlum数据库日常维护
要保持一个Greenplum数据库系统高效运行,必须对数据库定期清理过期数据并且更新表统计信息, 这样查询优化器才能有准确的信息。
AiDBA宝典
2023/01/11
2.8K0
相关推荐
在Docker中快速体验GreenPlum 7.0.0和gpcc 7.0.0
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验