レプリケーション

レプリケーションとは、同じデータ(複製、またはレプリカ)を複数のデータベスーサーバに配置させる仕組みである。pgpool-IIでは、クライアントから送信されたSQLを全サーバへ送信するクエリベースの同期レプリケーションを採用している。同期レプリケーションは常に複数のサーバで同一のデータを持つという性質を持っているので、1台のPostgreSQLでつきまとう2つの不安を解消することができる。

1つは、データを複数持つことによってハードウェア障害等が発生した場合にもサービスを継続させることができる。もう1つは、常に同じデータを持つということは、どのノードに問い合わせても同じ結果が返ってくるので、1台では処理が追いつかない検索を複数台に分散させることができる(負荷分散)。

それでは、実際にレプリケーションを行ってみる。レプリケーションのために、pgpool.confに以下の項目を追加する。なお、ここでの例ではPostgreSQLサーバがlocalhostの5432ポートと5433ポートで動いているものとする。

pgpool.conf

# レプリケーションの設定
replication_mode = true

# ロードバランスの設定
load_balance_mode = true

# localhost の5432ポートで動作しているサーバの設定
backend_hostname0 = 'localhost'
backend_port0 = 5432
backend_weight0 = 1

# localhost の5433ポートで動作しているサーバの設定
backend_hostname1 = 'localhost'
backend_port1 = 5433
backend_weight1 = 1

設定ファイルの編集が完了したところでpgpoolを起動し、レプリケーションされているかどうかを確認する。まずはpgpool-IIに接続し、データベース、テーブル、データ5件を作成する。

% createdb -p 9999 replication (9999 番ポートへ接続)
% psql -p 9999 replication
replication=# CREATE TABLE rep (a INT);
replication=# INSERT INTO rep SELECT generate_series(1, 5);

次に直接5432ポートと5433ポートに接続し、実際にデータが5件作成されてい るかどうかを確認する。

% for p in 5432 5433; do
for> echo port: $p
for> psql -p $p -c 'select count(*) from rep' replication
for> done
port: 5432
 count
-------
     5
(1 row)

port: 5433
 count
-------
     5
(1 row)

上記の設定では、負荷分散についても設定してあるので、SELECT文を発行するとpgpool-IIが自動的に5432か5433のどちらかにのみSELECTを送信する。PostgreSQLの設定でSQLログを取得するようにしておくことで、実際に負荷分散されているかを確認することができる。