MPP主备集群搭建与高可用实战:从原理到故障切换 1. 项目概述为什么MPP主备集群不是“装完就完事”的简单任务MPP主备集群——这个词在数据平台工程师的日常沟通里已经从一个技术名词演变成了某种“压力信号”。它不像单机数据库那样重启一下就能恢复也不像普通微服务那样加个负载均衡就高枕无忧。它背后是一整套数据一致性、故障切换时效性、元数据同步可靠性、计算资源调度连续性的综合博弈。我接触过至少7个不同行业的MPP集群部署案例从某高校科研平台的TPC-H分析系统到某制造企业实时质量看板底座再到某金融风控中台的离线特征计算引擎无一例外都在“主备切换成功”之后的第3天、第7天或第15天暴露出元数据不一致、备节点无法接管查询、WAL日志堆积导致主节点IO飙升等典型问题。这些问题从来不是配置文件写错了某一行而是对MPP架构本质理解偏差的必然结果。所谓“主备”在MPP语境下绝非传统主从复制的简单平移。MPPMassively Parallel Processing强调的是数据分片计算下推全局事务协调三位一体。主节点不只是“发号施令”它承担着全局计划生成、跨节点执行调度、分布式锁管理、两阶段提交协调器等核心职责而备节点也远不止是“等接班”它必须实时同步主节点的内存状态快照、事务日志流、查询执行上下文缓存、甚至UDF函数加载状态。一旦忽略这点把PostgreSQL主从那一套直接套用到Greenplum、StarRocks或Doris的主备设计上90%的概率会在压测阶段就卡在“备节点查询返回空结果”或“主节点切走后新连接连不上”这种看似低级、实则根植于架构差异的问题上。这个标题“MPP主备集群-搭建步骤”表面看是教你怎么敲几条命令但真正要解决的是三个层次的问题第一层物理层面——网络隔离策略怎么设存储是否共享心跳链路要不要独立网卡第二层逻辑层面——元数据同步用逻辑复制还是物理复制WAL归档粒度是按segment还是按事务备节点启动时如何校验分片映射表gp_segment_configuration的一致性第三层运维层面——切换脚本里有没有检查pg_stat_replication视图中apply_delay是否为0failover后是否自动触发analyze分布键统计信息更新这些细节文档里往往只字不提但它们才是决定集群能否扛住真实业务流量的关键。所以这篇内容不是给刚学SQL的新手看的“一键安装指南”而是给已经部署过单MPP集群、正面临生产环境高可用升级需求的工程师准备的实战手册。它会告诉你哪些步骤必须手动验证哪些参数调优能省下30%的切换时间以及——最重要的是——为什么某些看似“标准操作”的步骤在MPP场景下反而会埋下隐患。如果你正在为下周的等保测评做高可用加固或者刚收到业务方“双活容灾”的需求邮件那接下来的内容就是你真正需要的底层逻辑和可落地的检查清单。2. 整体架构设计与方案选型逻辑2.1 MPP主备的本质不是复制而是状态协同很多工程师第一次接触MPP主备会下意识类比MySQL主从或PostgreSQL流复制。这是最危险的认知起点。MySQL主从复制的是binlog事件PostgreSQL流复制传输的是WAL记录二者都属于日志重放模型备库通过重放日志逐步追上主库的状态。但MPP集群的“主备”如果仅靠WAL重放会立刻陷入不可用状态——因为WAL只记录数据页变更不记录分片路由关系变更、Segment节点状态变更、全局事务ID分配、分布式锁持有状态等关键元数据。举个具体例子某次业务上线新增了一个分区表主节点执行了ALTER TABLE t1 ADD PARTITION ...。这条DDL在主节点上会触发三件事① 更新系统表pg_partition② 向所有Segment广播新的分片映射规则③ 在全局事务管理器中注册该DDL的XID。如果备节点只靠WAL重放它只会看到数据页的修改实际没有数据页改而完全不知道分片规则已变。当业务查询发往备节点时查询优化器仍按旧的分片规则拆分SQL结果要么查不到数据要么跨节点重复扫描性能断崖式下跌。因此真正的MPP主备架构必须是双通道同步数据通道基于WAL的物理复制保证底层数据块一致性元数据通道基于专用协议的逻辑同步实时推送DDL变更、Segment状态心跳、锁管理器状态、统计信息更新等。这个设计决策直接决定了工具链选型。比如Greenplum官方推荐的gprecoverseg gpmovemirrors组合本质就是元数据通道的封装而StarRocks的Follower FE节点则通过BDB JEBerkeley DB Java Edition实现元数据的强一致同步。选择哪种方案首先要看你的MPP引擎是否原生支持双通道——如果不支持如早期版本Doris就必须在外部引入ZooKeeper或etcd作为元数据协调中心这会显著增加架构复杂度和故障点。2.2 网络与存储拓扑别让“高可用”变成“单点放大器”我见过最典型的反模式是把主备节点部署在同一机架的两台服务器上共用一台接入交换机存储挂载同一个NAS。表面上看是“主备”实际上网络、电源、存储三个关键路径全部单点。一次交换机固件升级整个集群失联一次NAS磁盘阵列重建主备同时IO阻塞。真正的MPP主备网络设计必须遵循“三层隔离”原则业务网络隔离主备节点各自绑定独立网卡接入不同物理交换机VLAN ID严格分离。业务应用通过VIP虚拟IP访问VIP由Keepalived或Pacemaker管理但VIP漂移必须与数据库状态解耦——即VIP只在数据库服务进程健康且同步延迟500ms时才允许漂移。复制网络隔离WAL流和元数据同步必须走独立网卡和独立子网。我们曾在线上环境发现当业务查询并发达到800QPS时复制网络带宽被挤占导致备节点WAL apply延迟飙升至12秒触发误判为“同步中断”而强制切换结果新主节点因元数据未同步完成直接拒绝所有写入请求。后来将复制网卡从1G升级到10G并划分独立VLAN问题彻底消失。存储路径隔离强烈建议采用本地SSD存储而非共享存储。理由很现实MPP的I/O特征是大量随机小IO每个Segment独立刷脏页共享存储的锁竞争和网络延迟会严重拖慢checkpoint速度。某次压测中我们对比了两种方案① 主备各配2TB NVMe SSD② 主备挂载同一套4节点Ceph集群。结果显示方案①的平均checkpoint耗时为2.3秒方案②高达18.7秒且在高并发下出现周期性IO hang。本地存储的唯一代价是数据冗余率翻倍但这恰恰是MPP主备的合理成本——你本来就需要两份全量数据副本。提示不要迷信“存储层双活”。MPP的瓶颈从来不在存储吞吐而在计算节点间的数据shuffle和全局事务协调。把资源花在提升网络隔离度和本地IO性能上收益远大于折腾存储双活。2.3 方案选型对比Greenplum / StarRocks / Doris 的主备实现差异不同MPP引擎对主备的支持成熟度差异极大选型不能只看官网文档的“支持高可用”字样必须深挖其实现机制。以下是三个主流引擎在生产环境验证过的主备方案对比维度Greenplum 6.xStarRocks 2.5Doris 2.0主备角色定义Master含Standby Master、Segment含Mirror SegmentFEFrontend分Leader/Follower/ObserverBEBackend无主备概念FE分Follower/ObserverBE通过多副本保障数据可用性元数据同步机制Standby Master通过pg_rewindrsync同步Master数据目录依赖gpstate校验一致性Leader FE通过BDB JE同步元数据到Follower FE支持毫秒级强一致Follower FE通过RAFT协议同步元数据需至少3个Follower才能保证高可用数据同步机制Mirror Segment通过WAL流复制同步Primary Segment数据支持同步/异步模式BE数据副本由FE统一调度副本间通过Stream Load或Broker Load同步无传统WAL概念BE数据副本通过RAFT日志同步写入时需多数派确认强一致性保障故障切换RTOMaster切换约30-60秒含gpstop -m、gpstart -a、gprecoversegFE Leader切换5秒BDB JE自动选举FE Leader切换10-20秒RAFT选举元数据加载运维复杂度高需维护Master/Segment双重同步状态gprecoverseg常需人工干预中FE自动选举但BE副本修复需监控show proc /backends低RAFT自动处理但FE节点数必须为奇数扩容需谨慎从这张表能看出StarRocks的FE主备最接近“开箱即用”但它的数据高可用依赖BE副本这意味着你必须为每张表显式设置replication_num3否则单BE宕机即丢数据Greenplum的架构最传统但gprecoverseg命令在Segment数量超过128个时经常因超时失败必须拆分成多个批次执行Doris的RAFT方案理论最强但实际中遇到过Follower FE因JVM GC停顿超过RAFT heartbeat timeout默认5秒而被踢出集群导致可用FE节点数跌破3个整个集群只读。所以选型没有银弹关键看你的团队能力栈如果熟悉PostgreSQL生态Greenplum的调试工具链gpcheckperf、gpssh更友好如果追求极致切换速度且能接受BE副本管理StarRocks是优选如果已有成熟的RAFT运维经验如用过TiDBDoris的平滑度更高。但无论选谁都必须记住MPP主备的稳定性70%取决于网络和存储的物理隔离30%取决于你对引擎内部同步机制的理解深度。3. 核心搭建步骤与关键参数详解3.1 环境准备那些被忽略的“基础但致命”的前置条件很多人栽在第一步——环境准备。不是没装JDK或没配SSH免密而是忽略了MPP对操作系统内核参数的严苛要求。以Greenplum为例其Segment进程大量使用epoll和mmap若内核参数未调优集群启动后会出现诡异的“部分Segment反复崩溃”。以下是必须逐项核验的5个关键点文件描述符限制MPP每个Segment进程默认打开数百个文件数据文件、WAL、临时文件ulimit -n必须设为65536以上。但仅仅改/etc/security/limits.conf不够还要在/etc/systemd/system.conf中添加DefaultLimitNOFILE65536并执行systemctl daemon-reload。某次线上事故就是因为systemd未重载导致gpstart启动时实际生效的仍是默认的1024。共享内存段大小kernel.shmmax必须大于单个Segment的最大内存配置如gpconfig -c shared_buffers -v 8GB。计算公式为shmmax ≥ (shared_buffers × segment_count) × 1.2。例如16个Segment每个8GB则shmmax至少设为16×8×1.2153.6GB即sysctl -w kernel.shmmax161061273600。TCP连接队列net.core.somaxconn必须≥5000。MPP主备间的心跳、WAL流、查询分发都走TCP连接队列过小会导致Connection refused错误。我们曾在线上看到ss -s输出中failed连接数持续增长根源就是somaxconn为128。NTP时间同步精度MPP集群所有节点时间差必须50ms。Greenplum的gpcheckcat工具会校验系统时间误差超限直接报错StarRocks的FE选举也依赖时间戳排序。必须禁用systemd-timesyncd改用chrony并配置makestep 1 -1强制校准。磁盘IO调度器SSD必须设为noneHDD设为deadline。cat /sys/block/nvme0n1/queue/scheduler应输出[none]。使用cfq或bfq会导致随机IO延迟波动剧烈影响WAL写入稳定性。注意这些参数必须在安装MPP软件前完成配置并通过reboot重启验证。不要试图在集群运行中动态修改sysctl -w的临时修改在gpstop -r后会失效。3.2 主节点初始化从gpinitsystem到gpstart的隐藏陷阱以Greenplum为例主节点初始化看似简单但gpinitsystem配置文件gpinitsystem_config里的几个参数直接决定后续主备同步的成败# gpinitsystem_config 关键参数解析 ARRAY_NAMEEMC Greenplum Data Platform # 仅显示用但必须与备节点一致 SEG_PREFIXgpseg # Segment命名前缀主备必须相同否则同步时找不到对应Segment PORT_BASE40000 # 主节点Master端口为PORT_BASESegment从PORT_BASE1开始递增 declare -a DATA_DIRECTORY(/data1/primary /data2/primary) # 主节点数据目录必须是绝对路径 MASTER_HOSTNAMEmdw # 主节点主机名必须能被所有Segment节点DNS解析 MASTER_DIRECTORY/data/master # Master数据目录备节点Standby Master必须用相同路径最容易踩坑的是DATA_DIRECTORY和MASTER_DIRECTORY。很多工程师为节省空间把Master数据目录和Segment数据目录混放在同一块盘这是大忌。Master目录包含pg_hba.conf、postgresql.conf、pg_log等关键配置和日志一旦Segment IO压力大导致磁盘满Master进程会因无法写日志而崩溃。必须为Master单独挂载一块SSD容量不低于200GB。另一个隐藏陷阱是gpinitsystem执行后的gpstart。它默认启动所有Segment但此时备节点尚未部署主节点的pg_hba.conf里没有允许备节点IP连接的规则。必须在gpstart前手动编辑$MASTER_DATA_DIRECTORY/pg_hba.conf添加host replication gpadmin 192.168.10.20/32 trust # 备节点IP host all gpadmin 192.68.10.20/32 md5然后执行gpstop -u重载配置。否则gpstart会成功但后续pg_basebackup时直接被拒。实操心得gpinitsystem完成后立即执行gpstate -e检查所有Segment状态再执行gpcheckcat -p校验系统表一致性。这两个命令耗时较长16节点集群约8分钟但能提前发现90%的初始化问题比等主备搭好再排查强十倍。3.3 备节点部署pg_basebackup不是终点而是同步校验的起点备节点部署的核心是pg_basebackup但它的参数选择直接影响同步质量# 正确的pg_basebackup命令在备节点执行 pg_basebackup -h mdw -p 5432 -U gpadmin \ -D /data/master \ -F p \ -X stream \ -P \ -R \ -l standby_init_$(date %Y%m%d) \ -S standby_master关键参数解读-F p生成纯文本格式备份便于后续pg_resetwal等工具操作-X stream同时备份WAL避免备份期间产生的WAL丢失-R自动生成standby.signal文件和recovery.confGP7为postgresql.auto.conf这是备节点启动的关键-S standby_master指定standby名称必须与pg_stat_replication视图中的application_name匹配否则主节点无法识别该备节点。但pg_basebackup只是起点。备份完成后必须进行三项强制校验目录结构一致性校验# 在主备节点分别执行对比输出 find $MASTER_DATA_DIRECTORY -type f -name *.dat | wc -l find /data/master -type f -name *.dat | wc -l两个数字必须完全相等。不等说明备份过程中有文件被跳过常见于权限不足或pg_basebackup被中断。WAL同步点校验-- 在主节点查询 SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS diff_bytes FROM pg_stat_replication WHERE application_name standby_master;初始值应为0。若为NULL说明备节点未连接若为大数10MB说明WAL流未正常启动。Segment镜像状态校验# 在主节点执行 gpstate -m # 检查所有mirror segment状态是否为Ready gpstate -s # 检查master和standby master状态是否为Active若gpstate -m显示某个mirror为Not Synchronized必须立即执行gprecoverseg -a而不是等它自动同步。提示pg_basebackup生成的备份目录必须用chown gpadmin:gpadmin -R /data/master修正权限。Greenplum对文件属主极其敏感属主错误会导致gpstart -a失败并报错could not open file global/pg_filenode.map。3.4 主备同步配置postgresql.conf里真正起作用的5个参数很多人以为改完pg_hba.conf就万事大吉其实postgresql.conf里的5个参数才是同步稳定性的命脉max_wal_senders 10最大WAL发送进程数。必须≥备节点数1预留一个给pg_basebackup。设为5会导致第二个备节点无法连接。wal_keep_segments 64保留的WAL段数。计算公式(日均WAL生成量GB ÷ 16MB) × 1.5。例如日均生成20GB WAL则20×1024÷16×1.5≈1920取整为2048。设太小会导致备节点WAL追赶不上进入streaming状态但replay_lsn停滞。archive_mode on必须开启归档。即使不用归档恢复archive_modeon会强制WAL文件在pg_wal目录中保留更久为备节点追赶留出缓冲时间。synchronous_commit remote_write同步提交级别。remote_write表示主节点等待WAL写入备节点OS缓存即返回平衡了性能和安全性。on等待备节点fsync会拖慢写入30%以上off则可能丢数据。track_commit_timestamp on开启提交时间戳跟踪。这是pg_stat_replication中write_lsn、flush_lsn、replay_lsn字段的基础关闭后无法监控同步延迟。修改后必须执行gpstop -u重载不能只pg_ctl reload。Greenplum的gpstop -u会向所有Segment广播配置变更而pg_ctl reload只作用于当前节点。实操心得每次修改postgresql.conf后用gpconfig -s parameter_name验证是否生效。曾有团队因gpstop -u执行失败但未检查返回值导致配置未同步到Segment主备同步延迟持续飙升却找不到原因。4. 故障切换实操与同步状态深度监控4.1 手动切换全流程从gpstop -m到业务验证的12个关键检查点真正的高可用不在于“能切”而在于“切得稳、切得准、切得可验证”。以下是以Greenplum为例的手动主备切换完整流程每个步骤都附带必须执行的验证动作步骤1主节点健康检查切前必做# 检查主节点自身状态 gpstate -s | grep Master instance # 确认状态为Active ps -ef | grep postgres:.*master | wc -l # 确认master进程存在 # 检查WAL同步延迟阈值500ms SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) AS delay_bytes FROM pg_stat_replication WHERE application_name standby_master;若delay_bytes 10485761MB暂停切换先执行gprecoverseg -a加速追赶。步骤2停止主节点gpstop -mgpstop -m -a # -m表示master-only模式-a跳过确认 # 验证ps -ef | grep postgres 应无master进程但segment进程仍在运行步骤3激活备节点gpactivatestandbygpactivatestandby -d /data/master -a # -d指定standby master数据目录 # 验证gpstate -s 应显示Standby master instance状态为Active步骤4重置主备关系关键# 在新主节点原备节点执行将原主节点降为备 gpinitstandby -s old-mdw -P 5432 -a # old-mdw为原主节点主机名 # 验证gpstate -s 应显示Standby master instance指向old-mdw步骤5业务连接切换修改应用连接字符串中的host为新主节点IP执行SELECT version();确认连接到新主运行一条简单INSERTSELECT验证读写通路。步骤6原主节点恢复为备最后一步# 在原主节点old-mdw执行 gpstop -a pg_basebackup -h new-mdw -p 5432 -U gpadmin -D /data/master -F p -X stream -P -R -S standby_master gpstart -a # 验证gpstate -s 显示Standby master instance状态为Active注意步骤4的gpinitstandby必须在步骤3后立即执行否则新主节点的pg_hba.conf中没有原主节点的连接规则导致步骤6的pg_basebackup失败。这是90%的切换失败案例的根源。4.2 同步状态监控超越gpstate的7个核心指标gpstate只能看状态真正的稳定性监控必须深入到WAL和元数据层面。以下是必须纳入Zabbix/Prometheus监控的7个黄金指标WAL同步延迟bytespg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)告警阈值5MB。WAL发送队列长度SELECT count(*) FROM pg_stat_replication WHERE state streaming AND pg_wal_lsn_diff(sent_lsn, write_lsn) 1048576大于0即告警。Segment镜像同步状态SELECT count(*) FROM gp_segment_configuration WHERE status dd表示down大于0即故障。Master进程存活数ps -ef | grep postgres:.*master | wc -l必须为1。WAL归档成功率SELECT count(*) FROM pg_stat_archiver WHERE last_failed_time IS NOT NULL AND last_failed_time now() - interval 1 hour大于0即告警。全局事务ID消耗速率SELECT max(age(datfrozenxid)) FROM pg_database超过1.5亿需紧急VACUUM FREEZE。元数据表膨胀率SELECT schemaname, tablename, n_tup_ins - n_tup_del as net_inserts FROM pg_stat_all_tables WHERE schemaname pg_catalog ORDER BY net_inserts DESC LIMIT 5若pg_depend或pg_shdepend的net_inserts持续增长说明DDL操作未清理依赖需VACUUM pg_catalog.pg_depend。实操心得我们用Python脚本每30秒采集这7个指标写入InfluxDB。当WAL同步延迟和Segment镜像同步状态同时告警时自动触发gprecoverseg -a当全局事务ID消耗速率告警时自动发送邮件并附带VACUUM FREEZE命令。这套机制将平均故障响应时间从47分钟缩短到92秒。4.3 常见问题速查表从现象到根因的精准定位现象可能根因快速验证命令解决方案gpstate -s显示Standby Master状态为Not InitializedStandby Master数据目录权限错误ls -ld /data/masterchown gpadmin:gpadmin -R /data/masterSELECT * FROM pg_stat_replication无记录主节点pg_hba.conf未允许备节点IPgrep standby $MASTER_DATA_DIRECTORY/pg_hba.conf添加host replication gpadmin standby_ip/32 trust执行gpstop -ugpstate -m显示Mirror Segment状态为Not Synchronized主节点WAL保留不足备节点追赶不上SELECT pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn) FROM pg_stat_replication增大wal_keep_segments执行gprecoverseg -a切换后新主节点拒绝写入报错database is in recovery moderecovery.conf未被正确删除ls -l $MASTER_DATA_DIRECTORY/recovery.conf删除该文件执行gpstop -rgprecoverseg执行超时报错timeout after 1800 secondsSegment数量过多需分批恢复gpstate -m | grep Not Synchronized | head -20用gprecoverseg -i seg_list_file指定20个Segment一批执行备节点启动后pg_stat_replication中state为startupstandby.signal文件缺失或损坏ls -l $STANDBY_DATA_DIRECTORY/standby.signal重新执行pg_basebackup -R生成gpcheckcat报错catalog inconsistency found初始化时gpinitsystem未校验系统表gpcheckcat -p执行gpcheckcat -p -f fix.sql生成修复脚本手动执行最后分享一个小技巧每次gprecoverseg执行前先用gpcheckperf -f hostfile -r ds -D /data1/primary测试所有Segment的磁盘IO性能。我们发现70%的gprecoverseg失败根源是某个Segment所在磁盘的%util持续100%IO队列深度50。此时强行恢复只会让问题恶化必须先更换磁盘。5. 运维加固与长期稳定性保障5.1 自动化切换脚本为什么“一键切换”必须包含人工确认环节自动化切换听起来很美但MPP主备的复杂性决定了它不能完全无人值守。我们的生产环境采用“半自动切换”脚本负责执行gpstop -m、gpactivatestandby、gpinitstandby等命令但每个步骤之间插入人工确认环节并强制要求输入当前主节点的pg_current_wal_lsn()值作为校验码。脚本核心逻辑如下#!/bin/bash # step1: 获取主节点LSN echo 请在主节点执行: SELECT pg_current_wal_lsn(); 并输入结果: read master_lsn echo 主节点LSN: $master_lsn # step2: 停止主节点 echo 正在停止主节点... gpstop -m -a if [ $? -ne 0 ]; then echo 主节点停止失败请检查! exit 1 fi # step3: 激活备节点 echo 正在激活备节点... gpactivatestandby -d /data/master -a if [ $? -ne 0 ]; then echo 备节点激活失败! exit 1 fi # step4: 人工确认新主节点LSN echo 请在新主节点执行: SELECT pg_current_wal_lsn(); 并输入结果: read new_master_lsn echo 新主节点LSN: $new_master_lsn # step5: 校验LSN连续性确保无WAL丢失 if [[ $new_master_lsn $master_lsn ]]; then echo 警告新主节点LSN小于原主节点可能存在WAL丢失 echo 请按CtrlC终止或输入continue强制继续: read confirm if [[ $confirm ! continue ]]; then exit 1 fi fi这个设计的价值在于它把“技术操作”和“业务决策”分开。脚本确保操作步骤零失误而人工确认环节迫使运维人员思考“此刻切换是否真的必要”、“业务是否有未提交事务”、“下游ETL是否在运行”。某次凌晨切换值班工程师在输入LSN时发现新主节点的LSN比主节点小立即中止流程最终定位到是备节点的archive_command配置错误导致部分WAL未归档。如果是一键全自动这次切换就会造成数据丢失。5.2 定期健康巡检清单每月必须执行的5项深度检查MPP主备的稳定性不是搭出来就一劳永逸的必须建立月度健康巡检机制。以下是经过3年线上验证的5项必检内容WAL归档完整性检查# 对比主节点pg_wal目录和归档目录的WAL文件数量 ls /data/master/pg_wal/ | grep ^[0-9A-F]{24}$ | wc -l ls /archive/wal/ | grep ^[0-9A-F]{24}$ | wc -l # 差值必须≤2否则执行pg_archivecleanup清理过期WALSegment磁盘空间水位检查# 检查所有Segment数据目录使用率 gpssh -f hostfile df -h /data1/primary \| awk {print \$5} \| tail -1 \| grep -E [8-9][0-9]% # 超过85%必须清理或扩容统计信息新鲜度检查-- 查询超过7天未analyze的表 SELECT schemaname, tablename, last_analyze FROM pg_stat_all_tables WHERE last_analyze now() - interval 7 days ORDER BY last_analyze LIMIT 10;对结果表执行ANALYZE table_name;。系统表膨胀检查-- 检查pg_attribute等核心系统表是否膨胀 SELECT nspname, relname, pg_size_pretty(pg_total_relation_size(C.oid)) as size FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid C.relnamespace) WHERE nspname IN (pg_catalog, information_schema) AND relkind IN (r, i) ORDER BY pg_total_relation_size(C.oid) DESC LIMIT 5;若pg_attribute大小500MB执行VACUUM pg_catalog.pg_attribute;。网络延迟基线检查# 测试主备节点间TCP延迟100次 gpssh -h mdw -h sdw ping -c 100 -W 1 192.168.10.20 \| tail -1 \| awk {print \$4} \| cut -d/ -f2 # 平均延迟应0.5ms标准差0.1ms提示将这5项检查写成Shell脚本加入crontab每月1日02:00执行并邮件发送报告。我们曾通过