Greenplum segment级问题的排查 - gp_session_role=utility (含csvlog日志格式解读)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

标签

PostgreSQL , Greenplum , segment , utility


背景

有些时候,我们在使用Greenplum时,你会发现明明连接数是够的,但是报错的时候segment连接满无法正确连接,因为对外的接口都是MASTER,如果发现这里问题如何排查?

 00000   LOG:  Failed connection to seg0   
 00000   STATEMENT:  INSERT INTO gps_track(  
 58M01   LOG:  (58M01) Master unable to connect to seg0 with options : FATAL:  Sorry, too many clients already  
 58M01   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  Failed connection to seg1   
 00000   STATEMENT:  INSERT INTO gps_track(  
 58M01   LOG:  (58M01) Master unable to connect to seg1 with options : FATAL:  Sorry, too many clients already  
 58M01   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  The previous session was reset because its gang was disconnected (session id = 318465). The new session id = 318471  
 00000   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  FTS rescanned, get new component databases info.  
 00000   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  Failed connection to seg0   
 00000   STATEMENT:  INSERT INTO gps_track(  
 58M01   LOG:  (58M01) Master unable to connect to seg0  with options : FATAL:  Sorry, too many clients already  
 58M01   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  Failed connection to seg1   
 00000   STATEMENT:  INSERT INTO gps_track(  
 58M01   LOG:  (58M01) Master unable to connect to seg1  with options : FATAL:  Sorry, too many clients already  
 58M01   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  The previous session was reset because its gang was disconnected (session id = 318471). The new session id = 318482  
 00000   STATEMENT:  INSERT INTO gps_track(  
 00000   LOG:  no primary segworker group allocated  
 00000   STATEMENT:  INSERT INTO gps_track(  
 XX000   ERROR:  (XX000) Unexpected internal error (cdbgang.c:1636)  
 XX000             LOCATION:  allocateWriterGang, cdbgang.c:1636  
 XX000   STATEMENT:  INSERT INTO gps_track(  
 XX000             Traceback 0:  postgres: port  INSERT() [0x9099af]  
 XX000             Traceback 1:  postgres: port  INSERT(elog_internalerror+0x20) [0x90cdc0]  
 XX000             Traceback 2:  postgres: port  INSERT(allocateWriterGang+0x248) [0x9d6cb8]  
 XX000             Traceback 3:  postgres: port  INSERT(AssignGangs+0x28b) [0x6b689b]  
 XX000             Traceback 4:  postgres: port  INSERT(ExecutorStart+0xe5f) [0x69e28f]  
 XX000             Traceback 5:  postgres: port  INSERT() [0x8304b7]  
 XX000             Traceback 6:  postgres: port  INSERT() [0x830c54]  
 XX000             Traceback 7:  postgres: port  INSERT(PortalRun+0x322) [0x8311c2]  
 XX000             Traceback 8:  postgres: port  INSERT() [0x82abc1]  
 XX000             Traceback 9:  postgres: port  INSERT(PostgresMain+0xbd8) [0x82d418]  
 XX000             Traceback 10:  postgres: port  INSERT() [0x7d3637]  
 XX000             Traceback 11:  postgres: port  INSERT(PostmasterMain+0xd2e) [0x7d514e]  
 XX000             Traceback 12:  postgres: port  INSERT(main+0x193) [0x730363]  
 XX000             Traceback 13:  /lib64/libc.so.6(__libc_start_main+0xfd) [0x2b6682187d5d]  
 XX000             Traceback 14:  postgres: port  INSERT() [0x4d6389]  

备库到底是什么状态?

例子

方法1

通过utility模式连接(前提是预留了足够多的super user connection = superuser_reserved_connections),允许直接连到SEGMENT节点。

PGOPTIONS='-c gp_session_role=utility' psql -h xxx -p xxx -U xxx xxx  

到segment节点一探究竟。

1、当前系统中的会话,评判标准:不能超过当前segment节点配置的max_connections 否则就会报连接不足。

select * from pg_stat_activity;   

2、2PC会话,评判标准:不能超过当前segment节点配置的max_prepared_transactions 否则就会报连接不足。

postgres=# select * from pg_prepared_xacts ;  
 transaction | gid | prepared | owner | database   
-------------+-----+----------+-------+----------  
(0 rows)  

3、segment级的锁等待状态

《Greenplum segment级锁问题排查方法 - 阿里云HybridDB for PostgreSQL最佳实践》

4、segment级日志排查。

cd $PGDATA/pg_log

查看日志

5、查看日志时,注意对应session id,可以找出它在master, primary segment上的所有相关日志。

日志格式如下:

src/backend/postmaster/syslogger.c


/*
 * syslogger_write_errordata
 *   Write the GpErrorData to the log.
 */
static void
syslogger_write_errordata(PipeProtoHeader *chunkHeader, GpErrorData *errorData, bool csv)
{
        syslogger_append_current_timestamp(true);
        
        /* username */
        syslogger_write_str_with_comma(errorData->username, true, csv, true);
        
        /* databasename */
        syslogger_write_str_with_comma(errorData->databasename, true, csv, true);
        
        /* Process id, thread id */
        syslogger_write_int32(false, "p", chunkHeader->pid, true, true);
        syslogger_write_int32(false, "th", chunkHeader->thid, true, true);
        
        /* Remote host */
        syslogger_write_str_with_comma(errorData->remote_host, true, csv, true);
        /* Remote port */
        syslogger_write_str_with_comma(errorData->remote_port, true, csv, true);
        
        /* session start timestamp */
        syslogger_append_timestamp(errorData->fix_fields.session_start_time, true, true);
        
        /* Transaction id */
        syslogger_write_int32(false, "", errorData->fix_fields.top_trans_id, true, true);
        
        /* GPDB specific options. */
        syslogger_write_int32(true, "con", errorData->fix_fields.gp_session_id, true, true); 
        syslogger_write_int32(true, "cmd", errorData->fix_fields.gp_command_count, true, true); 
        syslogger_write_int32(false, errorData->fix_fields.gp_is_primary == 't'? "seg" : "mir", errorData->fix_fields.gp_segment_id,
                                                  true, true); 
        syslogger_write_int32(true, "slice", errorData->fix_fields.slice_id, true, true); 
        syslogger_write_int32(true, "dx", errorData->fix_fields.dist_trans_id, true, true);
        syslogger_write_int32(true, "x", errorData->fix_fields.local_trans_id, true, true); 
        syslogger_write_int32(true, "sx", errorData->fix_fields.subtrans_id, true, true); 
        
        /* error severity */
        syslogger_write_str_with_comma(errorData->error_severity, true, csv, true);
        /* sql state code */
        syslogger_write_str_with_comma(errorData->sql_state, true, csv, true);
        /* errmsg */
        syslogger_write_str_with_comma(errorData->error_message, true, csv, true);
        /* errdetail */
        syslogger_write_str_with_comma(errorData->error_detail, true, csv, true);
        /* errhint */
        syslogger_write_str_with_comma(errorData->error_hint, true, csv, true);
        /* internal query */
        syslogger_write_str_with_comma(errorData->internal_query, true, csv, true);
        /* internal query pos */
        syslogger_write_int32(true, "", errorData->fix_fields.internal_query_pos, true, true);
        /* err ctxt */
        syslogger_write_str_with_comma(errorData->error_context, true, csv, true);
        /* user query */
        syslogger_write_str_with_comma(errorData->debug_query_string, true, csv, true);
        /* cursor pos */
        syslogger_write_int32(false, "", errorData->fix_fields.error_cursor_pos, true, true); 
        /* func name */
        syslogger_write_str_with_comma(errorData->error_func_name, true, csv, true);
        /* file name */
        syslogger_write_str_with_comma(errorData->error_filename, true, csv, true);
        /* line number */
        syslogger_write_int32(true, "", errorData->fix_fields.error_fileline, true, true);
        /* stack trace */
        if (errorData->stacktrace != NULL)
        {
                if (csv)
                {
                        write_syslogger_file_binary("\"", 1, LOG_DESTINATION_STDERR);
                }
                
                syslogger_write_str(errorData->stacktrace, strlen(errorData->stacktrace), true, csv);

                if (csv)
                {
                        write_syslogger_file_binary("\"", 1, LOG_DESTINATION_STDERR);
                }
        }
        
        /* EOL */
        write_syslogger_file_binary(LOG_EOL, strlen(LOG_EOL), LOG_DESTINATION_STDERR);
        
        /*
         * Send alerts when needed. The alerts are sent only by the master.
         * If the alert is failed for whatever reason, log a message and continue.
         */
        if (errorData->fix_fields.send_alert == 't' &&
                Gp_entry_postmaster && Gp_role == GP_ROLE_DISPATCH)
        {
                PG_TRY();
                {
                        send_alert(errorData);
                }
                PG_CATCH();
                {
                        elog(LOG,"Failed to send alert.");
                }
                PG_END_TRY();
        }
}

方法2

另一种方式,我们也能够使用gp_dist_random下发指令给SEGMENT节点,(通过SQL接口连接到master节点调用SQL即可)

《Greenplum通过gp_dist_random('gp_id') 在所有节点调用某个函数》

参考

《Greenplum segment级锁问题排查方法 - 阿里云HybridDB for PostgreSQL最佳实践》

《Greenplum segment节点直接读写配置与性能》

《Use pgbouncer connect to GreenPlum's segment node》

《Greenplum通过gp_dist_random('gp_id') 在所有节点调用某个函数》

《Greenplum & PostgreSQL UPSERT udf 实现 - 2 batch批量模式》

《Greenplum & PostgreSQL UPSERT udf 实现 - 1 单行模式》

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
Java Shell
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
「sh脚步模版自取」测试线排查的三个脚本:启动、停止、重启、日志保存
37 1
|
1月前
|
Java 程序员 应用服务中间件
「测试线排查的一些经验-中篇」&& 调试日志实战
「测试线排查的一些经验-中篇」&& 调试日志实战
22 1
「测试线排查的一些经验-中篇」&& 调试日志实战
|
4月前
|
SQL Java Serverless
实时计算 Flink版操作报错合集之在写入SLS(Serverless Log Service)时出现报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
SQL Oracle 关系型数据库
oracle11g SAP测试机归档日志暴增排查(二)
oracle11g SAP测试机归档日志暴增排查(二)
326 1
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
分享一种接口的日志格式
分享一种接口的日志格式
50 13
|
3月前
|
JavaScript Serverless Linux
函数计算产品使用问题之遇到Node.js环境下的请求日志没有正常输出时,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
存储 弹性计算 监控
函数计算产品使用问题之程序正常运行,但无法在 /home/lang_serve_severless_log 下找到日志文件,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
4月前
|
存储 弹性计算 运维
可观测性体系问题之Process Layer在ECS稳定性平台中的工作如何解决
可观测性体系问题之Process Layer在ECS稳定性平台中的工作如何解决
42 0
|
5月前
|
C++
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
299 6
下一篇
无影云桌面