Greenplum的日誌管理

Greenplum的日誌管理

本篇文檔首先介紹GP的日誌架構,日誌工具的使用說明,然後介紹一下日誌的定期清理配置案例

 

 

目錄

Greenplum的日誌管理

日誌架構

日誌路徑

日誌說明

日誌常用的參數和配置方案

日誌過濾工作的使用

檢查segment日誌

gplogfilter+gpssh工具組合在所有segment節點進行查找

查看時間段的

篩選

 

gp_toolkit.gp_log*

gp_toolkit.gp_log_* 視圖

日誌文件的定期清理


 

日誌架構

 

日誌路徑

下面的表格展示了各種Greenplum數據庫日誌文件的位置。在文件路徑中,date是YYYYMMDD格式的日期,instance是當前的實例名稱,而n是Segment編號。

路徑 描述
/home/gpadmin/gpadminlogs/* 很多不同種類的日誌文件,每臺服務器都有的目錄
/home/gpadmin/gpadminlogs/gpstart_date.log 啓動日誌
/home/gpadmin/gpadminlogs/gpstop_date.log 停止日誌
/home/gpadmin/gpadminlogs/gpsegstart.py_idb*gpadmin_date.log Segment啓動日誌
/home/gpadmin/gpadminlogs/gpsegstop.py_idb*gpadmin_date.log Segment停止日誌
/greenplum/gpdata/master/gpseg-1/pg_log/startup.log 實例啓動日誌
/greenplum/gpdata/master/gpseg-1/gpperfmon/logs/gpmon.*.log gpperfmon日誌
/greenplum/gpdata/mirror1/gpseg4/pg_log/*.csv 鏡像Segment日誌
/greenplum/gpdata/primary1/gpseg0/pg_log/*.csv 主Segment日誌
/home/log/messages 全局Linux系統消息

 

 

服務器日誌文件被寫爲逗號分隔值(CSV)格式。不是所有的日誌項在所有的日誌域中都有值。例如,只有與查詢工作者進程相關的日誌項纔會有slice_id值。一個特定查詢的相關日誌項可以通過其會話標識符(gp_session_id)和命令標識符(gp_command_count)確定。

# 域名 數據類型 描述
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) 線程計數(帶前綴“th”)
6 remote_host varchar(100) 在Master上,是客戶端機器的主機名/地址。在Segment上,是Master的主機名/地址。
7 remote_port varchar(10) Segment或Master的端口號
8 session_start_time timestamp with time zone 會話連接打開的時間
9 transaction_id int Master上的頂層事務ID。這個ID是任何子事務的父親。
10 gp_session_id text 會話標識符號(帶前綴“con”)
11 gp_command_count text 會話內部的命令編號(帶前綴“cmd”)
12 gp_segment text Segment內容標識符(對主Segment帶前綴“seg”,鏡像Segment帶前綴“mir”)。Master的內容id總是-1。
13 slice_id text 切片id(查詢計劃被執行的部分)
14 distr_tranx_id text 分佈式事務ID
15 local_tranx_id text 本地事務ID
16 sub_tranx_id text 子事務ID
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 帶有完整細節的用戶提供的查詢字符串,用於調試。這個字符串可能會由於內部使用而修改。
26 error_cursor_pos int 指向查詢字符串中的光標
27 func_name text 產生這個消息的函數
28 file_name text 產生消息的內部代碼文件
29 file_line int 產生消息的內部代碼文件的行號
30 stack_trace text 與這個消息相關的棧跟蹤文本

日誌說明

 

1.3.1 pg_log

這個日誌一般是記錄服務器與DB的狀態,比如各種Error信息,定位慢查詢SQL,數據庫的啓動關閉信息,發生checkpoint過於頻繁等的告警信息,諸如此類。linux自帶的路徑一般在/home/log/postgres下面。該日誌有.csv格式和.log。個人建議用前一種,因爲一般會按大小和時間自動切割,畢竟查看一個巨大的日誌文件比查看不同時間段的多個日誌要難得多。另外這種日誌是可以被清理刪除,壓縮打包或者轉移,同時並不影響DB的正常運行。當我們有遇到DB無法啓動或者更改參數沒有生效時,第一個想到的就是查看這個日誌。

共有四類,FATAL-嚴重告警,ERROR-錯誤,WARNING-警告,LOG-操作日誌。由於是文本文件所以查詢檢索很不方便,經過觀察,發現這些文件是有固定格式的,可以採用外部表的方式進行查詢,同時可以利用相關的工具進行過濾

1.3.2 pg_xlog

這個日誌是記錄的Postgresql的WAL信息,也就是一些事務日誌信息(transaction log),默認單個大小是16M,源碼安裝的時候可以更改其大小。這些信息通常名字是類似'000000010000000000000013'這樣的文件,這些日誌會在定時回滾恢復(PITR),流複製(Replication Stream)以及歸檔時能被用到,這些日誌是非常重要的,記錄着數據庫發生的各種事務信息,不得隨意刪除或者移動這類日誌文件,不然你的數據庫會有無法恢復的風險

當你的歸檔或者流複製發生異常的時候,事務日誌會不斷地生成,有可能會造成你的磁盤空間被塞滿,最終導致DB掛掉或者起不來。遇到這種情況不用慌,可以先關閉歸檔或者流複製功能,備份pg_xlog日誌到其他地方,但請不要刪除。然後刪除較早時間的的pg_xlog,有一定空間後再試着啓動Postgres。

日誌分析可用通過如下手段(這塊內容我會單獨整理一個blog)

  • 文件查看和檢索

  • 利用外部表方式進行查詢

  • 通過logstash工具進行定製分析

  • 通過在安裝了gpperfmon組件的情況下,通過log_alert_history 進行查詢

  • 查看系統視圖

  1. List of relations

  2. Schema | Name | Type | Owner | Storage

  3. ------------+------------------------+------+----------+---------

  4. gp_toolkit | gp_log_command_timings | view | digoal | none -- 統計

  5. gp_toolkit | gp_log_database | view | digoal | none -- 這個包含當前數據庫日誌

  6. gp_toolkit | gp_log_master_concise | view | digoal | none -- 統計

  7. gp_toolkit | gp_log_system | view | digoal | none -- 這個包含所有日誌

  8. (4 rows)

  • 通過gplogfilter工具來查找匹配指定標準的日誌數據(包含segment gpssh)

 

1.3.3 pg_clog

pg_clog這個文件也是事務日誌文件,但與pg_xlog不同的是它記錄的是事務的元數據(metadata),這個日誌告訴我們哪些事務完成了,哪些沒有完成。這個日誌文件一般非常小,但是重要性也是相當高,不得隨意刪除或者對其更改信息。

總結:

pg_log記錄各種Error信息,以及服務器與DB的狀態信息,可由用戶隨意更新刪除

pg_xlog與pg_clog記錄數據庫的事務信息,不得隨意刪除更新,做物理備份時要記得備份着兩個日誌。

 

1.4 數據庫的啓動和關閉日誌

程序日誌文件:使用gpstart,gpstop 等相關命令的日誌 缺省位於~/gpAdminLogs目錄下 命令方式:<script_name>_.log 日誌記錄的格式: ::::[INFO|WARN|FATAL]:

日誌常用的參數和配置方案

 

 

下面是Greenplum與安全相關的審計(或者日誌)服務器配置參數,它們可以在postgresql.conf配置文件中設置:

域名 值範圍 默認 描述
log_connections Boolean off 這會對服務器日誌輸出一行詳細描述每個成功的連接。某些客戶端程序(如psql)在決定是否要求口令時會嘗試連接兩次,因此重複的“connection received”消息並非總是表示問題。
log_disconnections Boolean off 在一個客戶端會話終止時,這會在服務器日誌中輸出一行,其中會包括該會話的持續時間。
log_statement NONEDDLMODALL ALL 控制那些SQL語句會被記錄。DDL記錄所有數據定義命令,如CREATE、ALTER和DROP命令。MOD記錄所有DDL語句外加INSERT、UPDATE、DELETE、TRUNCATE以及COPY FROM。如果PREPARE和EXPLAIN ANALYZE語句中如果包含有適當類型的命令,它們也會被日誌記錄。
log_hostname Boolean off 連接日誌消息默認只顯示連接主機的IP地址。把這個選項打開會導致主機名也被記錄。注意這依賴於用戶的主機名解析設置,而且這有可能會帶來不可忽視的性能損失。
log_duration Boolean off 致使每一個滿足log_statement的完成語句的持續時間被記錄。
log_error_verbosity TERSEDEFAULTVERBOSE DEFAULT 爲被記錄的每條消息控制寫入到服務器日誌的細節多少。
log_min_duration_statement 毫秒數, 0, -1 -1 如果語句的持續時間大於等於指定的毫秒數,則在一個日誌行中記錄該語句和它的持續時間。將這個參數設置爲0將打印出所有的語句及其持續時間。-1禁用這一特性。例如,如果用戶將它設置爲250,那麼所有運行時間大於等於250ms的SQL語句將被記錄。在跟蹤應用中的未優化查詢時,啓用這一選項非常有用。
log_min_messages DEBUG5 DEBUG4 DEBUG3 DEBUG2 DEBUG1 INFO NOTICE WARNING ERROR LOG FATAL PANIC NOTICE 控制哪些消息級別會被寫入到服務器日誌。每個級別包括其後的所有級別。級別越靠後,發送到日誌的消息就越少。
log_rotation_age 任意有效的時間表達式(數字和單位) 1d 決定個體日誌文件的最大生存時間。在這個時間過去之後,一個新的日誌文件將被創建。設置爲零可禁用新日誌文件基於時間創建。
log_statement_stats Boolean off 對每個查詢,寫入查詢解析器、規劃器和執行器的整體性能統計信息到服務器日誌中。這是一種粗糙的畫像手段。
og_truncate_on_rotation Boolean off 截斷(重寫)而不是追加到任何現存的同名日誌文件。僅當一個新文件由於基於時間的輪轉而被打開時,截斷纔會發生。例如,使用這個設置配合gpseg#-%H.log這樣的log_filename會導致產生24個每小時的日誌文件,然後循環地重寫它們。關閉這一設置時,預先已經存在的文件在所有的情況下都會被追加內容。
       
       

 

 

如下一共三個配置方案,可根據業務需求進行配置

參數 說明
logging_collector 是否打印log
log_line_prefix 日誌格式
log_directory 日誌保存目錄
log_statement 打印sql 類型
log_min_duration_statement *記錄超時sql,超時多少秒記錄*
*log日誌方案(1)每天生成一個日誌文件*  
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log 文件名
log_truncate_on_rotation = off 文件存在是否覆蓋
log_rotation_age = 1d 間隔多長時間更換新文件
log_rotation_size = 0 超過大小則換一個文件
log日誌方案(2)每當日誌寫完一定大小,則換一個  
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log  
log_truncate_on_rotation = off  
log_rotation_age = 0  
log_rotation_size = 10M  
*log日誌方案(3)只保留7天的日誌,循環替換*  
log_filename = 'postgresql-%a.log 星期
log_truncate_on_rotation = on 開啓覆蓋
log_rotation_age = 1d  
log_rotation_size = 0  

 

 

日誌過濾工作的使用

 

 

 

 

檢查segment日誌

 

 gplogfilter -n 3 輸出最後3行日誌
 如果想查看segment節點的日誌,那麼可以執行以下命令
 gpssh -f seg_hosts  #seg_hosts爲segment節點的主機列表
 =>source /usr/local/greenplum-db/greenplum_path.sh
 =>gplogfilter -n 3 /greenplum/gpdata/primary1/gpseg*/pg_log/gpdb-*.csv  #segment節

 

gplogfilter+gpssh工具組合在所有segment節點進行查找

可以通過gplogfilter+gpssh組合使用,集中查看log

 

日誌文件對於確定出錯的原因可以提供更多的信息。 Master和每個Segment Instance都有自己的日誌文件,它位於數據目錄下的 pg_log 中。 Master 的日誌文件包含着最多的信息,應該總是首先檢查Master日誌文件。

可以使用 gplogfilter命令 檢查GPDB日誌文件。要檢查 Segment 的日誌文件,可以使用 gpssh 在 Segment 主機上運行 gplogfilter命令

  • 檢查日誌文件

  1. 檢查 Master 日誌文件 WARNING、 ERROR、 FATAL 或 PANIC 級別的日誌信息:

 $ gplogfilter -t
  1. 使用 gpssh 檢查 Segment Instance 日誌文件的 WARNING、 ERROR、 FATAL 或 PANIC級別日誌信息:

 $ gpssh -f seg_hosts_file -e 'source /usr/local/greenplum   db/greenplum_path.sh;gplogfilter -t /data1/primary/*/pg_log/gpdb*.log' > seglog.out

 

查看時間段的

gplogfilter -b '2013-05-23 14:33' -e '2013-05-23 14:33'

篩選

 -f '<string>' | --find='<string>' 
 ​
  Finds the log entries containing the specified string. 
 ​
  
 -F '<string>' | --nofind='<string>' 
 ​
  Rejects the log entries containing the specified string.
  
  -m <regex> | --match=<regex> 
 ​
  Finds log entries that match the specified Python regular expression. 
  See http://docs.python.org/library/re.html for Python regular expression 
  syntax. 
 ​
 ​
 -M <regex> | --nomatch=<regex> 
 ​
  Rejects log entries that match the specified Python regular expression. 
  See http://docs.python.org/library/re.html for Python regular expression 
  syntax. 

 

Greenplum提供了gp_toolkit.gp_log...視圖,用來匯聚日誌,方便查看。

 

gp_toolkit.gp_log*

由於GP爲分佈式數據庫,當查看它的一些日誌時,如果到服務器上查看,會非常的繁瑣,而且不好排查問題。

 

Greenplum提供了gp_toolkit.gp_log...視圖,用來匯聚日誌,方便查看。

 [gpadmin@mdw ~]$ psql
 psql (8.3.23)
 Type "help" for help.
 ​
 archdata=# \dv gp_toolkit.gp_log*  
                        List of relations
    Schema   |          Name          | Type |  Owner  | Storage 
 ------------+------------------------+------+---------+---------
  gp_toolkit | gp_log_command_timings | view | gpadmin | none
  gp_toolkit | gp_log_database        | view | gpadmin | none
  gp_toolkit | gp_log_master_concise  | view | gpadmin | none
  gp_toolkit | gp_log_system          | view | gpadmin | none
 (4 rows)
 ​
 archdata=# 

gp_toolkit.gp_log_* 視圖

  • gp_log_command_timings (只輸出會話,PID,時間,如果關注運行較長時間的詳細信息,可根據會話,PID在gp_log_system中定位)

 This view uses an external table to read the log files on the master and report the execution time of SQL commands executed in a database session.   
 The use of this view requires superuser permissions.  
  • gp_log_master_concise (只有master節點的日誌)

 This view uses an external table to read a subset of the log fields from the master log file.   
 The use of this view requires superuser permissions.  
  • gp_log_system (匯聚master,segment,mirror節點的日誌,含所有數據庫)

 This view uses an external table to read the server log files of the entire Greenplum system (master, segments, and mirrors) and lists all log entries.   
 Associated log entries can be identified by the session id (logsession) and command id (logcmdcount).   
 The use of this view requires superuser permissions.  
  • gp_log_database (匯聚master,segment,mirror節點的日誌,含當前數據庫)

 This view uses an external table to read the server log files of the entire Greenplum system (master, segments, and mirrors) and lists log entries associated with the current database.   
 Associated log entries can be identified by the session id (logsession) and command id (logcmdcount).   
 The use of this view requires superuser permissions.  

 

 

 archdata=# \x
 Expanded display is on.
 archdata=# select * from gp_toolkit.gp_log_database limit 1000; 
 -[ RECORD 1 ]--+----------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ------------------------------
 logtime        | 2020-04-21 14:37:45.293413+08
 loguser        | gpadmin
 logdatabase    | archdata
 logpid         | p21318
 logthread      | th1795716992
 loghost        | ::1
 logport        | 22062
 logsessiontime | 2020-04-21 14:37:45+08
 logtransaction | 0
 logsession     | 
 logcmdcount    | 
 logsegment     | seg-1
 logslice       | 
 logdistxact    | 
 loglocalxact   | 
 logsubxact     | 
 logseverity    | FATAL
 logstate       | 57P03
 logmessage     | the database system is starting up
 logdetail      | 
 loghint        | 
 logquery       | 
 logquerypos    | 
 logcontext     | 
 logdebug       | 
 logcursorpos   | 0
 logfunction    | 
 logfile        | postmaster.c
 logline        | 2927
 logstack       | 
 -[ RECORD 2 ]--+----------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ------------------------------
 logtime        | 2020-04-21 14:37:46.311543+08
 loguser        | gpadmin
 logdatabase    | archdata
 logpid         | p21349
 logthread      | th1795716992
 loghost        | ::1
 logport        | 22074
 logsessiontime | 2020-04-21 14:37:46+08
 logtransaction | 0
 logsession     | con5
 logcmdcount    | cmd1
 logsegment     | seg-1
 logslice       | 
 logdistxact    | 
 loglocalxact   | 
 logsubxact     | sx1
 logseverity    | LOG
 logstate       | 00000
 logmessage     | statement: BEGIN
 logdetail      | 
 loghint        | 
 logquery       | 
 logquerypos    | 
 logcontext     | 
 logdebug       | BEGIN
 logcursorpos   | 0
 logfunction    | 
 logfile        | postgres.c
 logline        | 1590
 logstack       | 
 -[ RECORD 3 ]--+----------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ------------------------------
 logtime        | 2020-04-21 14:37:46.311627+08
 loguser        | gpadmin
 logdatabase    | archdata
 logpid         | p21349
 logthread      | th1795716992
 loghost        | ::1
 logport        | 22074
 logsessiontime | 2020-04-21 14:37:46+08
 logtransaction | 0
 logsession     | con5
 logcmdcount    | cmd2
 logsegment     | seg-1
 logslice       | 
 logdistxact    | 
 loglocalxact   | 
 logsubxact     | sx1
 logseverity    | LOG
 logstate       | 00000
 logmessage     | statement: SET CLIENT_MIN_MESSAGES='ERROR'
 logdetail      | 
 loghint        | 
 logquery       | 
 logquerypos    | 
 logcontext     | 
 logdebug       | SET CLIENT_MIN_MESSAGES='ERROR'
 logcursorpos   | 0
 logfunction    | 
 logfile        | postgres.c
 logline        | 1590
 logstack       | 
 -[ RECORD 4 ]--+----------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ------------------------------
 logtime        | 2020-04-21 14:37:46.311674+08
 loguser        | gpadmin
 logdatabase    | archdata
 logpid         | p21349
 logthread      | th1795716992
 loghost        | ::1
 logport        | 22074
 logsessiontime | 2020-04-21 14:37:46+08
 logtransaction | 0
 logsession     | con5
 logcmdcount    | cmd3
 logsegment     | seg-1
 logslice       | 
 logdistxact    | 
 loglocalxact   | 
 logsubxact     | sx1
 logseverity    | LOG
 logstate       | 00000
 logmessage     | statement: COMMIT
 logdetail      | 
 loghint        | 
 logquery       | 
 logquerypos    | 
 logcontext     | 
 logdebug       | COMMIT
 logcursorpos   | 0
 logfunction    | 
 logfile        | postgres.c
 logline        | 1590
 logstack       | 

 

 

 

 select * from gp_toolkit.gp_log_command_timings order by logsession,logcmdcount limit 100;  
 ​
 archdata=# select * from gp_toolkit.gp_log_command_timings order by logsession,logcmdcount limit 100;
 -[ RECORD 1 ]------------------------------
 logsession  | con10
 logcmdcount | cmd1
 logdatabase | gpperfmon
 loguser     | gpmon
 logpid      | p14674
 logtimemin  | 2020-04-25 07:03:54.693368+08
 logtimemax  | 2020-04-25 07:03:54.702078+08
 logduration | 00:00:00.00871
 -[ RECORD 2 ]------------------------------
 logsession  | con10
 logcmdcount | cmd1
 logdatabase | gpperfmon
 loguser     | gpmon
 logpid      | p24290
 logtimemin  | 2020-04-25 08:38:59.935377+08
 logtimemax  | 2020-04-25 08:38:59.943972+08
 logduration | 00:00:00.008595
 ​

 

 

 select * from gp_toolkit.gp_log_master_concise limit 1000;  
 archdata=# select * from gp_toolkit.gp_log_master_concise limit 1000; 
 -[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 --------------------------------------------------------------------------------------------------------------------------------------------------------------------
 -----------------------------------------------------------------------------
 logtime     | 2020-04-21 14:30:21.830595+08
 logdatabase | 
 logsession  | 
 logcmdcount | 
 logseverity | LOG
 logmessage  | TransitionToMasterOrMirrorless: initializing XLog startup

 

日誌文件的定期清理

greenplum日誌存放在pg_log下,master節點和每個segment節點都會有,格式爲gpdb-YYYY-MM-DD_hhmmss.cs 需要我們定期清理

定期清理master節點的日誌,保留最近8天的日誌

find master日誌目錄 -type f -name "gpdb-*.csv" -ctime +8 -exec rm {} \;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章