7

我想创建一个postgres-xl集群。该集群包括 5 个节点、1 个 GTM、2 个 Coordinator 和 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添加到postgres的PATH中。我已配置 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 

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

1 回答 1

1

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

你的max_connections和是max_pool_size什么?你initdb的内核展示了什么?我的猜测是,当您添加 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 coordinators max_prepared_transactions=2#指定集群中的至少 Coordinators 总数。

摘自 Postgres(-xl) 文档

最大连接数(整数)

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

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

对于Coordinator,此参数确定每个 Coordinator 可以接受多少个连接。

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

最大池大小(整数)

指定 Coordinator 到 Datanodes 的最大连接池。因为每个事务可以被所有 Datanodes参与,所以这个参数至少应该是 max_connections 乘以 Datanodes 的数量。

编辑- 用于更新问题配置

尝试这个:

  • 协调员

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

    max_connections=200 
    max_pool_size=500
    
于 2018-02-22T08:53:40.067 回答