8. pgpool installieren und konfigurieren
Installationsplanung:
pgpool ist für die folgende Organisation von PostgreSQL zuständig:
Weiterleitung von Schreibdatenverkehr des Client (ThingWorx) an den PostgreSQL-Masterknoten
Weiterleitung von Lesedatenverkehr des Client an den PostgreSQL-Standby-Knoten
Verwaltung aller PostgreSQL-Knoten während verschiedener Failover-Szenarios
Daher ist es wichtig, eine Vertrauensbeziehung zwischen pgpool-II-Knoten und PostgreSQL-Knoten herzustellen.
In diesem Beispiel sieht der Ansatz zum Einrichten der Vertrauensbeziehung folgendermaßen aus:
Installieren Sie die PostgreSQL-Komponente im pgpool-Knoten. Der Benutzer "postgres" wird ebenfalls erstellt.
Richten Sie für den Benutzer "postgres" dasselbe Passwort für alle Knoten ein: pgpool-Masterknoten, sekundärer pgpool-Knoten, postgresql node0, postgresql node1 und postgresql node2.
Erstellen Sie den SSH-Schlüssel auf dem pgpool-Masterknoten, und stellen Sie den öffentlichen Schlüssel für alle Knoten bereit.
Stellen Sie den privaten Schlüssel auch auf dem pgpool-Standby-Knoten bereit.
Richten Sie eine Vertrauensbeziehung für den Benutzer "postgres" auf allen Knoten ein.
Wichtige Schritte zum Erreichen der obigen Vertrauenswürdigkeit:
ssh-keygen, um idrsa und idrsa.pub auf pgpool-Masterknoten für Benutzer "postgres" zu generieren.
Kopieren Sie den Inhalt von idrsa.pub in ~/.ssh/authorizedkeys des Benutzers "postgres" auf allen Knoten.
chmod 700 ~/.ssh auf allen Knoten für den Benutzer postgres.
vim/etc/ssh/sshd_config mit folgendem Inhalt:
PermitEmptyPasswords yes
PasswordAuthentication yes
Ändern Sie das postgres-Benutzerpasswort auf allen Knoten auf denselben Wert.
Testen Sie ssh postgres@remote_IP, um sicherzustellen, dass sich alle pgpool-II-Knoten mit dem SSH-Schlüssel bei allen PostgreSQL-Knoten authentifizieren können.
Installation von pgpool
Auf RHEL kann pgpool mit den folgenden Befehlen installiert werden:
sudo rpm -ivh http://www.pgpool.net/yum/rpms/3.6/redhat/rhel-6-x86_64/pgpool-II-release-3.6-1.noarch.rpm
sudo yum -y install pgpool-II-pg94
sudo yum -y install pgpool-II-pg94-debuginfo
sudo yum -y install pgpool-II-pg94-devel
sudo yum -y install pgpool-II-pg94-extensions
sudo yum -y install postgresql-contrib
Konfiguration von pgpool
Führen Sie diese Schritte für jeden pgpool-II-Knoten aus.
Schritt 1
Aktualisieren Sie pgpool.conf.
Melden Sie sich als Benutzer "pgpool" an.
Bearbeiten Sie pgpool.conf:
vim /etc/pgpool-II/pgpool.conf
mit folgendem Inhalt:
Serverknoten
Konfigurationselement
Konfigurationswert
Knoten
1
listen_address
*
Je nach Sicherheitsanforderung können Sie dies in eine bestimmte IP-Adresse ändern.
2
port
5432
3
pcp_listen_addresses
*
Je nach Sicherheitsanforderung können Sie dies in eine bestimmte IP-Adresse ändern.
4
pcp_port
9898
5
backend_hostname0
'10.91.9.200'
6
backend_port0
5432
7
backend_weight0
1
8
backend_data_directory0
'/db/postgres'
9
backend_flag0
ALLOWTOFAILOVER
10
backend_hostname1
'10.91.9.24'
11
backend_port1
5432
12
backend_weight1
1
13
backend_data_directory1
'/db/postgres'
14
backend_flag1
'ALLOWTOFAILOVER'
15
backend_hostname2
'10.91.9.41'
16
backend_port2
5432
17
backend_weight2
1
18
backend_data_directory2
'/db/postgres'
19
enable_pool_hba
on
20
master_slave_mode
on
21
master_slave_sub_mode
'stream'
22
sr_check_period
10
23
sr_check_user
'replicator'
24
sr_check_password
'replicator'
25
sr_check_database
'postgres'
26
health_check_user
'postgres'
27
health_check_password
'postgres'
28
health_check_database
'postgres'
29
failover_command
'/etc/pgpool-II/failover.sh %d %h %D %m %H %R %M %P'
* 
Parameter für Watchdog-Konfiguration sind in diesem Beispiel noch nicht enthalten.
Schritt 2
Erstellen Sie das Failover-Skript
vim /etc/pgpool-II/failover.sh
mit dem folgenden Inhalt:
#!/bin/bash -x
echo ------------------------Begin failover------------------------
#------------------------------------
# Inputs
#------------------------------------
FAILED_NODEID=$1 # %d = node id
FAILED_HOSTNAME=$2 # %h = hostname
FAILED_DBPATH=$3 # %D = database cluster path
NEW_MASTER_NODEID=$4
NEW_MASTER_HOSTNAME=$5
NEW_MASTER_DBPATH=$6
OLD_MASTER_NODEID=$7
OLD_PRIMARY_NODEID=$8
# %m = new master node id
# %H = new master host name
# %R = new master database cluster path
# %M = old master node id
# %P = old primary node id
#------------------------
# Nodes
#------------------------
PGDATA=/db/postgres
PGBIN=/usr/pgsql-10.x/bin
LOCALBIN=/db/bin
NODE0_HOSTNAME=10.91.9.200
NODE0_ARCHIVE=/db/node0archive
NODE1_HOSTNAME=10.91.9.24
NODE1_ARCHIVE=/db/node1archive
NODE2_HOSTNAME=10.91.9.41
NODE2_ARCHIVE=/db/node2archive
if [ $FAILED_NODEID = $OLD_PRIMARY_NODEID ]; then

if ssh -T postgres@$NEW_MASTER_HOSTNAME grep -q "$FAILED_HOSTNAME" /db/postgres/recovery.conf; then
#yes, it is, go ahead to promote
echo Node $NEW_MASTER_HOSTNAME can be promoted safely
else
#otherwise, new master has to be switched.
if [ $FAILED_NODEID = 1 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
NEW_MASTER_HOSTNAME=$NODE2_HOSTNAME
NEW_MASTER_NODEID=2
else
NEW_MASTER_HOSTNAME=$NODE0_HOSTNAME
NEW_MASTER_NODEID=0
fi;
fi;
if [ $FAILED_NODEID = 2 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
NEW_MASTER_HOSTNAME=$NODE1_HOSTNAME
NEW_MASTER_NODEID=1
else
NEW_MASTER_HOSTNAME=$NODE0_HOSTNAME
NEW_MASTER_NODEID=0
fi;
fi;
if [ $FAILED_NODEID = 0 ]; then
if [ $NEW_MASTER_NODEID = 1 ]; then
NEW_MASTER_HOSTNAME=$NODE2_HOSTNAME
NEW_MASTER_NODEID=2
else
NEW_MASTER_HOSTNAME=$NODE1_HOSTNAME
NEW_MASTER_NODEID=1
fi;
fi;

echo New master has been switched to $NEW_MASTER_HOSTNAME
fi;

TARGET_HOSTNAME=0.0.0.0
TARGET_ARCHIVE=/db/archive
STANDBY1_HOSTNAME_TO_RETARGET=0.0.0.0
if [ $FAILED_NODEID = 0 ]; then
if [ $NEW_MASTER_NODEID = 1 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node1archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE2_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node2archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE1_HOSTNAME
fi;
fi;
if [ $FAILED_NODEID = 1 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node0archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE2_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node2archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE0_HOSTNAME
fi;
fi;
if [ $FAILED_NODEID = 2 ]; then
if [ $NEW_MASTER_NODEID = 0 ]; then
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node0archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE1_HOSTNAME
else
TARGET_HOSTNAME=$NEW_MASTER_HOSTNAME
TARGET_ARCHIVE=/db/node1archive
STANDBY1_HOSTNAME_TO_RETARGET=$NODE0_HOSTNAME
fi;
fi;

ssh -T postgres@$NEW_MASTER_HOSTNAME $PGBIN/pg_ctl promote -D $PGDATA
ssh -T postgres@$STANDBY1_HOSTNAME_TO_RETARGET $LOCALBIN/retargetMaster.sh $TARGET_HOSTNAME $TARGET_ARCHIVE

exit 0;
else
TARGET_HOSTNAME=0.0.0.0
TARGET_ARCHIVE=/db/archive
NEW_STANDBY_HOSTNAME=0.0.0.0
if [ $OLD_PRIMARY_NODEID = 0 ]; then
TARGET_HOSTNAME=$NODE0_HOSTNAME
TARGET_ARCHIVE=$NODE0_ARCHIVE
if [ $FAILED_NODEID = 1 ]; then
NEW_STANDBY_HOSTNAME=$NODE2_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE1_HOSTNAME
fi
fi;
if [ $OLD_PRIMARY_NODEID = 1 ]; then
TARGET_HOSTNAME=$NODE1_HOSTNAME
TARGET_ARCHIVE=$NODE1_ARCHIVE
if [ $FAILED_NODEID = 2 ]; then
NEW_STANDBY_HOSTNAME=$NODE0_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE2_HOSTNAME
fi
fi;
if [ $OLD_PRIMARY_NODEID = 2 ]; then
TARGET_HOSTNAME=$NODE2_HOSTNAME
TARGET_ARCHIVE=$NODE2_ARCHIVE
if [ $FAILED_NODEID = 0 ]; then
NEW_STANDBY_HOSTNAME=$NODE1_HOSTNAME
else
NEW_STANDBY_HOSTNAME=$NODE0_HOSTNAME
fi
fi;

ssh -T postgres@$NEW_STANDBY_HOSTNAME $LOCALBIN/retargetMaster.sh $TARGET_HOSTNAME $TARGET_ARCHIVE
exit 0;
fi;
echo 'Did not complete failover'
echo -------------------End failover---------------
exit 0;
Machen Sie das Skript ausführbar:
chmod a+x /etc/pgpool-II/failover.sh
Schritt 3
Aktualisieren Sie pcp.conf.
vim /etc/pgpool-II/pcp.conf
mit dem folgenden Inhalt:
# Lines beginning with '#' (pound) are comments and will
# be ignored. Again, no spaces or tabs allowed before '#'.postgres:e8a48653851e28c69d0506508fb27fc5
# USERID:MD5PASSWD
Das Standardpasswort für PostgreSQL ist "postgres", daher sollten Sie es aktualisieren.
Schritt 4
Aktualisieren Sie pool_hba.conf.
vim /etc/pgpool-II/pool_hba.conf
mit dem folgenden Inhalt:
# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 10.91.0.0/16 trust
Sie können ihn basierend auf Ihren Sicherheitsanforderungen anpassen.
War dies hilfreich?