psql:致命:无法从GTM获取事务ID.GTM可能已失败或丢失连接

Pra*_*h M 7 postgresql postgres-xl postgresql-9.5

我想创建一个postgres-xl集群.该集群包括5个节点,1个GTM,2个协调器和2个Datanode.以下是节点的详细信息

GTM:   
hostname=localhost  
nodename=gtm  
IP=127.0.0.1  
port=20001

Coordinator1?  
hostname=localhost  
nodename=coord1  
IP=127.0.0.1  
pooler_port=30011?port=30001  

Coordinator2?  
hostname=host2  
nodename=coord2  
IP=10.4.6.36  
pooler_port=30012?port=30002  

Datanode1?  
hostname=localhost  
nodename=dn1  
IP=127.0.0.1  
pooler_port=40011, port=40001  

Datanode2?  
hostname=host2  
nodename=dn2  
IP=10.4.6.36  
pooler_port=40012, port=40002
Run Code Online (Sandbox Code Playgroud)

我已经安装了pgxc_ctl并将/ usr/local/pgsql/bin添加PATH for postgres.我已配置ssh身份验证以避免输入pgxc_ctl的密码.我在两个节点上编辑了postgresql.conf和pg_hba.conf.

然后我按如下方式构建了集群:

$ pgxc_ctl
PGXC$  add gtm master gtm localhost 20001 $dataDirRoot/gtm    
PGXC$  add coordinator master coord1 localhost 30001 30011 
       $dataDirRoot/coord_master.1 none none
PGXC$  add coordinator master coord2 10.4.6.36 30002 30012 
       $dataDirRoot/coord_master.2 none none
Run Code Online (Sandbox Code Playgroud)

添加coord2后,我得到以下内容

psql:致命:无法从GTM获取事务ID.GTM可能已失败或丢失连接

PGXC$  add datanode master dn1 localhost 40001 40011 
       $dataDirRoot/dn_master.1 none none none
PGXC$  add datanode master dn2 10.4.6.36 40002 40012 
       $dataDirRoot/dn_master.2 none none none 
Run Code Online (Sandbox Code Playgroud)

添加dn2后,我收到以下错误

错误:无法获得池化连接提示:这可能是因为一个或多个节点当前无法访问,原因可能是节点或网络故障.目标节点也可能已经达到连接限制,或者池中的连接配置较低.请检查所有节点是否正常运行,还要检查max_connections和max_pool_size配置参数

但是,当我监控所有节点时,它会显示出来

PGXC$  monitor all
Running: gtm master
Running: coordinator master coord1
Running: coordinator master coord2
Running: datanode master dn1
Running: datanode master dn2 
Run Code Online (Sandbox Code Playgroud)

我无法通过运行连接到coord2

 psql -h 10.4.6.36 -p 30002 -U user -d postgres
Run Code Online (Sandbox Code Playgroud)

表明

psql:致命:无法从GTM获取事务ID.GTM可能已失败或丢失连接

但我可以通过运行连接到coord1

psql  -p 30001 -U user -d postgres 
Run Code Online (Sandbox Code Playgroud)

我可以在没有密码的情况下从我的localhost ping host2.我需要解决上述错误.有帮助吗?添加配置:

pgxcInstallDir=$HOME/pgxc
pgxcOwner=$USER     
pgxcUser=$pgxcOwner     
tmpDir=/tmp                 
localTmpDir=$tmpDir         
configBackup=n                  
configBackupHost=pgxc-linker    
configBackupDir=$HOME/pgxc      
configBackupFile=pgxc_ctl.bak   
dataDirRoot=$HOME/DATA/pgxl/nodes

#---- Coordinators ----------------------------------------------------------------------------------------------------

coordMasterDir=$dataDirRoot/coord_master
coordSlaveDir=$HOME/coord_slave
coordArchLogDir=$HOME/coord_archlog
coordExtraConfig=coordExtraConfig   
cat > $coordExtraConfig <<EOF
#================================================
# Added to all the coordinator postgresql.conf
# Original: $coordExtraConfig
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
listen_addresses = '*'
max_pool_size=300
max_connections=200
hot_standby = off
EOF

#---- Datanodes -------------------------------------------------------------------------------------------------------

datanodeMasterDir=$dataDirRoot/dn_master
datanodeSlaveDir=$dataDirRoot/dn_slave
datanodeArchLogDir=$dataDirRoot/datanode_archlog
datanodeExtraConfig=datanodeExtraConfig 
cat > $datanodeExtraConfig <<EOF
#================================================
# Added to all the datanode postgresql.conf
# Original: $datanodeExtraConfig
log_destination = 'stderr'
logging_collector = on
log_directory = 'pg_log'
listen_addresses = '*'
max_pool_size=300
max_connections=200
hot_standby = off
EOF
#---- GTM ------------------------------------------------------------------------------------      
gtmName=gtm
gtmMasterServer=localhost
gtmMasterPort=20001
gtmMasterDir=$dataDirRoot/gtm


coordNames=( coord1 coord2  )
coordMasterServers=( localhost 10.4.6.36  )
coordPorts=( 30001 30002  )
poolerPorts=( 30011 30012  )
coordMasterDirs=( $dataDirRoot/coord_master.1 $dataDirRoot/coord_master.2  )
coordMaxWALSenders=( 5 5  )
coordSlave=n
coordSlaveServers=( none none  )
coordSlavePorts=( none none  )
coordSlavePoolerPorts=( none none  )
coordSlaveDirs=( none none  )
coordArchLogDirs=( none none  )
coordSpecificExtraConfig=( coordExtraConfig coordExtraConfig  )
coordSpecificExtraPgHba=( none none  )


datanodeNames=( dn1 dn2  )
datanodeMasterServers=( localhost 10.4.6.36  )
datanodePorts=( 40001 40002  )
datanodePoolerPorts=( 40011 40012  )
datanodeMasterDirs=( $dataDirRoot/dn_master.1 $dataDirRoot/dn_master.2  )
datanodeMasterWALDirs=( none none  )
datanodeMaxWALSenders=( 5 5  )
datanodeSpecificExtraConfig=( datanodeExtraConfig datanodeExtraConfig  )
datanodeSpecificExtraPgHba=( none none  )
Run Code Online (Sandbox Code Playgroud)

tuk*_*kan 1

您能向我们展示您的配置吗?

max_connections你的和是什么max_pool_sizeinitdb你的内核显示了什么?我的猜测是,当您添加 datanode2 (dn2) 时,您没有足够的连接。

你有:

集群包括5个节点,1个GTM,2个Coordinator和2个Datanode。以下是节点的详细信息。

Postgres-xl 特定: max_pool_size=300 max_coordinators=2 max_datanodes=2

如果是协调器(最小设置): max_connections=100# 从应用程序接受的连接数 max_prepared_transactions = 100# 与连接数相同

如果是Datanode(最小设置): max_connections=200 # 2 个协调器 max_prepared_transactions=2#指定集群中至少有协调器总数。

摘自 Postgres(-xl) 文档

最大连接数(整数)

确定与数据库服务器的最大并发连接数。默认值通常为 100 个连接,但如果您的内核设置不支持它(在 initdb 期间确定),则可能会更少。该参数只能在服务器启动时设置。

当运行备用服务器时,必须将此参数设置为与主服务器上相同或更高的值。否则,备用服务器将不允许查询。

对于Coordinator来说,该参数决定每个 Coordinator 可以接受多少个连接。

在Datanode的情况下,每个 Datanode 的连接数量可能会变得与 max_connections 乘以协调器数量一样大。

最大池大小(整数)

指定Coordinator到Datanodes的最大连接池。由于每个事务都可以涉及所有 Datanode,因此该参数至少应为 max_connections 乘以 Datanode 数量。

编辑- 用于更新问题配置

尝试这个: