PowerGres 体験記では、全3回に渡って GUI を使った使用方法を紹介し、PowerGres V9.1 の魅力をお伝えいたしました。今回は、「GUI による操作でなく、バッチプログラムから自動操作をしたい場合などい、コマンドから使用したい場合はどうすればよいのか?」という声にお答えすべく、PowerGres の起動・停止、レプリケーションの設定と操作をコマンドから行う手順を紹介します。
Linux では、Windows と比べて GUI が全く使えない状態でセットアップされていることがよくあります。X Window System がインストールされていなかったり、ssh コマンドによるリモートログインによる操作を前提にしているといったケースです。そこで Linux編ではデータベースクラスタのセットアップやレプリケーションの構築を含めて、幅広く、コマンドによる操作を説明していきます。
操作例では postgres ユーザを使って PowerGres を動かすものとします。postgres ユーザは /var/lib/pgsql をホームディレクトリとしている状態であるものとします。インストール手順によっては /home/postgres である場合もありますが、適宜読み替えてください。
まず、コマンドと共有ライブラリのパスを設定しておきましょう。PowerGres を稼働させる postgres ユーザの ~/.bash_profile ファイルに追記しておきます。これで各コマンドが実行できます。また、同名コマンドやライブラリがあっても、PowerGres のものが優先されます。
export PATH=/opt/powergres91/bin:$PATH export LD_LIBRARY_PATH=/opt/powergres91/lib:$LD_LIBRARY_PATH
~/.bash_profile の変更が反映されるのは次回ログイン時です。ここではこれらをコマンド実行してすぐ反映させます。また、PS1 を設定してプロンプトを見やすくしておきます。
-bash-3.2$ export PATH=/opt/powergres91/bin:$PATH -bash-3.2$ export LD_LIBRARY_PATH=/opt/powergres91/lib:$LD_LIBRARY_PATH -bash-3.2$ export PS1='[\u@\h \W]\$ ' [postgres@dbhost1 ~]$
データベースクラスタの初期化は PowerGres Manager では「サーバ登録」メニューから行いました。コマンドラインでは initdb コマンドで行います。-D オプションでデータを格納するデータベースクラスタ領域用のディレクトリを指定し、-E オプションでデフォルトの文字エンコーディングを指定します。–no-locale はロケール機能を使わないという日本語環境の Linux 上では一般的に指定されるオプションです。
[postgres@dbhost1 ~]$ initdb --no-locale -D /var/lib/pgsql/pgdata91 -E UTF8 The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale C. The default text search configuration will be set to "english". creating directory /var/lib/pgsql/pgdata91 ... ok : 中略 : Success. You can now start the database server using: postgres -D /var/lib/pgsql/pgdata91 or pg_ctl -D /var/lib/pgsql/pgdata91 -l logfile start [postgres@dbhost1 ~]$ ls /var/lib/pgsql/pgdata91 PG_VERSION pg_clog pg_multixact pg_stat_tmp pg_twophase base pg_hba.conf pg_notify pg_subtrans pg_xlog global pg_ident.conf pg_serial pg_tblspc postgresql.conf
上記のようにメッセージが続き、pgdata91 ディレクトリが作られます。
データベースサーバを手動で起動・停止するには、pg_ctl コマンドを使います。以下の操作例では、起動して、起動できているかどうかプロセス確認をして、停止をしています。-D オプションでデータベースクラスタディレクトリを指定します。停止(pg_ctl stop)するときの -m fast オプションは、現在データベースに接続中のクライアントがいても、直ぐに停止するという意味です。
[postgres@dbhost1 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91 server starting [postgres@dbhost1 ~]$ ps xw PID TTY STAT TIME COMMAND 7153 pts/2 S 0:00 -bash 7221 pts/2 S 0:00 /opt/powergres91/bin/postgres -D /var/lib/pgsql/pgdata91 7222 ? Ss 0:00 postgres: logger process 7224 ? Ss 0:00 postgres: writer process 7225 ? Ss 0:00 postgres: wal writer process 7226 ? Ss 0:00 postgres: autovacuum launcher process 7227 ? Ss 0:00 postgres: archiver process last was 000000010000000 7228 ? Ss 0:00 postgres: stats collector process 7244 pts/2 R+ 0:00 ps x [postgres@dbhost1 ~]$ pg_ctl stop -D /var/lib/pgsql/pgdata91 -m fast waiting for server to shut down..... done server stopped
起動・停止を Linux の initスクリプトで行わせることもできます。これによりマシン起動時に自動的に起動させたり、service コマンドを通してデータベースサーバを起動、停止することができます。initスクリプトを使う方法については、PowerGres on Linux マニュアル「自動起動の設定」 を参照してください。
なお、initスクリプトによる方法は、pg_ctl コマンドや、PowerGres Manager によるデータベースサーバの起動・停止操作と異なる管理方法を取っています。initスクリプトを使って停止できるのは、initスクリプトを使って起動していた場合だけであることに注意が必要です。
続いて、コマンド操作によるレプリケーションの構築を行っていきます。ここで説明する手順は PowerGres むけであることに注意してください。PostgreSQL 9.1.x では、postgresql.conf 設定のデフォルト値の違いや、pwg_rcpxlog コマンドが PowerGres 固有のものである等の違いにより、手順も若干異なります。
まずはプライマリとなる dhbost1 ホストの PowerGres に対してレプリケーションの準備をしていきます。まず、アーカイブログを格納するディレクトリを作成します。データベースサーバを通じてファイルコピーをする都合上、データベースクラスタ内に作成します。
[postgres@dbhost1 ~]$ mkdir /var/lib/pgsql/pgdata91/pwg_archive
次に postgresql.conf にアーカイブログを取得する設定とスタンバイ側になった場合に参照アクセスができるようにする設定をします。以下の項目を書き換えます。
archive_command = 'cp -p "%p" "/var/lib/pgsql/pgdata91/pwg_archive/%f"' hot_standby = on
また、pg_hba.conf にレプリケーションのための接続を許可する以下の設定を加えます。samenet というのは同じネットワークなら接続を許可するという意味です。代わりに、10.1.2.3/32 と記述してスタンバイ側ホストの IP アドレスを直接指定しても良いです。
host postgres repli samenet md5 host replication repli samenet md5
設定変更を反映させるため、reload をします。hot_standby 設定の反映には再起動(restart) が必要ですが、本設定項目を使うのはスタンバイ側なので、ここでは reload で充分です。また、上記で接続を許可した repli ユーザをデータベース上で作成しておきます。最後の ‘pass’ 部分はパスワードですので、実際には任意にパスワード文字列を与えてください。
[postgres@srapc2499 ~]$ pg_ctl reload -D /var/lib/pgdata91 [postgres@srapc2499 ~]$ psql -q postgres=# CREATE USER repli REPLICATION SUPERUSER PASSWORD 'pass'; postgres=# \q
ここまででプライマリ側の準備は完了しました。続いてスタンバイ側の手順を進めていきます。スタンバイ側ホスト dhbost2 には、既に PowerGres on Linux 9.1 がインストールされていて、しかし、まだデータベースクラスタの初期化は行われていない状態であるものとします。
まずは、pg_basebackup コマンドにて、データベースクラスタのコピーを取得します。-D オプションにて配置するディレクトリを指定します。-U で指定したレプリケーション用ユーザのパスワードを要求されますので、入力してください。
[postgres@dbhost2 ~]$ pg_basebackup -x -D /var/lib/pgsql/pgdata91 -h dbhost1 -U repli Password: NOTICE: pg_stop_backup complete, all required WAL segments have been archived [postgres@dbhost2 ~]$
こで展開されたデータベースクラスタにおける postgresql.conf と pg_hba.conf は、プライマリサーバのコピーです。スタンバイ側サーバについて何らか固有の設定が必要であれば加えてください。本例の設定では特に書き換えが必須となる項目はありません。
続いて recovery.conf ファイルを作成します。
[postgres@dbhost2 ~]$ vi /var/lib/pgsql/pgdata91/recovery.conf
次のような内容を記述します。primary_conninfo の「password=pass」部分と、restore_command の「-U “pass”」部分には実際に設定した repli ユーザのパスワードを記述してください。
standby_mode = 'on' primary_conninfo = 'host=dbhost1 port=5432 user=repli password=pass application_name=standby' restore_command = '/opt/powergres91/bin/pwg_rcpxlog -h dbhost1 -p 5432 -U repli -P "pass" pwg_archive %f %p' trigger_file = '/var/lib/pgsql/pgdata91/powergres.trigger'
ここまでできましたら、スタンバイ側でデータベースサーバを起動します。これで非同期モードにてレプリケーションが行われている状態となります。
[postgres@dbhost2 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91
この後、プライマリのデータベースにデータやテーブルを追加して、スタンバイ側で反映されているか確認するのが良いでしょう。スタンバイ側に接続できなかったり、レプリケーションされていなかった場合には、/var/lib/pgsql/pgdata91/pg_log/ 以下にあるログファイルを確認してください。たいていの場合、レプリケーションできない理由が出力されています。
本設定手順でレプリケーションを構築した場合、プライマリサーバの /var/lib/pgsql/pgdata91/pwg_archive ディレクトリにアーカイブログファイルが溜まり続けます。何らか定期的に削除する仕組みが必要です。
例えば以下のようなコマンドで1日以上前のファイルを削除できます。これを cron で定期実行するスクリプトに記述する対処が考えられます。以下は、毎日 0時30分に削除する例です。
[postgres@dbhost1 ~]$ crontab -e (…以下を記述して保存…) PATH=/bin:/usr/bin MAILTO=root@localhost 30 0 * * * find /var/lib/pgsql/pgdata91/pwg_archive -mtime +0 | xargs rm -f
これは、PITR機能によるバックアップを併用しているのであれば、ベースバックアップ取得のタイミングで古いアーカイブログファイルを削除するのがよいでしょう。PowerGres の GUI から生成される PITR機能による定期ベースバックアップ取得のスクリプトでは、古い世代のアーカイブログファイルを削除する動作が含まれています。上記のような cronスクリプトを使うのは、レプリケーションをしているけれども、PITR機能のバックアップは使っていないというケースとなります。
レプリケーションが稼動している状態でのいくつかの操作手順について説明します。
レプリケーションが稼働している状態であっても、プライマリ側、スタンバイ側とも、任意の順番でいつでも停止、起動をすることができます。停止して、起動すれば、引き続きレプリケーションが再開されます。特別な考慮事項はありません。
レプリケーションを同期モードに切り替えるには、プライマリサーバの postgresql.conf の synchronous_standby_names 項目にスタンバイサーバの recovery.conf の primary_conninfo 項目の application_name に設定した名前を記述します。本例では以下のようになります。
synchronous_standby_names = 'standby'
これは pg_ctl reload で反映させます。同期モードに変わったかどうかは、psql 上にて pg_stat_replication ビューから確認できます。
[postgres@dbhost1 ~]$ pg_ctl start -D /var/lib/pgsql/pgdata91 [postgres@dbhost1 ~]$ psql -q postgres=# \x Expanded display is on. postgres=# SELECT * FROM pg_stat_replication ; -[ RECORD 1 ]----+------------------------------ procpid | 4387 usesysid | 16384 usename | repli application_name | standby client_addr | 10.1.2.102 client_hostname | client_port | 45561 backend_start | 2013-02-24 17:25:50.317772+09 state | streaming sent_location | 0/1E000260 write_location | 0/1E000260 flush_location | 0/1E000260 replay_location | 0/1E000260 sync_priority | 1 sync_state | sync
非同期モードに戻すにはプライマリにて「synchronous_standby_names = ”」と設定を元に戻して、pg_ctl reload をします。
PowerGres Manager(GUIツール)では、定期的にスタンバイサーバを監視して、スタンバイサーバに障害があった場合に同期モードを自動的に非同期モードに戻す機能を提供しています。今回の様なコマンドラインベースの構築においても、PowerGres Manager が生成するスクリプトを手動で作成し、cron に登録することで、その機能を利用できます。
始めに、プライマリサーバのデータベースクラスタディレクトリ内に以下のスクリプトファイルを作成します。
PGPASSWORD、接続ポート番号はお使いの環境にあわせて適宜変更してください。
[postgres@dbhost1 ~]$ vi /var/lib/pgsql/pgdata91/pwg_monitorstandby_01.sh (…以下を記述して保存…) #! /bin/sh export PGPASSWORD="postgres" "/opt/powergres91/bin/psql" -c "SELECT pwg_switch_standby()" -d "postgres" -h "localhost" -p "5432" -U "postgres"
作成したスクリプトファイルを以下の通り cron に登録します。
下記の cron 設定では、一分ごとにスタンバイサーバの監視する設定になっています。
[postgres@dbhost1 ~]$ crontab -e (…以wを追記して保存…) PATH=/bin:/usr/bin MAILTO=root@localhost 30 0 * * * find /var/lib/pgsql/pgdata91/pwg_archive -mtime +0 | xargs rm -f */1 * * * * "/var/lib/pgsql/pgdata91/pwg_monitorstandby_01.sh" > /dev/null
スタンバイサーバではデータを更新する SQL を実行できません。プライマリサーバが何らか障害状態となり、代替にスタンバイサーバを使うには、プライマリに昇格させるという手続きが必要になります。
プライマリ昇格をするには、昇格させたいスタンバイサーバにて以下コマンドを実行します。
[postgres@dbhost2 ~]$ pg_ctl promote -D /var/lib/pgsql/pgdata91 server promoting
recovery.conf ファイルの trigger_file 項目で設定したトリガファイルを置くという方法でも昇格を指示できます。
[postgres@dbhost2 ~]$ touch /var/lib/pgsql/pgdata91/powergres.trigger
プライマリサーバが障害を起こして残ったスタンバイサーバをプライマリに昇格させた場合も、スタンバイサーバが障害を起こした場合も、プライマリサーバが1台正常動作していて、スタンバイサーバが無いという状態となります。この状態から、スタンバイサーバがある状態にするには、「レプリケーション構築」の手順を行うことになります。
続いては、Windows 環境における PowerGres のコマンドライン操作です。Windows 環境では、GUI が使用できず、コマンドラインのみの操作が必要とされるケースは多くありません。Windows 編では、GUI による操作を織り交ぜつつ、データベースサーバの起動・停止と、レプリケーションの操作方法のみを紹介します。
データベースクラスタの初期化とレプリケーションの構築は、GUI を用いた PowerGres V9.1 体験記の第1回と第2回をご参照ください。
操作例では、 PowerGres V9.1 の管理ユーザである sraoss ユーザで行なうものとします。
また、コマンドのパスをあらかじめ設定しておく必要があります。システムのプロパティから設定するか、以下コマンドを実行します。
C:\Users\sraoss>set PATH=C:\Program Files\PowerGres91\bin;%PATH%
データベースサーバを手動で起動・停止する場合は、Windows 付属の net コマンドを使い、PowerGres V9.1 体験記の第1回にもとづいて登録した PowerGres の Windows サービスを操作することになります。以下の操作例では、サービスを起動し、データベースサーバの起動状態を確認して、サービスを停止しています。
C:\Users\sraoss>net start powergres91 powergres91 サービスを開始します. powergres91 サービスは正常に開始されました。 C:\Users\sraoss>tasklist /fi "imagename eq postgres.exe" イメージ名 PID セッション名 セッション# メモリ使用量 ========================= ======== ================ =========== ============ postgres.exe 7772 Services 0 13,284 K postgres.exe 7316 Services 0 6,688 K postgres.exe 5452 Services 0 7,320 K postgres.exe 7424 Services 0 7,272 K postgres.exe 6440 Services 0 8,364 K postgres.exe 5244 Services 0 6,672 K postgres.exe 9068 Services 0 6,764 K C:\Users\sraoss>net stop powergres91 powergres91 サービスを停止中です. powergres91 サービスは正常に停止されました。
Windows におけるレプリケーション稼動時のいくつかの操作手順について説明します。
レプリケーション稼働時の起動・停止は Linux と同様に、プライマリ側、スタンバイ側とも、任意の順番でいつでも停止、起動をすることができます。停止して、起動すれば、引き続きレプリケーションが再開されます。特別な考慮事項はありません。
レプリケーションを同期モードに切り替える方法も Linux と違いはありません。
プライマリサーバの postgresql.conf の synchronous_standby_names 項目にスタンバイサーバの recovery.conf の primary_conninfo 項目の application_name に設定した名前を以下のように記述します。
synchronous_standby_names = 'standby'
設定の変更は pg_ctl reload で反映させます。
同期モードに変わったかどうかは、psql 上にて pg_stat_replication ビューから確認できます。
C:\Users\sraoss>pg_ctl -D C:\data reload server signaled C:\Users\sraoss>psql -U postgres -d postgres -q Password for user postgres: postgres=# \x postgres=# SELECT * FROM pg_stat_replication; -[ RECORD 1 ]----+--------------------------- procpid | 9456 usesysid | 16384 usename | repli application_name | standby client_addr | 127.0.0.1 client_hostname | client_port | 51323 backend_start | 2013-04-08 13:31:53.236+09 state | streaming sent_location | 0/1B007B78 write_location | 0/1B007B78 flush_location | 0/1B007B78 replay_location | 0/1B007B78 sync_priority | 1 sync_state | sync
非同期モードに戻すにはプライマリにて「synchronous_standby_names = ”」と設定を元に戻して、pg_ctl reload をします。
PowerGres Manager(GUIツール)で提供されている、同期モード / 非同期モードの自動切り替え機能を Windows のコマンドラインベースで設定するには、以下の PowerGres Manager が生成するバッチファイルを手動で作成し、タスクスケジューラにそのバッチファイルを登録します。
始めに、プライマリサーバのデータベースクラスタディレクトリ内に以下の内容のバッチファイル (pwg_monitorstandby_01.bat) を作成します。
PGPASSWORD、接続ポート番号はお使いの環境にあわせて適宜変更してください。
@echo off setlocal set PGPASSWORD=postgres "C:\Program Files\PowerGres91\bin\psql" -c "SELECT pwg_switch_standby()" -d "postgres" -h "localhost" -p "5432" -U "postgres" endlocal
作成したスクリプトファイルをタスクスケジューラに登録します。
以下の設定では、一分ごとにスタンバイサーバの監視する設定になっています。
/sc オプションでスケジュールの種類を指定します。同期モード / 非同期モードの実行頻度は分単位なので、本例では MINUTE をしています。また、/mo オプションでスケジュールの実行頻度を指定します。本例では1分おきとしています。
/tn オプションでタスクスケジューラの名前を指定します。
/tr オプションで上述のバッチファイルを指定します。
C:\Users\sraoss>schtasks /create /sc MINUTE /mo 1 /tn "PowerGres91 Monitor (powergres91)" /tr C:\data\pwg_monitorstandby_01.bat 成功: スケジュール タスク "PowerGres91 Monitor (powergres91)" は正しく作成されました。
今回は、コマンドラインベースの PowerGres Manager の操作方法を紹介しました。
本来、PowerGres Manager は、PostgreSQL の管理・監視・運用を、コマンドライン操作に不慣れなユーザであっても GUI の管理ツールを用いて直感的に操作できるようにした製品です。
しかしそれは、コマンドラインベースの操作が不可能であるというわけではありません。PowerGres Manager で提供されている機能は、コマンドラインベースでも設定可能であることが、お分かりいただけたかと思います。