Slony-I
Slony-IはPostgreSQLの非同期クラスタソフトです。マスタのみ更新可。スレーブはTree構造で設定できます。同期を取らないため、他のクラスタソフトより比較的軽いらしい。
ラージオブジェクトはトリガが取れないため同期できないそうです。また非同期のため、主ふと副の整合性が必ずしも保たれていないのが欠点。
以下のコマンドはマスタのサーバで叩けばOKです。ただし当然ながら、slonサービスの上げ下げは各サーバで実行してください。
スイッチオーバー(masterを1から2へ)
slonik_move_set set1 1 2 | slonik
スイッチオーバー(masterを2から1へ)
slonik_move_set set1 2 1 | slonik
slave破壊&復旧
とりあえずセットアップ。インストール手順は省略。
slonik_init_cluster | slonik slonik_create_set set1 | slonik slonik_subscribe_set set1 2 | slonik slon_start 1 slon_start 2
slaveを破壊。
slon_kill dropdb test_db2
masterをダンプ。slonyスキーマは除外。publicスキーマのみ出力する。
pg_dump -d test_db1 --schema=public -f test_db1.out
slaveを復旧。
createdb test_db2 pgsql -d test_db2 -f test_db1.out createlang plpgsql test_db2 slonik_drop_node 2 | slonik slonik_store_node 2 | slonik slonik_subscribe_set set1 2 | slonik slon_start 1 slon_start 2
フェイルオーバー
slon_tools.confの変更が必要そう。とりあえずconf変えずにコマンドでがんばってみる。
とりあえずフェイルオーバー&ノード1を破壊
slonik_failover 1 2 | slonik slon_kill dropdb test_db1
そしてノード1を復旧。
createdb test_db1 pgsql -d test_db1 -f test_db1.out createlang plpgsql test_db1
クラスタ定義を作成。originをノード2に設定し、subscribeをノード1に設定する。
slonik <<_EOF_ cluster name = replication; node 1 admin conninfo='host=localhost dbname=test_db1 user=postgres'; node 2 admin conninfo='host=localhost dbname=test_db2 user=postgres'; ## ノード2からノード1の情報を削除 drop node (id = 1, event node = 2 ); store node (id = 1, event node = 2, comment = 'Node 1 - test_db1@localhost'); store path (server = 1, client = 2, conninfo = 'host=localhost dbname=test_db1 user=postgres'); store path (server = 2, client = 1, conninfo = 'host=localhost dbname=test_db2 user=postgres'); ## providerをノード2にしてレプリケーション開始 subscribe set (id = 1, provider = 2, receiver = 1, forward = yes); _EOF_
masterをノード1に戻す時はスイッチオーバーで戻す。
slonik_move_set 2 1 | slonik
フェイルオーバー(簡単バージョン)
slon_tools.confを変更します。普通は別サーバーなので、ノード2のサーバには「$MASTERNODE = 2;」で設定しておけば良いだけと思います。
とりあえず破壊から手順スタート。
/etc/init.d/postgresql stop slonik_failover 1 2 | slonik /etc/init.d/postgresql start
1サーバ上で確認しているので、slon_tools.confを書き換えます。
vi /usr/local/etc/slon_tools.conf ---------- $MASTERNODE = 2; <==1を2に変える ----------
DB1をドロップせずに2→1に同期する手順を書きます。ドロップする場合も基本は同じ。createlangを忘れないこと。
slonik_drop_node 1 | slonik slonik_store_node 1 | slonik slonik_subscribe_set set1 1 | slonik
masterをノード1に戻す時はスイッチオーバーで戻す。
slonik_move_set set1 2 1 | slonik
confも戻す。
vi /usr/local/etc/slon_tools.conf ---------- $MASTERNODE = 1; ----------