活动 |
过程 |
改进措施 |
列出当前down的段。如果返回任何行,这应该生成一个警告。 推荐频率:每5到10分钟运行一次。 重要性:重要 |
在‘postgres’数据库中运行下面的查询: SELECT * FROM gp_segment_configuration WHERE status <> 'u'; |
如果查询返回任何行,执行下面的步骤修正问题: 1. 验证down段所在主机有响应。 2. 如果主机OK,为down段检查pg_log文件,寻找段down掉的根本原因。 |
运行一个分布式查询检测它在所有段上运行。每个段应该返回一行。 推荐频率:每5到10分钟运行一次。 重要性:极为重要 |
在‘postgres’数据库中执行下面的查询: SELECT gp_segment_id, count(*) FROM gp_dist_random('pg_class') GROUP BY 1; |
如果查询失败,说明对集群中某些段的任务分发有问题。这是很少见的情况。检查不能被分派任务的主机,确认没有硬件或网络问题。 |
执行一个基本的检查,看主节点是否启动并工作。 推荐频率:每5到10分钟运行一次。 重要性:极为重要 |
在‘postgres’数据库中执行下面的查询: SELECT count(*) FROM gp_segment_configuration; |
如果此查询失败,主节点可能down了。重试几次并手工检查主节点的活动。如果主节点down,重启或在主主节点没有遗留进程时激活从主节点。 |
表1
活动 |
过程 |
改进措施 |
底层平台检查,维护需求或硬件的系统停机。 推荐频率:如果可能,实时,或者每15分钟。 重要性:极为重要 |
设置硬件和OS错误检查。 |
如果需要,从HAWQ集群中移除存在硬件或OS问题的主机,解决后在添加回来。 |
检查HAWQ数据存储和OS的磁盘空间使用情况。 推荐频率:5到30分钟。 重要性:极为重要 |
设置磁盘空间检查。 . 设置阈值,当磁盘达到使用的百分比产生警告。推荐阈值为全部空间的75%。 . 不推荐空间使用接近100%时运行系统。 |
删除数据或文件,释放系统空间。 |
检查网卡错误或删除包 推荐频率:每小时。 重要性:重要 |
设置网卡检查。 |
与网络或系统团队一起解决问题。 |
检查RAID错误或RAID性能衰减。 推荐频率:每5分钟。 重要性:极为重要 |
设置RAID检查。 |
. 尽快替换失败的磁盘。 . 与系统管理团队一起尽快解决其它RAID或控制器问题。 |
检查是否有足够的I/O带宽,或I/O倾斜。 推荐频率:创建集群或怀疑硬件问题时。 |
运行‘hawq checkperf’应用 |
如果数据传输率与以下不相似,集群带宽可能不足。 . 每秒2GB的磁盘读 . 每秒1GB的磁盘写 . 每秒10GB的网络读写 如果传输率慢于期望,考虑期望的性能咨询你的架构顾问。 如果集群的机器显示出参差不齐的剖析,与系统管理团队一起解决机器错误。 |
表2
活动 |
过程 |
改进措施 |
检查缺少统计信息的表。 |
检查每个数据库中的‘hawq_stats_missing’视图: |
在缺少统计信息的表上运行ANALYZE。 |
表3
活动 |
过程 |
改进措施 |
标记HAWQ系统目录中被删除的行(‘pg_catalog’表模式中的表)以重用它们占用的空间。 |
清空每个系统目录: |
定期清空系统目录,避免膨胀。 |
清空所有接近vacuum_freeze_min_age值的系统目录,(‘pg_catalog’模式中的表) |
清空单个系统目录表: |
在到达vacuum_freeze_min_age值后,VACUUM扫描表时,不再用FrozenXID替换事务ID。对这些表到达限制之前上执行vacuum。 |
修改表的统计信息。 |
分析用户表: |
定期分析更新的表,使得查询优化器能够产生高效的执行计划。 |
备份数据库数据。 |
使用PXF |
最佳实践是,当数据库必须还原时,有一个当前数据库的备份。 |
清空系统目录(‘pg_catalog’模式中的表),维护高效目录。 |
VACUUM每个数据库的系统表。 |
优化器从系统表查询信息创建查询计划。如果系统表和索引被允许随着时间膨胀,扫描系统表会增加查询时间。 |
活动 |
过程 |
改进措施 |
保证任何修复的bug和提升被应用到核心。 推荐频率:至少每六个月 重要性:重要 |
按照厂商的指导更新Linux核心。 |
保持当前核心包含修复的bug和安全性问题,避免将来困难的升级。 |
安装HAWQ次要版本 Recommended 推荐频率:每季度 重要性:重要 |
总是升级到最新的系列。 |
保持当前的HAWQ软件包含修复的bug,性能提升,以及HAWQ集群的提升特性。 |
表5
为保持HAWQ系统高效运行,必须执行这些例行系统维护任务。如数据库必须定期清理过期数据,并且更新表的统计,让查询优化器能够获得精确的信息。HAWQ DBA可以使用标准的类UNIX工具,如cron脚本,自动执行这些任务。脚本至少应该能够提供任务是否执行成功和执行时间等信息,比如使用最简单的输出日志方式实现。gpadmin 655225 1 0 Apr24 ? 00:01:52 /usr/local/hawq_2_1_1_0/bin/postgres -D /data/hawq/master -i -M master -p 5432 --silent-mode=true gpadmin 655753 1 0 Apr24 ? 00:04:28 /usr/local/hawq_2_1_1_0/bin/postgres -D /data/hawq/segment -i -M segment -p 40000 --silent-mode=true每个postgres都有自己的服务器日志文件。HAWQ管理应用程序,例如hawq start和gpfdist,也会生成相应的日志文件。后面会讨论这些日志文件的信息和维护策略。
db1=# set role 'gpadmin' ; SET db1=# set search_path to public, hawq_toolkit ; SET db1=#该模式中包含若干可以使用SQL命令访问的视图。
db1=# \dv List of relations Schema | Name | Type | Owner | Storage --------------+------------------------------------------+------+---------+--------- hawq_toolkit | __hawq_fullname | view | gpadmin | none hawq_toolkit | __hawq_is_append_only | view | gpadmin | none hawq_toolkit | __hawq_user_data_tables | view | gpadmin | none hawq_toolkit | __hawq_user_data_tables_readable | view | gpadmin | none hawq_toolkit | __hawq_user_namespaces | view | gpadmin | none hawq_toolkit | __hawq_user_tables | view | gpadmin | none hawq_toolkit | hawq_log_command_timings | view | gpadmin | none hawq_toolkit | hawq_log_master_concise | view | gpadmin | none hawq_toolkit | hawq_size_of_all_table_indexes | view | gpadmin | none hawq_toolkit | hawq_size_of_database | view | gpadmin | none hawq_toolkit | hawq_size_of_index | view | gpadmin | none hawq_toolkit | hawq_size_of_partition_and_indexes_disk | view | gpadmin | none hawq_toolkit | hawq_size_of_schema_disk | view | gpadmin | none hawq_toolkit | hawq_size_of_table_and_indexes_disk | view | gpadmin | none hawq_toolkit | hawq_size_of_table_and_indexes_licensing | view | gpadmin | none hawq_toolkit | hawq_size_of_table_disk | view | gpadmin | none hawq_toolkit | hawq_size_of_table_uncompressed | view | gpadmin | none hawq_toolkit | hawq_stats_missing | view | gpadmin | none hawq_toolkit | hawq_table_indexes | view | gpadmin | none (19 rows)可以使用hawq_toolkit模式中的视图查询系统目录表、日志文件、操作环境,以及获取系统状态信息。hawq_toolkit可被所有数据库用户访问,hawq_log_command_timings、hawq_log_master_concise、hawq_size_of_table_and_indexes_licensing、hawq_size_of_table_uncompressed视图的查询需要超级用户权限。
[gpadmin@hdp3 ~]$ hawq state -b 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:--HAWQ instance status summary 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:------------------------------------------------------ 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Master instance = Active 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Master standby = hdp2 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Standby master state = Standby host passive 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total segment instance count from config file = 4 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:------------------------------------------------------ 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Segment Status 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:------------------------------------------------------ 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total segments count from catalog = 4 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total segment valid (at master) = 4 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total segment failures (at master) = 0 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total number of postmaster.pid files missing = 0 20170427:10:56:54:403768 hawq_state:hdp3:gpadmin-[INFO]:-- Total number of postmaster.pid files found = 4 [gpadmin@hdp3 ~]$-b选项表示简要显示集群状态。也可以使用hawq state的-d选项,显示HAWQ master数据目录的信息:
[gpadmin@hdp3 ~]$ hawq state -d /data/hawq/master/该命令的输出与hawq state -b相同。
db1=# select * from hawq_toolkit.hawq_size_of_database db1-# order by sodddatname; sodddatname | sodddatsize -------------+------------- db1 | 16129012 gpadmin | 10394524 (2 rows)查看一个表使用的磁盘空间:hawq_toolkit管理模式包含几个视图用以查看表大小。表大小视图列出表的对象ID(不是表名)。为了通过表名检查其大小,必须与pg_class表中的关系名(relname)关联查询。例如:
db1=# select relname as name, sotdsize as size, sotdtoastsize as toast, sotdadditionalsize as other db1-# from hawq_toolkit.hawq_size_of_table_disk as sotd, pg_class db1-# where sotd.sotdoid=pg_class.oid order by relname; name | size | toast | other ---------------------+------+-------+------- sales | 0 | 0 | 32768 sales_1_prt_p201701 | 40 | 0 | 98304 sales_1_prt_p201702 | 0 | 0 | 32768 sales_1_prt_p201703 | 0 | 0 | 32768 sales_1_prt_p201704 | 0 | 0 | 32768 sales_1_prt_p201705 | 0 | 0 | 32768 sales_1_prt_p201706 | 0 | 0 | 32768 sales_1_prt_p201707 | 0 | 0 | 32768 sales_1_prt_p201708 | 0 | 0 | 32768 sales_1_prt_p201709 | 0 | 0 | 32768 sales_1_prt_p201710 | 0 | 0 | 32768 sales_1_prt_p201711 | 0 | 0 | 32768 sales_1_prt_p201712 | 0 | 0 | 32768 t | 48 | 0 | 98304 (14 rows)查看索引使用空间(HAWQ目前不支持索引):hawq_toolkit管理模式包含一些视图用以查看索引大小。查看一个表中所有索引的大小,使用hawq_size_of_all_table_indexes视图。查看一个特定索引的大小,使用hawq_size_of_index视图。索引大小视图通过对象ID列出表和索引(不是通过名字)。为了通过索引名检查其大小,必须与pg_class表中的关系名(relname)关联查询。例如:
db1=# select soisize, relname as indexname db1-# from pg_class, hawq_toolkit.hawq_size_of_index db1-# where pg_class.oid=hawq_size_of_index.soioid db1-# and pg_class.relkind='i'; soisize | indexname ---------+----------- (0 rows)(3)查看数据库对象的元数据信息
db1=# select schemaname as schema, objname as table, db1-# usename as role, actionname as action, db1-# subtype as type, statime as time db1-# from pg_stat_operations db1-# where objname='t'; schema | table | role | action | type | time --------+-------+---------+---------+-------+------------------------------- public | t | gpadmin | CREATE | TABLE | 2017-04-18 15:39:38.858007+08 public | t | gpadmin | ANALYZE | | 2017-04-21 10:16:32.42202+08 (2 rows)查看对象定义:可以使用\d元命令显示一个对象的定义,如表或视图。例如,查看一个名为t的表的定义:
db1=# \d t Append-Only Table "public.t" Column | Type | Modifiers --------+---------+----------- i | integer | Compression Type: None Compression Level: 0 Block Size: 32768 Checksum: f Distributed randomly(4)查看查询工作文件使用信息(文档中提到,但HAWQ 2.1.1的hawq_toolkit中没有找到)
# |
字段名 |
数据类型 |
描述 |
1 |
event_time |
timestamp with time zone |
日志条目写入时间 |
2 |
user_name |
varchar(100) |
数据库用户名 |
3 |
database_name |
varchar(100) |
数据库名 |
4 |
process_id |
varchar(10) |
系统进程ID(以“p”为前缀) |
5 |
thread_id |
varchar(50) |
线程ID(以“th-”为前缀) |
6 |
remote_host |
varchar(100) |
客户端机器的主机名/IP(如果在主节点上)。或主节点的主机名/IP(如果在段节点上)。 |
7 |
remote_port |
varchar(10) |
段或主节点的端口号 |
8 |
session_start_time |
timestamp with time zone |
会话连接打开的时间 |
9 |
transaction_id |
int |
主节点上的最上级的事务ID;是任何子事务的父ID。 |
10 |
gp_session_id |
text |
会话标识号(以“con”为前缀) |
11 |
gp_command_count |
text |
一个会话中的命令数(以“cmd”为前缀) |
12 |
gp_segment |
text |
段内容标识符。主节点的内容标识符恒为-1。 |
13 |
slice_id |
text |
片段ID(查询计划中被执行的部分) |
14 |
distr_tranx_id |
text |
分布式事务标识符 |
15 |
local_tranx_id |
text |
本地事务标识符 |
16 |
sub_tranx_id |
text | 子事务标识符 |
17 |
event_severity |
varchar(10) |
时间重要性,值包括:LOG、ERROR、FATAL、PANIC、DEBUG1、DEBUG2 |
18 |
sql_state_code |
varchar(10) |
SQL状态代码 |
19 |
event_message |
text |
日志或错误消息文本 |
20 |
event_detail |
text |
错误或警告消息相关的详细消息文本 |
21 |
event_hint |
text |
错误或警告消息相关的提示消息文本 |
22 |
internal_query |
text |
内部生成的查询文本 |
23 |
internal_query_pos |
int |
内部生成的查询文本的游标索引 |
24 |
event_context |
text |
此消息生成的上下文 |
25 |
debug_query_string |
text |
用于debug的用户提供的查询字符串。此字符串在内部使用时可能会被修改。 |
26 |
error_cursor_pos |
int |
查询字符串的游标索引 |
27 |
func_name |
text |
生成此消息的函数 |
28 |
file_name |
text |
原始消息所在的源文件名称 |
29 |
file_line |
int |
原始消息所在源文件中的行号 |
30 |
stack_trace |
Text |
消息相关的堆栈跟踪文本 |
select logtime, logmessage from hawq_toolkit.hawq_log_master_concise where logdatabase='mytest' and logseverity='error';
[gpadmin@hdp3 ~]$ gplogfilter -b '2017-03-01 14:00'使用hawq ssh应用运行gplogfilter,能同时查找所有segment日志文件。例如,创建一个<seg_hosts>文件,包含所有感兴趣的segment主机,然后执行gplogfilter显示每个segment主机的每个日志文件的最后三行。
[gpadmin@hdp1 ~]$ echo -e "hdp1\nhdp2\nhdp3\nhdp4\n" > seg_hosts [gpadmin@hdp1 ~]$ hawq ssh -f seg_hosts => source /usr/local/hawq/greenplum_path.sh => gplogfilter -n 3 /data/hawq/segment/pg_log/hawq*.csv
服务器配置参数 |
描述 |
client_min_messages |
标识客户端消息的日志级别。 |
debug_pretty_print |
Debug输出的缩进格式,增强可读性。 |
gp_log_format |
定义服务器日志文件格式。 |
gp_max_csv_line_length |
设置csv文件的最大行长。 |
log_autostats |
记录自动统计生成信息。 |
log_connections |
记录客户端连接。 |
log_disconnections |
记录客户端终止连接。 |
log_dispatch_stats |
与语句调度相关的日志信息。 |
log_duration |
记录语句执行时间。 |
log_error_verbosity |
定义日志细节程度。 |
log_hostname |
记录连接的主机名。 |
log_min_duration_statement |
配置最小执行时间,小于该时间的语句不记日志。 |
log_min_error_statement |
记录引发错误的SQL语句。 |
log_min_messages |
日志文件的日志级别。 |
log_statement |
控制日志中记录哪些SQL语句。 |
log_timezone |
设置日志文件时间戳的时区。 |
服务器配置参数 |
描述 |
log_rotation_age |
配置日志文件生命周期。 |
log_rotation_size |
配置日志文件最大尺寸。 |
log_truncate_on_rotation |
表示日志轮转时是否清空。 |
表8 日志轮转参数
服务器配置参数 |
描述 |
debug_print_parse |
记录查询解析树。 |
debug_print_plan |
记录查询计划。 |
debug_print_prelim_plan |
记录初步查询计划。 |
debug_print_rewritten |
记录查询重写输出。 |
debug_print_slice_table |
记录查询计划分片。 |
log_executor_stats |
记录查询执行器性能统计。 |
log_parser_stats |
记录查询编译器性能统计。 |
log_planner_stats |
记录遗留老优化器(planner)的性能统计。 |
log_statement_stats |
记录编译器、执行器、优化器总的性能统计。 |
表9 查询执行器和查询优化器日志相关参数
find /data/hawq/master/pg_log/ -mtime +30 -name "*.csv" -exec rm -rf {} \;
日志条目字段 |
描述 |
date |
条目被记录的日期(月、日、年) |
time |
条目被记录的时间 |
pid |
与命令相关的进程号 |
cmdname |
HAWQ管理应用名 |
host |
命令执行所在主机 |
user |
调用命令的用户名 |
loglevel |
日志级别,是DEBUG、INFO、WARN、FATAL之一。缺省的日志级别是INFO,有更多的重要消息。 |
message |
日志消息 |