原文地址
PostgreSQL , Greenplum , Recommended Monitoring and Maintenance Tasks , 监控 , 维护
Greenplum的日常监控点、评判标准,日常维护任务。
由于一台主机可能跑多个实例,建议分层展示。
另外,即使是ON ECS虚拟机(一个虚拟机一个实例一对一的形态)的产品形态,实际上也建议分层展示,以示通用性。
1、全局
2、以集群分组
1、饼图(正常、警告、严重错误、不可用,占比,数量)
2、热力图(每台主机一个点,颜色描绘正常、警告、严重错误、不可用)
3、列表(正常、警告、严重错误、不可用倒排,TOP 主机)
1、全局
2、以集群分组
1、饼图(正常、警告、严重错误、不可用,占比,数量)
2、热力图(每实例一个点,颜色描绘正常、警告、严重错误、不可用)
3、列表(正常、警告、严重错误、不可用倒排,TOP 实例)
全局、分组 -> 主机、实例 -> 主机、数据库实例明细监控指标
全局、分组 -> 主机 -> 实例 -> 数据库实例明细监控指标
监控集群的健康状态。
连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE status <> 'u';
有返回,表示该segment已经down了。
warning。
如果有mirror节点,不影响使用。
重要。
5-10分钟。
1、检查DOWN segment主机是否正常。
2、检查DOWN segment的primary, mirror节点的pg_log日志。找出原因。
3、如果没有异常,使用gprecoverseg把DOWN的节点拉起来。
连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE mode = 'c';
如果有记录返回,表示有处于change tracking的segment。
warning。
重要
5-10分钟。
1、检查DOWN segment主机是否正常。
2、检查DOWN segment的primary, mirror节点的pg_log日志。找出原因。
3、如果没有异常,使用gprecoverseg把DOWN的节点拉起来。
连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE mode = 'r';
需要加入时间条件。判断是否长时间处于r状态。
如果有记录返回,表示有处于re-syncing的segment。
warning。
重要
5-10分钟。
如果节点很长时间处于re-synched状态。检查SEGMENT的primary, mirror节点的pg_log,排查错误。
连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE preferred_role <> role;
如果有记录返回,表示当前集群可能处于not balanced状态。
warning。
重要
5-10分钟。
如果当前集群处于not balanced状态,某个主机的primary节点可能更多,负担较重,影响性能。
建议找到维护窗口,重启数据库集群。
连接到postgres数据库,执行:
SELECT gp_segment_id, count(*)
FROM gp_dist_random('pg_class')
GROUP BY 1;
正常情况下,每个节点返回一条记录,如果执行失败,表示有不可达的segment,执行SQL是QD阶段会失败。
critical。
严重
5-10分钟。
如果查询失败,表示某些segment节点的QD异常,这是一个罕见错误。需要检查异常节点(不能触及的segments)的硬件、网络是否正常。
连接到postgres数据库,执行:
SELECT summary_state
FROM gp_master_mirroring;
返回Not Synchronized时,表示master standby异常。
warning。
重要。
5-10分钟。
检查master, standby的pg_log,是否有错误日志,针对性修复。
如果没有unexpected错误,并且机器正常。那么使用gpinitstandby修复standby。
GPDB 4.2以及以前的版本,需要重启GPDB集群。
连接到postgres数据库,执行:
SELECT procpid, state FROM pg_stat_replication;
如果state不是'STREAMING',或者没有记录返回,那么说明master standby节点异常。
warning。
重要
5-10分钟。
检查master, master standby节点的pg_log是否有异常日志。
如果没有unexpected错误,并且机器正常。那么使用gpinitstandby修复standby。
GPDB 4.2以及以前的版本,需要重启GPDB集群。
连接到postgres数据库,执行:
SELECT count(*) FROM gp_segment_configuration;
QUERY正常返回,表示master节点正常。
critical。
严重
5-10分钟。
如果这个QUERY不能正常执行,说明active master节点可能DOWN了。
重试若干次,如果都异常,关闭active master(一定要确保关闭无误),切换到standby master。
使用命令查询master, segment, standby, mirror状态
1、master和segment状态
gpstate
或
gpstate -s
2、segment mirror状态
gpstate -m
3、primary和mirror mapping状态
gpstate -c
4、master standby状态
gpstate -f
方法1,在安装了gpperfmon组件的情况下
连接到gpperfmon数据库,执行:
SELECT * FROM log_alert_history
WHERE logseverity in ('FATAL', 'ERROR')
AND logtime > (now() - interval '15 minutes');
方法2,查看所有节点(master, standby master, primary, mirror segments)的pg_log。过滤FATAL and ERROR级别的错误日志。
方法3,查看这些系统视图
List of relations
Schema | Name | Type | Owner | Storage
------------+------------------------+------+----------+---------
gp_toolkit | gp_log_command_timings | view | digoal | none -- 统计
gp_toolkit | gp_log_database | view | digoal | none -- 这个包含当前数据库日志
gp_toolkit | gp_log_master_concise | view | digoal | none -- 统计
gp_toolkit | gp_log_system | view | digoal | none -- 这个包含所有日志
(4 rows)
实际上gp_log_system是一个command外部表,列出了所有segment, master的csvlog的内容。
View definition:
SELECT __gp_log_segment_ext.logtime, __gp_log_segment_ext.loguser, __gp_log_segment_ext.logdatabase, __gp_log_segment_ext.logpid, __gp_log_segment_ext.logthread, __gp_log_segment_ext.loghost, __gp_log_segment_ext.logport, __gp_log_segme
nt_ext.logsessiontime, __gp_log_segment_ext.logtransaction, __gp_log_segment_ext.logsession, __gp_log_segment_ext.logcmdcount, __gp_log_segment_ext.logsegment, __gp_log_segment_ext.logslice, __gp_log_segment_ext.logdistxact, __gp_log_seg
ment_ext.loglocalxact, __gp_log_segment_ext.logsubxact, __gp_log_segment_ext.logseverity, __gp_log_segment_ext.logstate, __gp_log_segment_ext.logmessage, __gp_log_segment_ext.logdetail, __gp_log_segment_ext.loghint, __gp_log_segment_ext.
logquery, __gp_log_segment_ext.logquerypos, __gp_log_segment_ext.logcontext, __gp_log_segment_ext.logdebug, __gp_log_segment_ext.logcursorpos, __gp_log_segment_ext.logfunction, __gp_log_segment_ext.logfile, __gp_log_segment_ext.logline,
__gp_log_segment_ext.logstack
FROM ONLY gp_toolkit.__gp_log_segment_ext
UNION ALL
SELECT __gp_log_master_ext.logtime, __gp_log_master_ext.loguser, __gp_log_master_ext.logdatabase, __gp_log_master_ext.logpid, __gp_log_master_ext.logthread, __gp_log_master_ext.loghost, __gp_log_master_ext.logport, __gp_log_master_ext.l
ogsessiontime, __gp_log_master_ext.logtransaction, __gp_log_master_ext.logsession, __gp_log_master_ext.logcmdcount, __gp_log_master_ext.logsegment, __gp_log_master_ext.logslice, __gp_log_master_ext.logdistxact, __gp_log_master_ext.logloc
alxact, __gp_log_master_ext.logsubxact, __gp_log_master_ext.logseverity, __gp_log_master_ext.logstate, __gp_log_master_ext.logmessage, __gp_log_master_ext.logdetail, __gp_log_master_ext.loghint, __gp_log_master_ext.logquery, __gp_log_mas
ter_ext.logquerypos, __gp_log_master_ext.logcontext, __gp_log_master_ext.logdebug, __gp_log_master_ext.logcursorpos, __gp_log_master_ext.logfunction, __gp_log_master_ext.logfile, __gp_log_master_ext.logline, __gp_log_master_ext.logstack
FROM ONLY gp_toolkit.__gp_log_master_ext
ORDER BY 1;
postgres=# \d+ gp_toolkit.__gp_log_segment_ext
External table "gp_toolkit.__gp_log_segment_ext"
Column | Type | Modifiers | Storage | Description
----------------+--------------------------+-----------+----------+-------------
logtime | timestamp with time zone | | plain |
loguser | text | | extended |
logdatabase | text | | extended |
logpid | text | | extended |
logthread | text | | extended |
loghost | text | | extended |
logport | text | | extended |
logsessiontime | timestamp with time zone | | plain |
logtransaction | integer | | plain |
logsession | text | | extended |
logcmdcount | text | | extended |
logsegment | text | | extended |
logslice | text | | extended |
logdistxact | text | | extended |
loglocalxact | text | | extended |
logsubxact | text | | extended |
logseverity | text | | extended |
logstate | text | | extended |
logmessage | text | | extended |
logdetail | text | | extended |
loghint | text | | extended |
logquery | text | | extended |
logquerypos | integer | | plain |
logcontext | text | | extended |
logdebug | text | | extended |
logcursorpos | integer | | plain |
logfunction | text | | extended |
logfile | text | | extended |
logline | integer | | plain |
logstack | text | | extended |
Type: readable
Encoding: UTF8
Format type: csv
Format options: delimiter ',' null '' escape '"' quote '"'
Command: cat $GP_SEG_DATADIR/pg_log/*.csv
Execute on: all segments
postgres=# \d+ gp_toolkit.__gp_log_master_ext
External table "gp_toolkit.__gp_log_master_ext"
Column | Type | Modifiers | Storage | Description
----------------+--------------------------+-----------+----------+-------------
logtime | timestamp with time zone | | plain |
loguser | text | | extended |
logdatabase | text | | extended |
logpid | text | | extended |
logthread | text | | extended |
loghost | text | | extended |
logport | text | | extended |
logsessiontime | timestamp with time zone | | plain |
logtransaction | integer | | plain |
logsession | text | | extended |
logcmdcount | text | | extended |
logsegment | text | | extended |
logslice | text | | extended |
logdistxact | text | | extended |
loglocalxact | text | | extended |
logsubxact | text | | extended |
logseverity | text | | extended |
logstate | text | | extended |
logmessage | text | | extended |
logdetail | text | | extended |
loghint | text | | extended |
logquery | text | | extended |
logquerypos | integer | | plain |
logcontext | text | | extended |
logdebug | text | | extended |
logcursorpos | integer | | plain |
logfunction | text | | extended |
logfile | text | | extended |
logline | integer | | plain |
logstack | text | | extended |
Type: readable
Encoding: UTF8
Format type: csv
Format options: delimiter ',' null '' escape '"' quote '"'
Command: cat $GP_SEG_DATADIR/pg_log/*.csv
Execute on: master segment
字段解释
Field Name | Data Type | Description |
---|---|---|
event_time | timestamp with time zone | Time that the log entry was written to the log |
user_name | varchar(100) | The database user name |
database_name | varchar(100) | The database name |
process_id | varchar(10) | The system process ID (prefixed with "p") |
thread_id | varchar(50) | The thread count (prefixed with "th") |
remote_host | varchar(100) | On the master, the hostname/address of the client machine. On the segment, the hostname/address of the master. |
remote_port | varchar(10) | The segment or master port number |
session_start_time | timestamp with time zone | Time session connection was opened |
transaction_id | int | Top-level transaction ID on the master. This ID is the parent of any subtransactions. |
gp_session_id | text | Session identifier number (prefixed with "con") |
gp_command_count | text | The command number within a session (prefixed with "cmd") |
gp_segment | text | The segment content identifier (prefixed with "seg" for primaries or "mir" for mirrors). The master always has a content ID of -1. |
slice_id | text | The slice ID (portion of the query plan being executed) |
distr_tranx_id | text | Distributed transaction ID |
local_tranx_id | text | Local transaction ID |
sub_tranx_id | text | Subtransaction ID |
event_severity | varchar(10) | Values include: LOG, ERROR, FATAL, PANIC, DEBUG1, DEBUG2 |
sql_state_code | varchar(10) | SQL state code associated with the log message |
event_message | text | Log or error message text |
event_detail | text | Detail message text associated with an error or warning message |
event_hint | text | Hint message text associated with an error or warning message |
internal_query | text | The internally-generated query text |
internal_query_pos | int | The cursor index into the internally-generated query text |
event_context | text | The context in which this message gets generated |
debug_query_string | text | User-supplied query string with full detail for debugging. This string can be modified for internal use. |
error_cursor_pos | int | The cursor index into the query string |
func_name | text | The function in which this message is generated |
file_name | text | The internal code file where the message originated |
file_line | int | The line of the code file where the message originated |
stack_trace | text | Stack trace text associated with this message |
1、排查业务逻辑错误、资源限制错误、数据库内核层面的严重错误。
2、对于业务逻辑错误,建议在QUERY时过滤,避免日志过多。
3、关注资源限制、内核错误。
4、错误代码和解释参考
http://gpdb.docs.pivotal.io/43160/admin_guide/managing/monitor.html
SQL Standard Error Codes
Table 4. SQL Codes
warning。
重要
15分钟。
建立每种严重错误的处理方法。
相关参数
gp_email_smtp_server
gp_email_smtp_userid
gp_email_smtp_password or gp_snmp_monitor_address
gp_snmp_community
gp_snmp_use_inform_or_trap
Set up SNMP or other system check for hardware and OS errors.
监控硬件错误:
检查/var/log/mcelog日志文件的内容,如果有信息,说明该机器出现过硬件错误。
监控dmesg异常,例如Out of memory。
检查/var/log/dmesg日志文件的内容.
判断被检查文件的内容,是否出现过异常。
/var/log/mcelog
/var/log/dmesg
critical
严重
15分钟。
如果有硬件错误或者不可修复的软件错误,建议更换机器。
添加新机器到集群,使用gprecoverseg重建segment,或者使用gpinitstandby修复standby master。
du -sh $dir
或
SELECT * FROM gp_toolkit.gp_disk_free ;
数据盘:建议达到80%时warning,90%时critical。
日志、临时文件盘:建议达到60%时warning,80%时critical。
critical
严重
5-30分钟
扩容、清数据、清WAL或临时文件。
ifconfig
ethx: flags=5187 mtu 1500
inet xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx broadcast xxx.xxx.xxx.xxx
ether xxxxxxxxxxx txqueuelen 0 (Ethernet)
RX packets 611100787 bytes 184118991357 (171.4 GiB)
RX errors 0 dropped 489309 overruns 0 frame 0
TX packets 580090906 bytes 71626153522 (66.7 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
检查droped, errors的数量,如果除以packets比例超过某个阈值,说明丢包或者错误严重。告警。
warning。
重要
小时
Work with network and OS teams to resolve errors.
根据RAID卡厂商、SSD厂商提供的检测工具。
smartclt命令。
如果是btrfs, zfs, lvm, md类管理的存储,这些工具也可以检测软raid的健康状态。
检测是否异常。
注意,某些检测可能会导致IO堵塞(虽然很短暂),但是也许会比较严重。建议和厂商确认监测命令的堵塞性。
根据厂商提供的方法。
critical。
严重
5分钟。
对于RAID存储,替换坏盘。
对于非RAID或R10存储,替换主机。
gpcheck
根据gpcheck的输出进行判断。
critical
严重
安装集群时测试一次即可。
根据gpdb的推荐,设置正确的配置。
gpcheckperf
检查集群的io, 网络的性能,判断是否有性能倾斜。
critical
严重
安装集群时测试一次即可。
建议单机的磁盘读写总带宽、网络带宽匹配。
例如有8块盘,每块盘125MB/s的读写带宽,网卡为10GiB。
磁盘总带宽约1 GB/s,与网卡带宽1.25GB/s匹配。
The cluster may be under-specified if data transfer rates are not similar to the following:
2 GB per second disk read
1 GB per second disk write
10 Gigabit per second network read and write
If transfer rates are lower than expected, consult with your data architect regarding performance expectations.
If the machines on the cluster display an uneven performance profile, work with the system administration team to fix faulty machines.
对每一个数据库执行:
gpcheckcat -O
如果有输出,说明有不一致的catalog。
warning
重要
周
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复catalog异常。
断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R persistent
如果有输出,说明有不一致的持久化表的catalog。
critical
严重
月
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复catalog异常。
断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R pgclass
如果有输出,说明pg_class与pg_attribute不一致。
warning。
重要
月
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复catalog异常。
断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R namespace
如果有输出,说明有类似"内存泄露"的临时schema,或者missing的schema定义。
warning。
重要
月
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复catalog异常。
断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R distribution_policy
如果有输出,说明有随机分布策略的表的约束是否正常。
warning。
重要
月
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复。
断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R dependency
如果有输出,说明有对象依赖不存在对象。
warning。
重要
月
如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss
执行对应的脚本,连接到对应数据库,修复。
连接到每个数据库,执行
SELECT * FROM gp_toolkit.gp_stats_missing;
如果有返回,表示对应的表没有收集统计信息。
warning
重要
天
analyze table;
连接到每个数据库,执行
analyze;
然后执行
SELECT * FROM gp_toolkit.gp_bloat_diag;
以上操作查询的是膨胀比较厉害的表,下面这个查询是膨胀明细
select * from gp_toolkit.gp_bloat_expected_pages ;
详见
《如何检测、清理Greenplum垃圾 - 阿里云HybridDB for PG最佳实践》
如果gp_bloat_diag有返回,表示某些表膨胀很严重。
warning
重要
周或月
在DOWNTIME(维护窗口)执行以下SQL之一,回收空间。
以下SQL会申请排它锁,堵塞增删改查。谨慎选择时间操作。
-- 不重建索引
vacuum full table;
或使用原分布方法redistribute table
-- 会重建索引
alter table set with (reorganize=true) distributed randomly;
或
alter table set with (reorganize=true) distributed by (,....)
为了防止膨胀,应该定期执行VACUUM(VACUUM不申请排他锁),不影响DML和查询。
原文地址