您的位置:首页 > 数据库 > SQL

PostgreSQL、Greenplum 日常监控 和 维护任务

2017-09-18 14:23 429 查看
原文地址


标签

PostgreSQL , Greenplum , Recommended Monitoring and Maintenance Tasks , 监控 , 维护


背景

Greenplum的日常监控点、评判标准,日常维护任务。


展示图层

由于一台主机可能跑多个实例,建议分层展示。

另外,即使是ON ECS虚拟机(一个虚拟机一个实例一对一的形态)的产品形态,实际上也建议分层展示,以示通用性。


主机级图层

1、全局

2、以集群分组


展示图形

1、饼图(正常、警告、严重错误、不可用,占比,数量)

2、热力图(每台主机一个点,颜色描绘正常、警告、严重错误、不可用)

3、列表(正常、警告、严重错误、不可用倒排,TOP 主机)


实例级图层

1、全局

2、以集群分组


展示图形

1、饼图(正常、警告、严重错误、不可用,占比,数量)

2、热力图(每实例一个点,颜色描绘正常、警告、严重错误、不可用)

3、列表(正常、警告、严重错误、不可用倒排,TOP 实例)


明细图层

全局、分组 -> 主机、实例 -> 主机、数据库实例明细监控指标

全局、分组 -> 主机 -> 实例 -> 数据库实例明细监控指标


数据库状态监控

监控集群的健康状态。


1、列出当前down的segment节点。


检查方法:

连接到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的节点拉起来。


2、列出当前处于change tracking的segment节点。


检查方法:

连接到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的节点拉起来。


3、列出当前处于re-syncing状态的segment节点。


检查方法:

连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE mode = 'r';


需要加入时间条件。判断是否长时间处于r状态。


判断方法:

如果有记录返回,表示有处于re-syncing的segment。


事件级别:

warning。


重要程度:

重要


监控频率:

5-10分钟。


处理方法:

如果节点很长时间处于re-synched状态。检查SEGMENT的primary, mirror节点的pg_log,排查错误。


4、列出当前角色未处于优先角色的节点的segment节点。


检查方法:

连接到postgres数据库,执行:
SELECT * FROM gp_segment_configuration
WHERE preferred_role <> role;


判断方法:

如果有记录返回,表示当前集群可能处于not balanced状态。


事件级别:

warning。


重要程度:

重要


监控频率:

5-10分钟。


处理方法:

如果当前集群处于not balanced状态,某个主机的primary节点可能更多,负担较重,影响性能。

建议找到维护窗口,重启数据库集群。


5、检测所有节点是否可达,确保QD(query
dispatching)正常。


检查方法:

连接到postgres数据库,执行:
SELECT gp_segment_id, count(*)
FROM gp_dist_random('pg_class')
GROUP BY 1;


判断方法:

正常情况下,每个节点返回一条记录,如果执行失败,表示有不可达的segment,执行SQL是QD阶段会失败。


事件级别:

critical。


重要程度:

严重


监控频率:

5-10分钟。


处理方法:

如果查询失败,表示某些segment节点的QD异常,这是一个罕见错误。需要检查异常节点(不能触及的segments)的硬件、网络是否正常。


6、列出当前异常的master standby节点。


检查方法:

连接到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集群。


7、列出当前down的segment节点。


检查方法:

连接到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集群。


8、检查master节点是否up并正常提供服务。


检查方法:

连接到postgres数据库,执行:
SELECT count(*) FROM gp_segment_configuration;


判断方法:

QUERY正常返回,表示master节点正常。


事件级别:

critical。


重要程度:

严重


监控频率:

5-10分钟。


处理方法:

如果这个QUERY不能正常执行,说明active master节点可能DOWN了。

重试若干次,如果都异常,关闭active master(一定要确保关闭无误),切换到standby master。


列出master, segment, standby,
mirror状态的其他方法

使用命令查询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、列出FATAL and ERROR级别的错误日志。


检查方法:

方法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 NameData TypeDescription
event_timetimestamp with time zoneTime that the log entry was written to the log
user_namevarchar(100)The database user name
database_namevarchar(100)The database name
process_idvarchar(10)The system process ID (prefixed with "p")
thread_idvarchar(50)The thread count (prefixed with "th")
remote_hostvarchar(100)On the master, the hostname/address of the client machine. On the segment, the hostname/address of the master.
remote_portvarchar(10)The segment or master port number
session_start_timetimestamp with time zoneTime session connection was opened
transaction_idintTop-level transaction ID on the master. This ID is the parent of any subtransactions.
gp_session_idtextSession identifier number (prefixed with "con")
gp_command_counttextThe command number within a session (prefixed with "cmd")
gp_segmenttextThe segment content identifier (prefixed with "seg" for primaries or "mir" for mirrors). The master always has a content ID of -1.
slice_idtextThe slice ID (portion of the query plan being executed)
distr_tranx_idtextDistributed transaction ID
local_tranx_idtextLocal transaction ID
sub_tranx_idtextSubtransaction ID
event_severityvarchar(10)Values include: LOG, ERROR, FATAL, PANIC, DEBUG1, DEBUG2
sql_state_codevarchar(10)SQL state code associated with the log message
event_messagetextLog or error message text
event_detailtextDetail message text associated with an error or warning message
event_hinttextHint message text associated with an error or warning message
internal_querytextThe internally-generated query text
internal_query_posintThe cursor index into the internally-generated query text
event_contexttextThe context in which this message gets generated
debug_query_stringtextUser-supplied query string with full detail for debugging. This string can be modified for internal use.
error_cursor_posintThe cursor index into the query string
func_nametextThe function in which this message is generated
file_nametextThe internal code file where the message originated
file_lineintThe line of the code file where the message originated
stack_tracetextStack 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分钟。


处理方法:

建立每种严重错误的处理方法。


2、SNMP设置,事件自动通知设置。

相关参数
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


硬件和操作系统监控


1、检查异常的主机、操作系统。


检查方法:

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。


2、列出磁盘使用率。


检查方法:

du -sh $dir



SELECT * FROM gp_toolkit.gp_disk_free ;


判断方法:

数据盘:建议达到80%时warning,90%时critical。

日志、临时文件盘:建议达到60%时warning,80%时critical。


事件级别:

critical


重要程度:

严重


监控频率:

5-30分钟


处理方法:

扩容、清数据、清WAL或临时文件。


3、网络监测。


检查方法:

ifconfig


判断方法:

ethx: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST>  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.


4、存储硬件错误。


检查方法:

根据RAID卡厂商、SSD厂商提供的检测工具。

smartclt命令。

如果是btrfs, zfs, lvm, md类管理的存储,这些工具也可以检测软raid的健康状态。

检测是否异常。

注意,某些检测可能会导致IO堵塞(虽然很短暂),但是也许会比较严重。建议和厂商确认监测命令的堵塞性。


判断方法:

根据厂商提供的方法。


事件级别:

critical。


重要程度:

严重


监控频率:

5分钟。


处理方法:

对于RAID存储,替换坏盘。

对于非RAID或R10存储,替换主机。


5、列出硬件、操作系统内核的不正确配置。


检查方法:

gpcheck


判断方法:

根据gpcheck的输出进行判断。


事件级别:

critical


重要程度:

严重


监控频率:

安装集群时测试一次即可。


处理方法:

根据gpdb的推荐,设置正确的配置。


6、检测集群的硬件性能极限。


检查方法:

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.


系统表监控


1、检查master, segment的catalog一致性。


检查方法:

对每一个数据库执行:
gpcheckcat -O


判断方法:

如果有输出,说明有不一致的catalog。


事件级别:

warning


重要程度:

重要


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复catalog异常。


2、检查持久化表的catalog一致性。


检查方法:

断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R persistent


判断方法:

如果有输出,说明有不一致的持久化表的catalog。


事件级别:

critical


重要程度:

严重


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复catalog异常。


3、检查pg_class与pg_attribute是否不一致。


检查方法:

断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R pgclass


判断方法:

如果有输出,说明pg_class与pg_attribute不一致。


事件级别:

warning。


重要程度:

重要


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复catalog异常。


4、检查是否有类似"内存泄露"的临时schema,或者missing的schema定义。


检查方法:

断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R namespace


判断方法:

如果有输出,说明有类似"内存泄露"的临时schema,或者missing的schema定义。


事件级别:

warning。


重要程度:

重要


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复catalog异常。


5、检查随机分布策略的表的约束是否正常。


检查方法:

断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R distribution_policy


判断方法:

如果有输出,说明有随机分布策略的表的约束是否正常。


事件级别:

warning。


重要程度:

重要


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复。


6、检查是否有对象依赖不存在对象。


检查方法:

断开所有用户的连接,对每一个数据库执行:
gpcheckcat -R dependency


判断方法:

如果有输出,说明有对象依赖不存在对象。


事件级别:

warning。


重要程度:

重要


监控频率:



处理方法:

如果gpcheckcat产生异常,会将修复脚本写入对应的文件,例如
repair scripts generated in directory gpcheckcat.repair.YYYY-MM-DD.hh.mm.ss


执行对应的脚本,连接到对应数据库,修复。


数据维护任务


1、检查丢失统计信息的表。


检查方法:

连接到每个数据库,执行
SELECT * FROM gp_toolkit.gp_stats_missing;


判断方法:

如果有返回,表示对应的表没有收集统计信息。


事件级别:

warning


重要程度:

重要


监控频率:



处理方法:

analyze table;


2、检查表、索引膨胀、deadtuple比例。


检查方法:

连接到每个数据库,执行
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 <table_name> set with (reorganize=true) distributed randomly;

或

alter table <table_name> set with (reorganize=true) distributed by (<column_names1>,<column_names2>....)


为了防止膨胀,应该定期执行VACUUM(VACUUM不申请排他锁),不影响DML和查询。

原文地址

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: