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=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 (целое число)
Укажите максимальный пул соединений Координатора с Датододами. Поскольку каждая транзакция может быть задействована всеми Датододами, этот параметр должен быть как минимум равным max_connections, умноженному на количество Датододов.
Редактировать - для обновления конфигурации вопроса
Попробуй это:
координатор
max_connections=100 max_pool_size=300
Datanode (у вас есть 2 определенных datanodes)
max_connections=200 max_pool_size=500