标签

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 单行模式》

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

  1. greenplum segment恢复的过程

    #此时已经知道坏了两个SEGMENT 在启动命令里加上-R以限制模式启动 [gpadmin1@hadoop1 ~]$ gpstart -R    20101027:14:11:55:gpstart:h ...

  2. 故障分析 | Greenplum Segment 故障处理

    作者:杨文 DBA,负责客户项目的需求与维护,会点数据库,不限于MySQL.Redis.Cassandra.GreenPlum.ClickHouse.Elastic.TDSQL等等. 本文来源:原创投 ...

  3. Greenplum Segment节点掉线恢复介绍

    1. 背景 Greenplum版本:6.13.0 问题: Segment节点异常关机,恢复Segment节点并恢复Mirror节点状态. 如图所示:sdw1节点掉线. 2. 解决方法: 2.1 查看M ...

  4. 日志排查问题困难?分布式日志链路跟踪来帮你

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 作者:朱乐陶,软件架构师,具备多年Java开发及架构设计经验,擅长微服务领域 作者博客:htt ...

  5. 西南民族大学计算机考试试题,西南民族大学预科教育学院 2007级《计算机》模拟试题(含答案)...

    2007级<计算机>考试模拟题 一.单项选择题(每小题1分,共30分) ( A ) 1.计算机中的基本存储单位是-----. (A).Byte: (B).bit:(C).word:(D). ...

  6. 闵行区级创新研发中心认定及奖励50万政策解读

    闵行区级创新研发中心 一. 主管部门 闵行区科学技术委员会 二. 政策依据 <关于印发<闵行区关于支持关键核心技术自主创新的实施意见>的通知>(闵科委规发[2021]5号) & ...

  7. Google Earth Engine(GEE)——全球12级流域矢量数据免费下载(含数据下载链接)

    HydroBASINS代表了一系列矢量多边形图层,在全球范围内描述了子流域的边界.该产品的目标是在全球范围内无缝覆盖不同尺度(从几十平方公里到几百万平方公里)的大小一致.分层嵌套的子流域,并由一个编码 ...

  8. 《阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读》阅读笔记

    什么是搜索离线? 何谓离线?在阿里搜索工程体系中我们把搜索引擎.在线算分.SearchPlanner等ms级响应用户请求的服务称之为"在线"服务:与之相对应的,将各种来源数据转换处 ...

  9. 阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读

    阿里妹导读:搜索离线数据处理是一个典型的海量数据批次/实时计算结合的场景,阿里搜索中台团队立足内部技术结合开源大数据存储和计算系统,针对自身业务和技术特点构建了搜索离线平台,提供复杂业务场景下单日批次 ...

最新文章

  1. Please ensure JDK installation is valid and compatible with the current OS
  2. 授权公钥登录,sudo权限脚本
  3. [ARM-assembly]-A64指令集合总结
  4. 数据结构:用栈实现中缀表达式的求值(文字描述+详细步骤示例)
  5. 路飞学城Python-Day182
  6. 【XLL 框架库函数】 Excel/Excel12f
  7. 图标代码_通过两行代码即可调整苹果电脑 Launchpad 图标大小!
  8. Android----Allapps加载流程详解【AndroidICS4.0——Launcher系列五】
  9. 正确识别希捷Backup Plus新睿品1TB正品,杜绝奸商猖獗
  10. (转)Docker - 使用 compose 编排服务
  11. Illustrator 教程,如何在 Illustrator 文档中缩放和平移?
  12. 【转】DD_belatedPNG,解决IE6不支持PNG绝佳方案
  13. 条形码编码规则及标准
  14. git服务器ip变更后的配置
  15. 【项目实战】仓库信息管理系统(layui+SSM+SpringBoot)
  16. java深克隆 浅克隆_通过Java中深克隆与浅克隆来理解克隆
  17. 【AviUtl】动画效果,简易Glitch++(派生),学习笔记
  18. 【tkinter】用不到50行Python代码,写一个扫雷小游戏
  19. Java集成PayPal支付
  20. 【python牛客刷题】——深度学习第一弹

热门文章

  1. 2018-2019-1 20165234 《信息安全系统设计基础》第八周学习总结
  2. [archlinux] linux boot process/order/stage
  3. 使用runtime 实现weex 跳转原生页面
  4. 我的angularjs源码学习之旅1——初识angularjs
  5. 帝国时代的升级企事业的发展
  6. 在安卓模拟器中,adb安装apk常见错误
  7. c++使用单向链表存储一组有序数据_初试攻略丨计算机考研中数据结构知识点总结,硬核!...
  8. 灾备中心服务器辐射,数据中心和灾备中心的相同点以及不同点
  9. ios 各种锁的使用性能比较
  10. 日志,错误日志,成功日志,日志是个好东西。