ããã«ã¡ã¯ãhabrozhitelïŒ
ãã®èšäºã§ã¯ãPostgreSQL DBMSã«ãã¹ã¿ãŒã¹ã¬ãŒãã¯ã©ã¹ã¿ãŒãå±éããçµéšãå
±æããããšæããŸãã ãã©ãŒã«ããã¬ã©ã³ã¹ã¯ãpgpool-IIã®æ©èœïŒãã§ãŒã«ãªãŒããŒããªã³ã©ã€ã³ãªã«ããªïŒã䜿çšããŠå®çŸãããŸãã
pgpoolã¯ãµãŒããŒéã®ã¹ã±ãŒãªã³ã°ãšè² è·åæ£ã®ããã®åªããããŒã«ã§ããããã¹ã¿ãŒã«é害ãçºçãããšãã«ã¹ã¬ãŒããµãŒããŒã«ãã§ãŒã«ãªãŒããŒãèªåçã«äœæããå¯èœæ§ãšãã¯ã©ã¹ã¿ãŒå
šäœãã·ã£ããããŠã³ããã«æ¢ã«å®è¡äžã®ã¯ã©ã¹ã¿ãŒã«æ°ãã黿ºã远å ããæ¹æ³ã«ã€ããŠç¥ã£ãŠãã人ã¯å°ãªããšæããŸãã
ã¯ã©ã¹ã¿å³ãšãã·ã³èŠä»¶
å³ã¯ããã¹ã¿ãŒ/ã¹ã¬ãŒãã¯ã©ã¹ã¿ãŒã®äžè¬çãªå³ã瀺ããŠããŸãã

ã¯ã©ã¹ã¿ãŒã«ã¯ã1ã€ã®ãã¹ã¿ãŒãµãŒããŒïŒãã¹ã¿ãŒïŒãå°ãªããšã1ã€ã®ã¹ã¬ãŒãïŒã¹ã¬ãŒãïŒã1ã€ã®ã¹ã±ãŒãªã³ã°ããŒãïŒãã©ã³ãµãŒïŒãå«ãŸããŠããå¿
èŠããããŸãã
Linuxãã£ã¹ããªãã¥ãŒã·ã§ã³ãåãµãŒããŒã«ã€ã³ã¹ããŒã«ããå¿
èŠãããå ŽåïŒRed Hat 6.1ãã€ã³ã¹ããŒã«ããŠããŸãïŒãgccã³ã³ãã€ã©ãŒãã¹ã±ãŒãªã³ã°ããŒãã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
PostgreSQLããŒãžã§ã³ã¯9.0.1ãpgpool-II 3.0.5ã§ãã DBMSããã³pgpoolã®ä»ã®ããŒãžã§ã³ã䜿çšã§ããŸãã ãã®å Žåãããã¥ã¡ã³ããåç
§ããŠãã ããã
ã¯ã©ã¹ã¿ãµãŒããŒéã®ãªã¢ãŒãæ¥ç¶ã®ã»ããã¢ãã
ãªã³ã©ã€ã³å埩ãšãã§ã€ã«ãªãŒããŒã§ã¯ããã¹ã¯ãŒããªãã§SSHçµç±ã§ãªã¢ãŒãæ¥ç¶ãèšå®ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ã
postgres
ãŠãŒã¶ãŒã®SSHããŒãäœæããããããåãµãŒããŒã®
postgres
ãŠãŒã¶ãŒã«éä¿¡ããŸãã
éèŠãªãã€ã³ãïŒ ãªã³ã©ã€ã³ãªã«ããªã®å Žåããªã¢ãŒãã»ãã·ã§ã³ãéãããšãã«ãå¥ã®ãªã¢ãŒãã»ãã·ã§ã³ã«ç§»åã§ããå¿
èŠããããŸãïŒã€ãŸãããã¹ã¯ãŒããªãã§æ¬¡ã®SSHç§»è¡ã¡ã«ããºã ãå®è£
ã§ããŸãïŒã¹ã±ãŒãªã³ã°ããŒã-ãã¹ã¿ãŒãµãŒããŒ-ã¹ã¬ãŒããµãŒããŒããã³ã¹ã±ãŒãªã³ã°ããŒã-ã¹ã¬ãŒããµãŒããŒ-ãã¹ã¿ãŒãµãŒããŒïŒã
ãã§ãŒã«ãªãŒããŒã®å Žåãã¹ã±ãŒã«ããŒãã§
root
ãŠãŒã¶ãŒSSHããŒãäœæãããã¹ã¿ãŒãµãŒããŒãšã¹ã¬ãŒããµãŒããŒã
postgres
ãŠãŒã¶ãŒã«è»¢éããå¿
èŠããããŸãã
ãã®æé ã¯èšå®æã«éèŠãªã®ã§ããªã¢ãŒãã»ãã·ã§ã³ãã1ã€ã®ãµãŒããŒãå¥ã®ãµãŒããŒã«æ¥ç¶ã§ããããšã確èªããŠãã ããã
ã¹ããªãŒãã³ã°ã¬ããªã±ãŒã·ã§ã³ãæ§æãã
ãŸããiptablesã®ããŒã5432ïŒæšæºã®PostgreSQLããŒãïŒã§ããŒã¿ã®åä¿¡/éä¿¡ãéãå¿
èŠããããŸãã
ãã¹ã¿ãŒãµãŒããŒã®æ§æãã¡ã€ã«
$PGDATA/postgresql.conf
次ã®ããã«ç·šéããŸãã
listen_addresses = '*' wal_level = hot_standby max_wal_senders = 2 wal_keep_segments = 32
æåŸã®è¡ã®éèŠæ§ã«æ³šæããŸãã å®éã«ã¯ãã¹ã¬ãŒãããŒãã®å埩ã¹ã¯ãªããã§äœ¿çšããããããäžèšã®ããã«å€æŽããå¿
èŠããããŸãã
次ã«ãã¬ããªã±ãŒã·ã§ã³è¡ã
$PGDATA/pg_hba.conf
ã«è¿œå ã
$PGDATA/pg_hba.conf
ã
host replication postgres 192.168.100.2/32 trust host replication postgres 192.168.100.3/32 trust
postgresã¯ãã¬ããªã±ãŒã·ã§ã³ããã®ä»ã®ç®¡çããªãã¯ãè¡ãããŒã¿ããŒã¹ç®¡çè
ã§ãã ãããã®è¡ã䜿çšããŠãã¹ã¬ãŒããµãŒããŒãšãã¹ã¿ãŒãµãŒããŒã®äž¡æ¹ã®ã¬ããªã±ãŒã·ã§ã³ãèš±å¯ããŸããã
次ã«ãäž»èŠãªãµãŒããŒãåèµ·åããŸãã
ã¹ã¬ãŒããµãŒããŒã忢ããŸãïŒä»¥åã«èµ·åããå ŽåïŒïŒ
ããã§ãã¬ããªã±ãŒã·ã§ã³ãéå§ã§ããŸãã
ãã¹ã¿ãŒãµãŒããŒã§ã
postgres
ãŠãŒã¶ãŒ
postgres
ããã¯ã¢ããããŒã¿ããŒã¹ã
postgres
ãããã¹ã¬ãŒããµãŒããŒã«éä¿¡ããŸãã
$ psql -c "SELECT pg_start_backup('stream');" $ rsync -a /var/lib/pgsql/data/ 192.168.100.3:/var/lib/pgsql/data/ --exclude postmaster.pid $ psql -c "SELECT pg_stop_backup();"
ãã®åŸã
ã¹ã¬ãŒãäžã§ãã¬ããªã±ãŒã·ã§ã³æ§æ
$PGDATA/recovery.conf
ãäœæããŸãã
standby_mode = 'on' primary_conninfo = 'host=192.168.100.2 port=5432 user=postgres' trigger_file = 'failover'
trigger_file
ãã©ã¡ãŒã¿ãŒã¯ãPostgreSQLããã¹ã¿ãŒã¢ãŒãã«åãæ¿ãããã¡ã€ã«ãæ€çŽ¢ãããã¹ãæ
åœããŸãã ãã®å ŽåãPostgreSQLã¯ãã¹
$PGDATA/failover
ãã¡ã€ã«ãæ€çŽ¢ã
$PGDATA/failover
ã
次ã«ãã¹ã¬ãŒããµãŒããŒã§ããããã¹ã¿ã³ãã€ããæå¹ã«ããå¿
èŠããããŸãã
$ sed -i 's/#hot_standby = on/hot_standby = on/' /var/lib/pgsql/data/postgresql.conf
次ã«ãã¹ã¬ãŒããµãŒããŒãèµ·åããå¿
èŠããããŸãã
è€è£œã¢ã¯ãã£ããã£ã¯æ¬¡ã®ããã«ç¢ºèªã§ããŸãã
ãã¹ã¿ãŒãµãŒããŒã§ã次ã®ã³ãã³ããå®è¡ããŸã
$ ps aux | grep sender
次ã®ããã«åºåãããŸãïŒ
2561 ? Ss 0:00 postgres: wal sender process postgres 192.168.100.3(33341) streaming 0/2031D28
åæ§ã«ãã¹ã¬ãŒããµãŒããŒäžã§ïŒ
$ ps aux | grep receiver
圌女ã¯ä»¥äžãäžããŸãïŒ
1524 ? Ss 0:00 postgres: wal reciever process streaming 0/2031D28
ãºãŒã ããŒãã®äžè¬çãªæ§æ
èšå®ãã¡ã€ã«
/etc/pgpool-II/pgpool.conf
倿ŽããŸãã
ããã«
/etc/pgpool-II/pool_hba.conf
ãã¯ã©ã€ã¢ã³ãèªèšŒã«é¢ããæ
å ±
/etc/pgpool-II/pool_hba.conf
远å ããŸãã
host all all 127.0.0.1/32 trust host all all 192.168.100.2/32 trust host all all 192.168.100.3/32 trust
pgpoolãåèµ·åããŸãã
èªåãã§ãŒã«ãªãŒããŒãæ§æãã
èªåãã§ãŒã«ãªãŒããŒãäœæããã¡ã«ããºã ã¯æ¬¡ã®ãšããã§ãã
- 皌åäžã®ïŒãã¹ã¿ãŒããã³ã¹ã¬ãŒãïŒãµãŒããŒã§ã¯ã
pgpool-walrecrunning()
ããã·ãŒãžã£ãå®è¡ãããã©ã®ãµãŒããŒããã¹ã¿ãŒã§ãããã©ã®ã¹ã¬ãŒãã§ããããæ±ºå®ãããŸãã - pgpoolã¯æ¬çªãµãŒããŒã«ãªã¢ãŒãã§æ¥ç¶ããDBMSããã»ã¹ã®ã¢ã¯ãã£ããã£ããã§ãã¯ããŸãã ããã§ãªãå Žåãpgpoolã¯ããã¹ã¿ãŒãµãŒããŒã«é害ãçºçããå Žåã«ã¹ã¬ãŒãã§ãã§ãŒã«ãªãŒããŒãäœæããã¹ã¯ãªãããåŒã³åºããŸãã
- ãã®åŸãpgpoolã¯èœã¡ããã¹ãããåæããæ¥ç¶ãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãåèµ·åããŸãã
ãããŠä»ãèšå®ïŒ
ã¹ã±ãŒã«ããŒãã§ã
/etc/pgpool-II/pgpool.conf
倿ŽããŸãã
failover_command
ãã©ã¡ãŒã¿ãŒã«ã€ããŠããå°ã説æããŸãã ãã®è¡ã§æå®ãããã¹ã¯ãªããã«ã¯ããã©ã¡ãŒã¿ãŒ
%d
èœã¡ãããŒãã®èå¥åïŒ
backend_hostname
ã«
pgpool.conf
ïŒã
%H
æ°ãããã¹ã¿ãŒãµãŒããŒã®IPã
backend_hostname
ããŸãã
å®éã«
failover.sh
ã¹ã¯ãªããèªäœïŒ
ãã®ã¹ã¯ãªããã¯ãpgpool
/etc/pgpool-II/
ãã£ã¬ã¯ããªã«äœæãã755ã®ã¢ã¯ã»ã¹èš±å¯ãä»äžããå¿
èŠããããŸãã
次ã«ãpgpoolããã·ãŒãžã£ãã³ã³ãã€ã«ããå¿
èŠããããŸãã
sql/pgpool-walrecrunning
ããã±ãŒãžsrcã«ã¯ãå¿
èŠãªæé ã®ãœãŒã¹ã³ãŒããå«ãŸããŠããŸãã ã³ã³ãã€ã«ããã«ã¯ãPostgreSQLããããŒãã¡ã€ã«ãå¿
èŠã§ãããã®åŸã
make
ã³ãã³ãã䜿çšã
make
pgpool-walrecrunning.so
ãšSQLã¯ãšãªãååŸãããã®ããã·ãŒãžã£
pgpool-walrecrunning.sql
ãããŒã
pgpool-walrecrunning.sql
ãŸãã
ããã·ãŒãžã£ã¯ãåäœæ¥ãµãŒããŒäžã®ãã£ã¬ã¯ããª
/usr/lib64/pgsql/
ã«ã³ããŒããå¿
èŠããããŸãããã®ãã£ã¬ã¯ããªã¯ã
$libdir
ãšåŒã°ãã
/usr/share/pgsql/
ã«ããsqlãã¡ã€ã«ã§ãã
äž»èŠãªãµãŒããŒã®ããŒã¿ããŒã¹ã«ããŒãããŸãã
psql -f /usr/share/pgsql/pgpool-walrecrunning.sql -d postgres
ãã®æé ãã¹ã¬ãŒããµãŒããŒäžã®ããŒã¿ããŒã¹ã«ã¢ããããŒãããå¿
èŠã¯ãããŸããã以åã«èšå®ãããã¬ããªã±ãŒã·ã§ã³ã«ããå©çšå¯èœã«ãªããŸãã
以äžã§ãã
ãµãŒããŒã®ç¶æ
ã¯ã¯ãšãªã§å€æã§ããŸã
SHOW pool_nodes;
ã¹ã±ãŒã«ããŒãã§
psql
ã¯ã©ã€ã¢ã³ãã«ãã°ã€ã³ããåŸã
ãªã¯ãšã¹ãã®åºåäŸïŒ
hostname | port | status | lb_weight ----------------------------------------------------- 192.168.100.3 | 5432 | 2 | 0.500000 192.168.100.2 | 5432 | 2 | 0.500000 (2 rows)
ãµãŒããŒ2ã®ã¹ããŒã¿ã¹ã¯ããµãŒããŒãã¢ã¯ãã£ãã§ããããªã¯ãšã¹ãã«äœ¿çšã§ããããšãæå³ããŸãã ãµãŒããŒã®1ã€ã«é害ãçºçãããšãã¹ããŒã¿ã¹ã¯3ã«å€ãããŸãã
次ã®ããã«èªåãã§ãŒã«ãªãŒããŒã¡ã«ããºã ããã¹ãã§ããŸãã
- ãã¹ã¿ãŒãµãŒããŒãç¡å¹ã«ãã
- SHOWãªã¯ãšã¹ãpool_nodesãå®è¡ããŸãã ãºãŒã ããŒãäž
- ã¹ã¯ãªããå®è¡ã®pgpoolãã°ãèŠã
- ã¹ã¯ãªãããåä¿¡ããåŸãã¹ã¬ãŒããµãŒããŒãæžã蟌ã¿èŠæ±ãåãå
¥ããããšãã§ããããšã確èªããŠãã ãã
ãªã³ã©ã€ã³åŸ©æ§
ããããããã®ã¡ã«ããºã ã¯ãããã°ã®ç¹ã§æãå°é£ã§ãããåæã«ããŒã¿ããŒã¹ã管çããããã®åŒ·åãªããŒã«ã§ãã ãã®ã¡ã«ããºã ã®åäœã¯æ¬¡ã®ãšããã§ããåäœäžã®ã¯ã©ã¹ã¿ãŒãããã以åã«ã¹ã¬ãŒããµãŒããŒããªã³ã«ãããããããã«ä¿åãããŠããããŒã¿ãã¯ã©ã¹ã¿ãŒå
ã®ããŒã¿ãšäžèŽããŸããã ãã®ã¡ã«ããºã ã«ãããã¯ã©ã¹ã¿ãŒã忢ããŠã»ããã¢ããæã«è¿œå ã®ã¢ã¯ã·ã§ã³ãå®è¡ããããšãªãããªã¢ã«ã¿ã€ã ã§å¥ã®ã¹ã¬ãŒããµãŒããŒã远å ã§ããŸãã
ãªã³ã©ã€ã³ååŸ©ã¯æ¬¡ã®ããã«æ©èœããŸãã
- 埩æ§ããŒãã¯ãã¹ã¬ãŒããµãŒããŒã®åŸ©æ§ããã»ã¹ãéå§ããŸã
- ãã®æé ã§ã¯ããã¹ã¿ãŒãµãŒããŒãšã¹ã¬ãŒããµãŒããŒã®éã§èªåã¬ããªã±ãŒã·ã§ã³ãå®è¡ããã¹ã¯ãªããããã¹ã¿ãŒãµãŒããŒã§å®è¡ããŸã
- ã¬ããªã±ãŒã·ã§ã³ãæåãããšãæšæºã®PostgreSQL
PGCTL
ã䜿çšããŠãã¹ããµãŒããŒã®ããŒã¹ããªã¢ãŒãã§èµ·åããPGCTL
- pgpoolãåèµ·åããã¹ã¬ãŒããµãŒããŒãæ€åºããŠã¯ã©ã¹ã¿ãŒã«å«ããŸã
ã»ããã¢ããã«é²ã¿ãŸãã
/etc/pgpool-II/pgpool.conf
次ã®è¡ã远å ããŸãã
postgres
ãã¹ã¯ãŒãããã·ã¥ã远å ããŸãã
123456ã¯ã¯ãªã¢ããã¹ãã®
postgres
ãã¹ã¯ãŒãã§ãã ããã«ããã¹ã¯ãŒãããã·ã¥ã®åã«ããã®ããã·ã¥ãå±ãããŠãŒã¶ãŒåãã€ãŸã ãã¡ã€ã«ã«ã¯
postgres:enrypted_password
ãšããè¡ãå«ãŸããŠããå¿
èŠããããŸãã
ãã¹ã¿ãŒããŒã
basebackup.sh
次ã®å
容ã®
basebackup.sh
ã¹ã¯ãªãããäœæããŸãã
ãã®ã¹ã¯ãªããã¯
$PGDATA
ãã£ã¬ã¯ããªã«ããå¿
èŠãããããšã匷調ã
$PGDATA
ã ã¹ã¯ãªãã755ã«æš©å©ãå²ãåœãŠãŸãã
$PGDATA
ãã£ã¬ã¯ããªã®ã¹ã¬ãŒãããã³ãã¹ã¿ãŒãµãŒããŒã§ã
pgpool_remote_start
ã¹ã¯ãªãããäœæããŸãïŒ
ãã®ååã®äžã«ãããŸã
ïŒ ïŒã次ã®å
容ã䜿çšããŸãã
DBMSããã»ã¹ããªã¢ãŒãã§éå§ã§ããŸãã
次ã«ãã¹ã±ãŒã«ããŒãã§ã
pgpool-recovery.so
ããã±ãŒãžã®
sql/pgpool-recovery
pgpool-recovery.so
sql/pgpool-recovery
srcãã¹ã«ãã
pgpool-recovery.so
ã¹ãã¢ãããã·ãŒãžã£ãã³ã³ãã€ã«ããå¿
èŠããããŸãã åæ§ã«ãæ¬çªãµãŒããŒã«è»¢éããããŒã¿ããŒã¹ã«ããã·ãŒãžã£ãããŒãããŸãã
$ psql -f /usr/share/pgsql/pgpool-recovery.sql -d template1
ããã§ããªã³ã©ã€ã³ãªã«ããªã®ã»ããã¢ãããå®äºããŸããã
æ°ããã¹ã¬ãŒããµãŒããŒãã¯ã©ã¹ã¿ãŒã«å«ããã«ã¯ãæ¬¡ã®æé ãå®è¡ããå¿
èŠããããŸãã
- æ°ãããã¹ã¿ãŒããŒãã§ããŒã¹ãèµ·åããŸã
- ã¹ã±ãŒãªã³ã°ããŒãã§ããµãŒããŒãªã«ããªã³ãã³ããå®è¡ããŸãïŒ
pcp_recovery_node 20 192.168.100.4 9898 postgres 123456 1
pcp_recovery_node
詳现ã ãã®ã³ãã³ãã¯ãã¯ã©ã¹ã¿ãŒãžã®ãµãŒããŒå埩ãå®è£
ããŸãã
20
ã¯ã¹ã¬ãŒããµãŒããŒãžã®æ¥ç¶è©Šè¡åæ°ã
192.168.100.4
ã¯ã¹ã±ãŒãªã³ã°ããŒãã®IPã
9898
ã¯ã¹ã±ãŒãªã³ã°ããŒãã®ã³ãã³ãã®
9898
ããŒãã
postgres
ã¯å埩ãå®è¡ãããŠãŒã¶ãŒã®ååã
123456
ã¯ãã®ãã¹ã¯ãŒãã
1
ã¯åŸ©å
ãããããŒãã®IDã§ãã
ããã§ããªã³ã©ã€ã³ãªã«ããªã®ã»ããã¢ãããå®äºããŸããã
次ã®èšç»ã«åŸã£ãŠãããã2ã€ã®ã¡ã«ããºã ããã¹ãã§ããŸãã
- ãã¹ã¿ãŒãµãŒããŒã«ãã¹ãããŒã¿ããŒã¹ãäœæããŸãã 圌女ãã¹ã¬ãŒãã«è€è£œããããšã確èªããŠãã ãã
- ç¡å¹ã«ããŠãã¹ããµãŒããŒã®é害ãã·ãã¥ã¬ãŒããã
- ãã§ã€ã«ãªãŒããŒãæ©èœããã¹ã¬ãŒããµãŒããŒãæ°ãããã¹ã¿ãŒã«ãªã£ãããšã確èªããŸã
- ã¹ã¬ãŒããµãŒããŒäžã®ããŒã¿ããŒã¹ã«å€æŽãå ããŸã
- åãããã¹ã¿ãŒãµãŒããŒãå®è¡ãããªã³ã©ã€ã³ãªã«ããªãå®è¡ããŠã¹ã¬ãŒãã«ããŸã
ãããã£ãŠãäžèšã®ã¡ã«ããºã ã«ããããã¹ã¿ãŒ/ã¹ã¬ãŒãã¯ã©ã¹ã¿ãŒãä¿è·ãã埩å
ããéã®ããŒã¿ããŒã¹ç®¡çè
ã®äœæ¥ãç°¡çŽ åã§ããŸãã
PSãã®æçš¿ã誰ãã®å©ãã«ãªãããšãé¡ã£ãŠããŸãã ã³ã¡ã³ãã远å ã¯å€§æè¿ã§ãïŒ ãæž
èŽããããšãããããŸããã