PostgreSQLでDBMirrorを使う

DBMirrorの特徴

準備

Postgresのlibディレクトリにpending.soが無い場合は同梱されているモノからインストールする必要有り(README.dbmirror参照)
perlのPgモジュールを使う為、無い場合は別途インストールしておく必要有り。
http://search.cpan.org/~mergl/pgsql_perl5-1.9.0/Pg.pm
当然、DBI::Pgじゃ駄目。

インストール-運用手順

上記リンク先http://okumurya.homeip.net/pukiwiki/pukiwiki.php?PostgreSQL%20%A5%EC%A5%D7%A5%EA%A5%B1%A1%BC%A5%B7%A5%E7%A5%F3%20-%20dbmirrorの通り、
1.pgsql/contribからdbmirrorインストール
2.スレーブDBを用意(Masterからpg_dump-Masterの更新停止-Slaveでrestore)
3.MirrorSetup.sqlの中のpending.soファイルへのパスを変更してMasterに流し込む
4.更新時に関数を実行してくれるように、ミラーしたいテーブルすべてにトリガを作成。

%pg_dump --schema-only マスタDB | perl -ne '/^CREATE TABLE (\w+)/ && print qq#CREATE TRIGGER "$1_Trig" AFTER INSERT OR DELETE OR UPDATE ON "$1" FOR EACH ROW EXECUTE PROCEDURE "recordchange" ();\n#' > addtrigger.sql
%psql マスタDB < addtrigger.sql

5.マスタDBの"MirrorHost"テーブルにスレーブDBのあるホスト名(IPでも可(非推奨))を登録

db=# INSERT INTO "MirrorHost" ("HostName") VALUES ('スレーブDBのホスト名');

6.slaveDatabase.confの中身を記述(当然、$slaveInfo->{"slaveHost"}は5.で登録した物)

として、redhat等なら/etc/init.d/dbmirrorを作ってchkconfig,FreeBSDなら/usr/local/etc/rc.d/dbmirror.sh等のスタートアップスクリプト用意。
上手く動いたらcronでclean_pendign.plを動かす。

エラーが出る、エラーは出ないけどミラーリングされて無いっぽい時

ハマリ履歴とも言う
  • 追加したMirrorHost等のカラムをgrantしていないと駄目(webからの更新ならwebserverのuserに)。
  • 各更新対象テーブルにはPRIMARY KEYが設定されて居ないと駄目。

 README.dbmirrorより
4) Add the trigger to tables.

Execute the SQL code in AddTrigger.sql once for each table that should
be mirrored. Replace MyTableName with the name of the table that should
be mirrored.

NOTE: DBMirror requires that every table being mirrored have a primary key
defined.

  • マスタDBの更新対象テーブルのカラムを削除しても、削除済みカラムとして"pg.dropped.12"の様に残っているので、スレーブ側でdump->restoreした時点でテーブル内容にずれが生じて更新更新できない。一旦、マスタDBもdump->resotreしなおさないと駄目。


以上、メモの書き写し

*1:MySQLはあまり使ってないから聞きかじりだけど・・・