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

时间:2018-02-13 10:12:10

标签: postgresql postgresql-9.5 postgres-xl

我想创建一个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

我已安装 pgxc_ctl 并将 / usr / local / pgsql / bin 添加到 PATH 以获取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

添加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 

添加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 

我无法通过

连接到 coord2
 psql -h 10.4.6.36 -p 30002 -U user -d postgres

显示

  

psql:致命:无法从GTM获取交易ID。 GTM可能已失败或丢失连接

但是我可以通过运行

连接到 coord1
psql  -p 30001 -U user -d postgres 

我可以在没有密码的情况下从我的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  )

1 个答案:

答案 0 :(得分:1)

你能告诉我们你的配置吗?

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

你有:

  

集群包括5个节点,1个GTM,2个协调器和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)文档

max_connections(整数)

  

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

     

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

     

对于协调员,此参数确定每个协调员可以接受的连接数。

     

对于 Datanode ,每个Datanode的连接数可能会变得与max_connections一样大,再乘以数量   协调。

max_pool_size(整数)

  

指定协调器到Datanode的最大连接池。因为所有的交易都可以参与    Datanodes ,此参数至少应为max_connections   乘以Datanodes的数量。

修改 - 了解更新问题配置

试试这个:

  • 协调员

    max_connections=100
    max_pool_size=300
    
  • Datanode(您定义了2个数据节点)

    max_connections=200 
    max_pool_size=500