Slony-I

Slony-IPostgreSQLの非同期クラスタソフトです。マスタのみ更新可。スレーブは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;
----------

設定を全部消す

もう訳わからんようになって設定を1から作るときはアンインストールを実行。slonyスキーマが綺麗さっぱりなくなります。それでも実行できない場合はスキーマ指定のダンプリストアでがんばれ。

slonik_uninstall_nodes | slonik