PostgreSQL 9.3 Mater-Slave replika Auto failover funkcióval


PostgreSQL 9.3 Mater-Slave replika Auto failover funkcióval


(A leírásban a 192.168.1.100 Virtual IP.)

A leírás két host-os működést feltételez. A leírásban vázolt megoldás CentOS, RedHat, Opensuse és SLES esetén biztosan működik, Debian esetén sok változtatást igényel, főleg a Corosync resource-on.

A leírás SLES-re készült, CentOS/RedHat esetén a Zypper helyett Yum használatos a megfelelő kapcsolókkal.


Corosync (openais)

telepítés


Mindkét node-on:


zypper ar http://download.opensuse.org/repositories/Cloud:/OpenStack:/Master/SLE_11_SP3/Cloud:OpenStack:Master.repo
zypper ar http://download.opensuse.org/repositories/home:/microstep:/ha-clustering/SLE_11_SP3/home:microstep:ha-clustering.repo

zypper install cluster-glue corosync libcorosync4 libdlm libdlm3 libfreebl3 libglue2 libibverbs libopenais3 libpacemaker3 libqb0 librdmacm libsoftokn3 mozilla-nspr mozilla-nss openais openhpi openhpi-daemon pacemaker python python-curses resource-agents crmsh

Konfiguráció


Automatikus indulás beállítása

chkconfig openais on

A konfiguráció idejére érdemes leállítani:
rcopenais stop

/etc/corosync/corosync.conf módosítás :

bindnetaddr: 192.168.1.0
mcastaddr: 239.254.1.1
mcastport: 5405


Csak az egyik node-on:
corosync-keygen

Majd a generált kulcsot (/etc/corosync/authkey) másoljuk azonos jogosultsággal a másik host-ra.

A Corosync indítását követően (rcopenais start ) Mindkét node-nak Online állapotban kell lennie.

crm_mon

Szükség van egy olyan resource-ra, ami nem a rendszer része (http://clusterlabs.org/wiki/PgSQL_Replicated_Cluster)

cd /usr/lib/ocf/resource.d/heartbeat/
mv pgsql pgsqlori
wget https://raw.github.com/ClusterLabs/resource-agents/a6f4ddf76cb4bbc1b3df4c9b6632a6351b63c19e/heartbeat/pgsql
chmod 755 /usr/lib/ocf/resource.d/heartbeat/pgsql

Symlinkek a működéséhez (Fedora13-hoz készült, de a rendszerek között van változás, így igazítani kell rajta):

ln -s /usr/lib64 /usr/libexec
ln -s /usr/lib/ocf/lib/heartbeat /lib/heartbeat


A resource kézzel való futtatásakor további hibát jelezhet, amit az előzőhöz hasonlóan symlink létrehozásával lehet javítani.
Tesztelés:

./pgsql monitor

Crosync példa konfiguráció


Ez csak egy példa, nem szentírás. Forrás: http://clusterlabs.org/wiki/PgSQL_Replicated_Cluster#sample_settings_for_crm_command

primitive pgsql ocf:heartbeat:pgsql \
params pgctl="/usr/bin/pg_ctl" psql="/usr/bin/psql" pgdata="/var/lib/pgsql/data/" rep_mode="sync" node_list="masternode slavenode" restore_command="cp /var/lib/pgsql/archive/%f %p" pri
mary_conninfo_opt="keepalives_idle=60 keepalives_interval=5 keepalives_count=5" master_ip="192.168.1.100" restart_on_promote="true" repuser="replication" monitor_user="dbmon" monitor_password="PASSWORD" archive_cleanup_command="pg_archivecleanup /var/lib/pgsql/archive/ %r" \
op start timeout="60s" interval="0s" on-fail="restart" \
op monitor timeout="60s" interval="4s" on-fail="restart" \
op monitor timeout="60s" interval="3s" on-fail="restart" role="Master" \
op promote timeout="60s" interval="0s" on-fail="restart" \
op demote timeout="60s" interval="0s" on-fail="stop" \
op stop timeout="60s" interval="0s" on-fail="block" \
op notify timeout="60s" interval="0s"
primitive postgrescluster-db-vip ocf:heartbeat:IPaddr2 \
params ip="192.168.1.100" nic="eth0" cidr_netmask="24" \
op start interval="0s" on-fail="restart" timeout="60s" \
op monitor interval="10s" on-fail="restart" timeout="60s" \
op stop interval="0s" on-fail="block" timeout="60s" \
meta target-role="Started"
group master-group postgrescluster-db-vip
ms msPostgresql pgsql \
meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true" target-role="Started"
colocation colocation-master-group-msPostgresql-INFINITY inf: master-group:Started msPostgresql:Master
order order-msPostgresql-master-group-0 0: msPostgresql:demote master-group:stop symmetrical=false
order order-msPostgresql-master-group-INFINITY inf: msPostgresql:promote master-group:start symmetrical=false


Tűzfal konfiguráció


/etc/sysconfig/scripts/SuSEfirewall2-custom -ban a fw_custom_before_antispoofing részben:
iptables -A INPUT -j ACCEPT -s 192.168.1.0/24 -p udp --dport 5405

/etc/sysconfig/SuSEfirewall2 fájlban:

FW_SERVICES_EXT_TCP="22 5432"
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"


PostgreSQL 9.3


Telepítés

zypper ar http://download.opensuse.org/repositories/server:/database:/postgresql/SLE_11_SP3/server:database:postgresql.repo
zypper install postgresql-init postgresql93 postgresql93-server postgresql-contrib


PostgreSQL alapkonfiguráció:

Csak a Master-en

CREATE ROLE replication WITH REPLICATION PASSWORD 'PASSWORD' LOGIN;
CREATE ROLE dbmon WITH PASSWORD 'PASSWORD' LOGIN;

Mindkét node-on

echo "kernel.shmmax = 95000000" >> /etc/sysctl.conf
mkdir /var/lib/pgsql/archive
chown postgres /var/lib/pgsql/archive
A /var/lib/pgsql/.pgpass-ba:
192.168.1.100:5432:*:replication:PASSWORD
mkdir /var/lib/pgsql/tmp
mkdir var/run/postgresql/
chown postgres /var/run/postgresql/

Postgres felhasználó kulcs authentikációval tudjon egymáshoz sshzni.
Ssh-keygen...
ssh-copy-id ….

Automatikus indulás bekapcsolása:

chkconfig postgresql on


Csak a slave-en

/etc/init.d/postgresql stop
rm -rf /var/lib/pgsql/data/

A korábban létrehozott ssh kapcsolatot felhasználva szinkronizálni kell az adokat:

rsync -vaurxH --delete masternode:~/data/ ~/data/
rsync -vaurxH --delete masternode:~/archive/ ~/archibe/
chown postgres: -R /var/lib/pgsql/


A pg_hba.conf, postgresql.conf és recovery.conf meglétét ellenőrizni kell, mivel az rsync megváltoztathatta!
Példa recovery.conf:
standby_mode = 'on'
primary_conninfo = 'host=192.168.1.100 port=5432 user=replication application_name=slavenode keepalives_idle=60 keepalives_interval=5 keepalives_count=5'
restore_command = 'cp /var/lib/pgsql/archive/%f %p'
recovery_target_timeline = 'latest'
archive_cleanup_command = 'pg_archivecleanup /var/lib/pgsql/archive/ %r'

Ide nem kell jelszót írni, mivel a .pgpass fájlban definiáltuk a replikációhoz szükséges jogosultságokat.


SSL a PostgreSQL-be - opcionális


groupadd -r sslusers
usermod -G sslusers postgres
chown root:sslusers -R /etc/ssl/private/
chmod 750 /etc/ssl/private/
chmod 440 /etc/ssl/private/cert.key.pem


Mivel induláskor ellenőrzi, hogy milyen jogosultságok vannak a privát kulcson, és a csoportnak adtunk jogosultságot, ezért symlink-kel be kell csapni, különben a PostgreSQL leáll:

ln -s /etc/ssl/private/prod01..local.key.pem /etc/ssl/private/cert.key.pem.link
chmod 400 /etc/ssl/private/cert.key.pem.link
chown postgres /etc/ssl/private/cert.key.pem.link


Ahhoz, hogy a PostgreSQL SSL-lel védett csatornán keresztül kommunkikáljon, a pg_hba.conf-ba a távoli hostokra vonatkozó kapcsolatokat hostssl kezdetű sorral kell konfigurálni:

host all all 127.0.0.1/32 trust
hostssl replication replication 192.168.1.0/24 md5
hostssl all all 192.168.1.0/24 md5


Tesztelés

#psql -h 192.168.1.100 -p5432 -U dbmon -d postgres
Password for user dbmon:
psql (9.3.5)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.
postgres=>


Indítás, Újraindítás menete

rcopenais start először a master, majd a slave node-on.

Az aktuális állapotról jó áttekintést ad a következő:

# crm_mon -Afrn -1
Last updated: Wed Nov 10 14:00:24 2014
Last change: Wed Nov 10 12:18:51 2014 by root via crm_attribute on masternode
Stack: classic openais (with plugin)
Current DC: masternode - partition with quorum
Version: 1.1.9-2db99f1
2 Nodes configured, 2 expected votes
3 Resources configured.


Node masternode: online
pgsql:0 (ocf::heartbeat:pgsql): Master
prod-db-vip (ocf::heartbeat:IPaddr2): Started
Node slavenode: online
pgsql:1 (ocf::heartbeat:pgsql): Started

Inactive resources:


Node Attributes:
* Node masternode:
+ master-pgsql : 1000
+ pgsql-data-status : LATEST
+ pgsql-master-baseline : 0000000051000090
+ pgsql-status : PRI
* Node slavenode:
+ master-pgsql : 100
+ pgsql-data-status : STREAMING|SYNC
+ pgsql-status : HS:sync

Migration summary:
* Node masternode:
* Node slavenode:


Ha újra kell indítani a node-okat, akkor figyelni kell rá, hogy először a slave-et állítsuk le és először a master-t indítsuk el. Célszerű alaphelyzetben a masternodeet Master-ként kezelni.

Jellemző hibák és kezelésük

pgsql-status STOP

Ha valamelyik node-on a pgsql-status STOP, akkor a Corosync leállította ott a PostgreSQL-t.
Javítása
A /var/lib/pgsql/tmp/PGSQL.lock fájlt törölni kell, ha létezik, különben nem indul el.
crm resource cleanup msPostgresql hatására a recovery.conf-ot létrehozza - ha nem létezik - a /var/lib/pgsql/data alatt, ezzel slave-vé változtatja

WARNING: My data is out-of-date


Az alábbi probléma akkor áll fenn, ha a slave hosszú időre elveszíti a master-rel a kapcsolatot.
Slave-en /var/log/messages-ben: WARNING: My data is out-of-date. status : DISCONNECT

Javítása
  • Slave-en postgres stop
  • postgres-ként rsync -vau --delete [MASTER]:~/= data/ ~/data/
  • postgres-ként rsync -vau --delete [MASTER]:~/= archive/ ~/archive/
  • Slave-en postgres start
  • crm resource cleanup msPostgresql

FATAL: could not receive data from WAL stream: ERROR: requested starting point 0/3E000001 is ahead of the WAL flush position of this server 0/3D0000F8

Javítása
  • rcopenais stop
  • rcpostgresql start mindkét node-on. Ezzel elérjük, hogy az adatábázisok futnak, de a Corosync nem zavar be.
  • Ki kell deríteni, hogy melyik node-on van több adat (SELECT pg_current_xlog_location(); )
  • Amelyik előrébb jár a log-ban, valószínűleg azon van több adat, így a másikat hozzá kell igazítani.
  • Amelyikre szinkronizáljuk az adatot, azt le kell állítani, majd a data és archive könyvtárat rsync-kel másolni:
    • postgres-ként rsync -vau --delete [MASTER]:~/data/ ~/data/
    • postgres-ként rsync -vau --delete [MASTER]:~/archive/ ~/archive/
  • A postgresql.conf, pg_hba.conf és recovery.conf legyen beállítva a Slave-nek kinevezett gépen
  • A recovery.conf legyen letörölve a Masternek jelölt gépen
  • A /var/lib/pgsql/tmp/PGSQL.lock a slave-en legyen letörölve
  • Előszőr hozzuk helyre a szinkront a Corosync nélkül. Ehhez szükség lehet a VIP cím kézzel valő felvételére a master-en (vagy a recovery.conf-ban az IPt át kell írni.)
  • Ha az adatok szinkronizálása befejeződött, akkor
    • Slave postgresql stop
    • Master postgresql stop
    • Master-en a VIP cím levétele
    • Master-en a rcopenais start - el fogja indítani a PostgreS= QL-t ha mindent rendben lát.
    • Slave-en rcopenais start

Bár a konfigurációja nem túl egyszerű, de egy stabilan, megbízhatóan működő PostgreSQL adatbázis szolgáltatás hozható vele létre. Véleményeket, tapasztalatokat szívesen látok a kommentek között :-)


Kulcsszavak: Linux, PostgreSQL 9.3, HA, Auto failover, Database, High Availability

Új hozzászólás: