この記事では、PostgreSQL DBMSにマスタースレーブクラスターを展開した経験を共有したいと思います。 フォールトトレランスは、pgpool-IIの機能(フェールオーバー、オンラインリカバリ)を使用して実現されます。
pgpoolはサーバー間のスケーリングと負荷分散のための優れたツールであり、マスターに障害が発生したときにスレーブサーバーにフェールオーバーを自動的に作成する可能性と、クラスター全体をシャットダウンせずに既に実行中のクラスターに新しい電源を追加する方法について知っている人は少ないと思います。
クラスタ図とマシン要件
図は、マスター/スレーブクラスターの一般的な図を示しています。
![画像](https://habrastorage.org/storage2/69a/3f0/d2d/69a3f0d2d6f5636e0007c55d938bc6ca.png)
クラスターには、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
自動フェールオーバーを構成する
自動フェールオーバーを作成するメカニズムは次のとおりです。
- 稼働中の(マスターおよびスレーブ)サーバーでは、
pgpool-walrecrunning()
プロシージャが実行され、どのサーバーがマスターであり、どのスレーブであるかが決定されます。 - pgpoolは本番サーバーにリモートで接続し、DBMSプロセスのアクティビティをチェックします。 そうでない場合、pgpoolは、マスターサーバーに障害が発生した場合にスレーブでフェールオーバーを作成するスクリプトを呼び出します。
- その後、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に変わります。
次のように自動フェールオーバーメカニズムをテストできます。
- マスターサーバーを無効にする
- SHOWリクエストpool_nodesを実行します。 ズームノード上
- スクリプト実行のpgpoolログを見る
- スクリプトを受信した後、スレーブサーバーが書き込み要求を受け入れることができることを確認してください
オンライン復旧
おそらく、このメカニズムはデバッグの点で最も困難ですが、同時にデータベースを管理するための強力なツールです。 このメカニズムの動作は次のとおりです。動作中のクラスターがあり、以前にスレーブサーバーをオンにしたいが、そこに保存されているデータがクラスター内のデータと一致しません。 このメカニズムにより、クラスターを停止してセットアップ時に追加のアクションを実行することなく、リアルタイムで別のスレーブサーバーを追加できます。
オンライン回復は次のように機能します。
- 復旧ノードは、スレーブサーバーの復旧プロセスを開始します
- この手順では、マスターサーバーとスレーブサーバーの間で自動レプリケーションを実行するスクリプトをマスターサーバーで実行します
- レプリケーションが成功すると、標準のPostgreSQL
PGCTL
を使用してホストサーバーのベースがリモートで起動されPGCTL
- 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
これで、オンラインリカバリのセットアップが完了しました。
新しいスレーブサーバーをクラスターに含めるには、次の手順を実行する必要があります。
- 新しいマスターノードでベースを起動します
- スケーリングノードで、サーバーリカバリコマンドを実行します:
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この投稿が誰かの助けになることを願っています。 コメントや追加は大歓迎です! ご清聴ありがとうございました。