geek.conf.2

あるエンジニアの備忘録

slony-Iでレプリケーションしよっか

こんばんわ、東京に帰ってきた人です。
今日はむかーしに紹介したpostgreSQLレプリケーションするslony-Iについて深堀します。
以下のエントリーの続きになるよね。

slony-Iをインストールしよっか

上記のエントリーのようにslony-Iインストール済が前提条件です。インストールパスなども上記エントリーを踏まえて本エントリーも記述します。

いよいよ2台のpostgreSQLがconfigされたサーバのデータベースをレプリケーションいたします。
レプリケーションする作業は/usr/local/slony1/bin/にあるperlツールpostgreSQLユーザと関連するユーザ(ここではユーザ名slony1とします)で使用しますので/usr/local/slony1/bin/にパスを通しておくと◎

それではさくっとれっつすろーにー!

1.クラスタセットset1の初期化
/usr/local/slony1/etc/slon_tools.confで定義したクラスタセットset1について初期化します。
通常はクラスタセットはset1のみとなるはず。

マスターノードで。
[slony1@MasNod etc]$ slonik_create_set set1 | sed s/"public."/"geekdb."/ | slonik

:6: Adding unique key to table public.tbl...
:21: Subscription set 1 created
:22: Adding tables to the subscription set
:26: Add unkeyed table public.tbl
:30: Add primary keyed table public.tbl_pkey
:34: Add candidate primary keyed table public.tbl_uniq
:37: Adding sequences to the subscription set
:38: PGRES_FATAL_ERROR select "_replication3".setAddSequence(1, 1, 'public.sequence1', 'Sequence public.sequence1'); - ERROR: Slony-I: setAddSequence_int(): sequence public.sequence1 not found
CONTEXT: SQL statement "SELECT "_replication3".setAddSequence_int( $1 , $2 , $3 , $4 )"
PL/pgSQL function "setaddsequence" line 36 at PERFORM

ちなみにslonik_create_setはクラスタセットを作成する命令文でこの標準出力をslonikコマンドに渡してslonikコマンドがslony-Iにconfigしています。

sedコマンド部分は"public."を"geekdb."に置換しています。postgreSQLのデフォルトスキーマ名は
"public"ですが恐らくみなさん"public"でないと思うので適宜痴漢するよろし。

2.クラスタセットset1のサブスクライバ(スレーブノード)の設定

マスターノードで。
[slony1@MasNod etc]$ slonik_subscribe_set set1 2 | slonik
:10: Subscribed nodes to set 1

/usr/local/slony1/etc/slon_tools.confの中身を見てスレーブノードをconfigしているので
実行の前にusr/local/slony1/etc/slon_tools.confをちゃんと確認してね。

3.slony-I起動

マスターノードで。
[slony1@MasNod etc]$ slon_start 1
Invoke slon for node 1 - /usr/local/pgsql/bin//slon -s 1000 -d2 replication3 'host=MasNod dbname=geekdb user=slony1 port=5432' 2>&1 > /var/log/slony1/slony1/node1/slonydb-2010-09-17_20:13:24.log &
Slon successfully started for cluster replication3, node node1
PID [8401]
Start the watchdog process as well...

スレーブノードで。
[slony1@SlaNod etc]$ slon_start 2
Invoke slon for node 2 - /usr/local/pgsql/bin//slon -s 1000 -d2 replication 'host=SlaNod dbname=geekdb user=slony1 port=5432' 2>&1 > /var/log/slony1/slony1/node2/slonydb-2010-09-17_20:15:42.log &
Slon successfully started for cluster replication, node node2
PID [22651]
Start the watchdog process as well...
NOTICE: ALTER TABLE / ADD UNIQUE will create implicit index "tbl__Slony-I_replication_rowID_key" for table "tbl"
CONTEXT: SQL statement "alter table only "public"."tbl" add unique ("_Slony-I_replication_rowID");"
PL/pgSQL function "determineattkindserial" line 54 at EXECUTE statement
NOTICE: truncate of "public"."tbl" succeeded
NOTICE: truncate of "public"."tbl_pkey" succeeded
NOTICE: truncate of "public"."tbl_uniq" succeeded

これにてslonyプロセスがマスター/スレーブノードで起動します。

4.動作確認
ちゃんとレプリケーションできているか確認したいと思います。

マスターノードで。
# su - slony1
$ psql geekdb -q
slonydb=# INSERT INTO tbl VALUE (2,2);
スレーブノードで
# su - slony1
$ psql geekdb -q
slonydb=# SELECT * FROM tbl;
マスターノードでインサートしたデータが格納されていることを確認するよろし。

これで終いです。次回は自動フェールオーバ・・・からのぉぉ・・フェールバック(手動)について論じます。