psql: FATAL: не удалось получить идентификатор транзакции из GTM. GTM мог потерпеть неудачу или потерял связь

Я хочу создать postgres-xl кластер. Кластер включает в себя 5 узлов, 1 GTM, 2 координатора и 2 Datanodes. Ниже приведены детали узлов

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

после добавления координаты я получил следующее

psql: FATAL: не удалось получить идентификатор транзакции из GTM. 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 

Я не мог подключиться к координатам, запустив

 psql -h 10.4.6.36 -p 30002 -U user -d postgres

Это показывает

psql: FATAL: не удалось получить идентификатор транзакции из GTM. GTM мог потерпеть неудачу или потерял связь

Но я мог подключиться к скоординированному

psql  -p 30001 -U user -d postgres 

Я мог бы пропинговать 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 ответ

Не могли бы вы показать нам свою конфигурацию?

Каковы ваши max_connections а также max_pool_size? Что сделал initdb показать для вашего ядра? Я предполагаю, что когда вы добавляете datanode2 (dn2), у вас недостаточно соединений.

У тебя есть:

Кластер включает в себя 5 узлов, 1 GTM, 2 координатора и 2 Datanodes. Ниже приведены подробности узлов.

Postgres-xl специфический: max_pool_size=300max_coordinators=2max_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 (целое число)

Укажите максимальный пул соединений Координатора с Датододами. Поскольку каждая транзакция может быть задействована всеми Датододами, этот параметр должен быть как минимум равным max_connections, умноженному на количество Датододов.

Редактировать - для обновления конфигурации вопроса

Попробуй это:

  • координатор

    max_connections=100
    max_pool_size=300
    
  • Datanode (у вас есть 2 определенных datanodes)

    max_connections=200 
    max_pool_size=500
    
Другие вопросы по тегам