2014ストリーミングレプリケーションとpgpool-IIの組み合わせ、簡単設定法(複数サーバ編)概要このチュートリアルでは、ストリーミングレプリケーションとpgpool-IIの組み合わせの簡単設定法を説明します。Linuxが動くマシンが3台必要です(もちろん仮想環境でもOK)。それぞれのマシンにPostgreSQLのインスタンス、pgpool-II(とpgpoolAdmin)をインストールします(1台のマシンで済ませてしまう方法はここにあります)。9.3自体に不足している以下のような機能を実現できます。2台のPostgreSQLのうち1台がダウンしたら、pgpool-IIは自動的に残ったPostgreSQLが役割を引き継いでアプリケーションに対してデータベースサービスを継続させることができます。クエリの振り分けと負荷分散。ストリーミングレプリケーションモードでは、アプリケーションはスタンバイに送ってよいクエリに気を使う必要があります。pgpool-IIはクエリを調べ、自動的にプライマリに送信するのかスタンバイに送信するのかを切り分けます。したがってアプリケーションはこの点に気を使う必要がなくなります。障害を起こしたノードを、pgpool-IIやPostgreSQLを停止することなくリカバリできます。機能を使ってpgpool-IIが動いているマシンを二重化します。pgpool-HAはオープンソースで提供されており、pgpool-IIの開発サイトから入手できます。システムの全体図を示します。ここでは、サーバ1(ホスト名を"osspc16"とします)にpgpool-IIとpgpoolAdminが、サーバ2(ホスト名を"osspc17"とします)にプライマリのPostgreSQLが、サーバ3(ホスト名"osspc18"とします)がスタンバイサーバに割り当てられます。このプライマリとスタンバイの役割は相互に交換可能で、ここで言っているのは初期状態過ぎません。9.3を3台のマシンすべてにインストールします。osspc16ではPostgreSQLを動かしませんが、pgpoolをビルドするのに必要です。PostgreSQLをインストールするもっとも簡単な方法は、PostgreSQLのオフィシャルサイトからLinux用のパッケージをダウンロードすることです。他に、PostgreSQLをソースコードから導入する方法もあります。これは驚くほど簡単です。installとするだけです。詳細はPostgreSQLのマニュアルをご覧ください。次に、データベースクラスタをosspc17とosspc18上に作ります。データベースクラスタは/home/postgres/dataにあり、postgresユーザに所有されているものとします。以下の操作をosspc17とosspc18の両方で行ってください。ストリーミングレプリケーションには直接関係ありませんが、こうすることによって管理が簡単になります。'all'は削除した方が良いかもしれません。'all'pg_hba.confを/home/postgres/dataに設定します。部分はスクリプトをダウンロードした場所に置き換えてください。ここでの設定は、すべてのIPアドレスからのアクセスを許す非常に緩いものになっています。実際のシステムでは、PostgreSQLのマニュアルにしたがって適切なアクセス権限を行ってください。/home/postgres/data"設定が終わったら、osspc17とosspc18のPostgreSQLを起動します。この時点では、osspc17とosspc18はプライマリとして起動されます。start次に、osspc17とosspc18のpostgresユーザがお互いにパスワードなしでsshでログインできるようにします。postgresユーザでssh-keygenを実行し、できた/home/postgres/.ssh/id_rsa.pubをお互いの/home/postgres/.ssh/authorized_keysに追加します。追加したら、lsコマンドをssh経由で実行するなどして確認しておきましょう。lspgpool-IIのインストールosspc16にpgpool-IIをインストールします。3.3.3以降が必要です。以下を適当なユーザで実行します。"postgres"ユーザが選ばれることが多いでしょう。install次に、pgpoolが使用するユーザ定義関数をPostgreSQLにインストールします。postgresユーザでosspc17とosspc18の両方で実施します。ここからダウンロードできます。部分は実際にスクリプトをダウンロードした場所に読み替えてください。設定ファイルをosspc16にインストールします。主要なファイルはpgpool.confです。他にpcp.confがあります。rootで以下を実行します。/usr/local/etc/pcp.confここでchownを実行している理由は、pgpoolAdminがこれらの設定ファイルを更新する必要があるからです。pgpoolAdminはPHPスクリプトで、Apacheから実行されます。使用しない場合(つまり、pcpコマンドラインツールだけを利用する)は、chownは必要ありません。"pgpoolAdmin"です。インストール後、パスワードを速やかに変更することを強くおすすめします。コマンドを使って得ることができます。osspc17とosspc18にインストールします。コマンドへのパス名が指定されています。実際のPostgreSQLのインストール状況に応じて、これを変更する必要があるかもしれません。pgpool_remote_startosspc16に、自動フェイルオーバ処理で使うスクリプトfailover.shをインストールします。failover.shosspc16で必要なディレクトリを作ります。以下をrootで実行してください。ここでchownを実行している理由は、pgpoolAdminがこれらの設定ファイルを更新する必要があるからです。pgpoolAdminはPHPスクリプトで、Apacheから実行されます。使用しない場合(つまり、pcpコマンドラインツールだけを利用する)は、chownは必要ありません。osspc18で必要なディレクトリを作ります。以下をrootで実行してください。osspc18のpostgresユーザにパスワードなしでsshでログインできるようにします。ほとんどのシステムでは、apacheユーザのアカウントはログインできない設定になっているはずです。apache:x:48:48:Apache:/var/www:/sbin/nologinこの/sbin/nologinを一時的に/bin/bashに変えるなどして、ログインできるようにします。その上で/var/www/.sshディレクトリを作ります。ssh-keygenを実行してssh環境を作ります。osspc18の/home/postggres/.ssh/authorized_keysに追加します。osspc18のpostgresユーザにsshでパスワードなしでログインできることを確認しておきます。ls確認できたら、/etc/passwdのapacheのエントリを元に戻しておきます。実際のシステムに導入する場合は、pgpoolAdmin専用のアカウントを作り、そのアカウントで別途apacheを立ち上げることをおすすめします。nここで、一旦osspc18のPostgreSQLを停止します。osspc18で以下を実行してください。pgpoolAdminは、pgpool-IIを実行するサーバと同じサーバ上で実行しなければなりません。これはすなわち、実質的にはpgpoolAdminはWindowsでは動作しないことを意味します。pgpoolAdminはPHPが4.2以上であれば動作しますが、PostgreSQLにアクセスするための拡張がインストールされていることが必要です。付けてビルドしてください。Linux)ではPostgreSQL拡張が最初からバンドルされていますが、多くのディストリビューションでは、追加で入れる必要があります。インストーラが付属しているので、インストールは容易です。インストール説明読んでください。インストーラでpgpoolAdminをインストールする際のポイントを説明します。conf/pgmgt.conf.php準備ができたら、pgpoolAdminインストーラを適当なブラウザで開きます。このページが表示されるはずです。ここでLanguageメニューから日本語を選べば、実際には以後の画面は日本語表示になります。すべての項目が緑でチェックされていることを確認してください。それならすべてOKということです。"Next"を選択し、主設定画面に移動します。デフォルト値から変更を推奨するのは以下の項目です。「pgpool_statusを無視」を選びます。pgpool_statusは、前回pgpool-IIが起動されたときの、PostgreSQLサーバのダウン状態を記録します。デフォルトではpgpool-IIは、このファイルを参考にPostgreSQLの状態を認識します。これにより、前回pgpool-IIを停止した際に、ダウン状態だったPostgreSQLをpgpool-IIの管理外で起動され、そのためにデータベースの同期が取れなくなるのを防ぐことができます。実験環境では不便になることが多いので、ここではpgpool_statusを無視するようにします。mode)を選びます。pgpoolのログを取得するのに必要です。"fast"にします。停止を待つことになります。これはテスト環境では少々面倒です。これにより、pgpoolのログファイルが/var/log/pgpoolに置かれ、1日1回Apache2に付属するrotatelogs2コマンドでローテーションされるようになります。