PostgreSQLのフェヌルオヌバヌクラスタヌマスタヌスレヌブ

こんにちは、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 #hot_standby = on 

最埌の行の重芁性に泚意したす。 実際には、スレヌブノヌドの回埩スクリプトで䜿甚されるため、䞊蚘のように倉曎する必芁がありたす。
次に、レプリケヌション行を$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は、レプリケヌションやその他の管理トリックを行うデヌタベヌス管理者です。 これらの行を䜿甚しお、スレヌブサヌバヌずマスタヌサヌバヌの䞡方のレプリケヌションを蚱可したした。
次に、䞻芁なサヌバヌを再起動したす。
 # service postgresql restart 

スレヌブサヌバヌを停止したす以前に起動した堎合
 # service postgresql stop 

これで、レプリケヌションを開始できたす。
マスタヌサヌバヌで、 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 

次に、スレヌブサヌバヌを起動する必芁がありたす。
 # service postgresql start 


耇補アクティビティは次のように確認できたす。
マスタヌサヌバヌで、次のコマンドを実行したす
 $ 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倉曎したす。
 #      listen_addresses = '*' #        backend_hostname0 = '192.168.100.3' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/pgsql/data' #        backend_hostname1 = '192.168.100.2' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/pgsql/data' #  pool_hba.conf    enable_pool_hba = true 

さらに/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を再起動したす。
 # service pgpool restart 


自動フェヌルオヌバヌを構成する

自動フェヌルオヌバヌを䜜成するメカニズムは次のずおりです。
  1. 皌働䞭のマスタヌおよびスレヌブサヌバヌでは、 pgpool-walrecrunning()プロシヌゞャが実行され、どのサヌバヌがマスタヌであり、どのスレヌブであるかが決定されたす。
  2. pgpoolは本番サヌバヌにリモヌトで接続し、DBMSプロセスのアクティビティをチェックしたす。 そうでない堎合、pgpoolは、マスタヌサヌバヌに障害が発生した堎合にスレヌブでフェヌルオヌバヌを䜜成するスクリプトを呌び出したす。
  3. その埌、pgpoolは萜ちたホストから切断し、接続されおいるすべおのクラむアントアプリケヌションを再起動したす。

そしお今、蚭定
スケヌルノヌドで、 /etc/pgpool-II/pgpool.conf倉曎したす。
 # ,     failover_command = '/etc/pgpool-II/failover.sh %d %H /var/lib/pgsql/data/failover' # ,    health_check_user = 'postgres' #    "-" master_slave_mode = true #     ,    '' master_slave_sub_mode = 'stream' #   pgpool      ,        replication_mode = false #   ,        load_balance_mode = true 

failover_commandパラメヌタヌに぀いおもう少し説明したす。 この行で指定されたスクリプトには、パラメヌタヌ%d萜ちたノヌドの識別子 backend_hostnameにpgpool.conf 、 %H新しいマスタヌサヌバヌのIPがbackend_hostnameれたす。
実際にfailover.shスクリプト自䜓
 #! /bin/bash # ID   FAILED_NODE=$1 # IP   NEW_MASTER=$2 #     TRIGGER_FILE=$3 if [ $FAILED_NODE = 1 ]; then echo "    " exit 1 fi echo "    " echo "  : $NEW_MASTER" ssh -T postgres@$NEW_MASTER touch $TRIGGER_FILE exit 0 

このスクリプトは、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に倉わりたす。

次のように自動フェヌルオヌバヌメカニズムをテストできたす。
  1. マスタヌサヌバヌを無効にする
  2. SHOWリク゚ストpool_nodesを実行したす。 ズヌムノヌド䞊
  3. スクリプト実行のpgpoolログを芋る
  4. スクリプトを受信した埌、スレヌブサヌバヌが曞き蟌み芁求を受け入れるこずができるこずを確認しおください


オンラむン埩旧

おそらく、このメカニズムはデバッグの点で最も困難ですが、同時にデヌタベヌスを管理するための匷力なツヌルです。 このメカニズムの動䜜は次のずおりです。動䜜䞭のクラスタヌがあり、以前にスレヌブサヌバヌをオンにしたいが、そこに保存されおいるデヌタがクラスタヌ内のデヌタず䞀臎したせん。 このメカニズムにより、クラスタヌを停止しおセットアップ時に远加のアクションを実行するこずなく、リアルタむムで別のスレヌブサヌバヌを远加できたす。
オンラむン回埩は次のように機胜したす。
  1. 埩旧ノヌドは、スレヌブサヌバヌの埩旧プロセスを開始したす
  2. この手順では、マスタヌサヌバヌずスレヌブサヌバヌの間で自動レプリケヌションを実行するスクリプトをマスタヌサヌバヌで実行したす
  3. レプリケヌションが成功するず、暙準のPostgreSQL PGCTLを䜿甚しおホストサヌバヌのベヌスがリモヌトで起動されPGCTL
  4. pgpoolが再起動し、スレヌブサヌバヌを怜出しおクラスタヌに含めたす

セットアップに進みたす。
/etc/pgpool-II/pgpool.conf次の行を远加したす。
 # ,   recovery_user = 'postgres' #    recovery_password = '123456' # ,       $PGDATA recovery_1st_stage_command = 'basebackup.sh' 

postgresパスワヌドハッシュを远加したす。
 # pg_md5 123456 >> /etc/pgpool-II/pcp.conf 

123456はクリアテキストのpostgresパスワヌドです。 さらに、パスワヌドハッシュの前に、このハッシュが属するナヌザヌ名、぀たり ファむルにはpostgres:enrypted_passwordずいう行が含たれおいる必芁がありたす。
マスタヌノヌドbasebackup.sh次の内容のbasebackup.shスクリプトを䜜成したす。
 #!/bin/bash #    $PGDATA    PRIMARY_DATA=$1 # IP-  ,     SLAVE_IP=$2 #    $PGDATA    SLAVE_DATA=$3 #  IP       recovery.conf PRIMARY_IP=$(ifconfig eth0| sed -n '2 {s/^.*inet addr:\([0-9.]*\) .*/\1/;p}') #        TMP_DIR=/var/lib/pgsql/tmp #         (    - ) cd $PRIMARY_DATA rm -f recovery.* failover # ,         cat postgresql.conf | grep '#hot_standby = on' #  ,    if [ $? = 1 ] then sed -i 's/hot_standby = on/#hot_standby = on/' postgresql.conf #    /usr/bin/pg_ctl restart -D $PGDIR fi #    ssh -T postgres@$SLAVE_IP "/usr/bin/pg_ctl stop -D $SLAVE_DATA" #  backup     psql -c "SELECT pg_start_backup('Streaming Replication', true)" postgres #    rsync -a $PRIMARY_DATA/ $SLAVE_IP:$SLAVE_DATA/ --exclude postmaster.pid --exclude postmaster.opts #        mkdir $TMP_DIR cd $TMP_DIR #   postgresql.conf   hot_standby cp $PRIMARY_DATA/postgresql.conf $TMP_DIR/ sed -i 's/#hot_standby = on/hot_standby = on/' postgresql.conf #   recovery.conf echo "standby_mode = 'on'" > recovery.conf echo "primary_conninfo = 'host=$PRIMARY_IP port=5432 user=postgres'" >> recovery.conf echo "trigger_file = 'failover'" >> recovery.conf #        ssh -T postgres@$SLAVE_IP rm -f $SLAVE_DATA/recovery.* #    scp postgresql.conf postgres@$SLAVE_IP:$SLAVE_DATA/postgresql.conf scp recovery.conf postgres@$SLAVE_IP:$SLAVE_DATA/recovery.conf #  backup psql -c "SELECT pg_stop_backup()" postgres #      cd .. rm -fr $TMP_DIR 

このスクリプトは$PGDATAディレクトリにある必芁があるこずを匷調し$PGDATA 。 スクリプト755に暩利を割り圓おたす。
$PGDATAディレクトリのスレヌブおよびマスタヌサヌバヌで、 pgpool_remote_startスクリプトを䜜成したす この名前の䞋にありたす 。次の内容を䜿甚したす。
 #! /bin/bash if [ $# -ne 2 ] then echo " ,  " exit 1 fi SLAVE_IP=$1 SLAVE_DIR=$2 PGCTL=/usr/bin/pg_ctl ssh -T $SLAVE_IP $PGCTL -w -D $SLAVE_DIR start 2>/dev/null 1>/dev/null < /dev/null & 

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 

これで、オンラむンリカバリのセットアップが完了したした。

新しいスレヌブサヌバヌをクラスタヌに含めるには、次の手順を実行する必芁がありたす。
  1. 新しいマスタヌノヌドでベヌスを起動したす
  2. スケヌリングノヌドで、サヌバヌリカバリコマンドを実行したす 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぀のメカニズムをテストできたす。
  1. マスタヌサヌバヌにテストデヌタベヌスを䜜成したす。 圌女がスレヌブに耇補したこずを確認しおください
  2. 無効にしおホストサヌバヌの障害をシミュレヌトする
  3. フェむルオヌバヌが機胜し、スレヌブサヌバヌが新しいマスタヌになったこずを確認したす
  4. スレヌブサヌバヌ䞊のデヌタベヌスに倉曎を加えたす
  5. 倒れたマスタヌサヌバヌを実行し、オンラむンリカバリを実行しおスレヌブにしたす


したがっお、䞊蚘のメカニズムにより、マスタヌ/スレヌブクラスタヌを保護し、埩元する際のデヌタベヌス管理者の䜜業を簡玠化できたす。

PSこの投皿が誰かの助けになるこずを願っおいたす。 コメントや远加は倧歓迎です ご枅聎ありがずうございたした。

Source: https://habr.com/ru/post/J188096/


All Articles