Usual Software Engineer

よくあるソフトウェアエンジニアのブログ

PipelineDBのレプリケーションをセットアップする

前回に引き続きPipelineDBネタ。 冗長化や負荷分散のための第一歩、レプリケーションです。 PostgreSQLはversion9.4以降標準でレプリケーションの機能を持っていて PipelineDBでも同じようにStreaming Replicationがサポートされています。

公式ドキュメントにも手順が書いてあります。

Replication — PipelineDB 0.8.0 documentation

今回も同じリポジトリでPipelineDBのスレーブサーバをセットアップしてみました。

github.com

primaryサーバの設定

レプリケーション用のユーザを作成します。

$ psql -U pipeline -c "CREATE ROLE replicator WITH LOGIN REPLICATION;"

pg_hba.confにレプリケーション用のユーザを許可する設定を追加します。

host    replication     replicator      0.0.0.0/0               trust
host    replication     replicator      ::/0                    trust

standbyサーバの設定

現在のprimaryサーバのデータを複製します。rsyncでも良いようです。

$ su - pipeline -c "/usr/lib/pipelinedb/bin/pipeline-basebackup -X stream -D /mnt/pipelinedb/data -h pipelinedb -p 5432 -U replicator"

pipelinedb.confに下記のような設定変更をします。

...
wal_level = hot_standby
...
max_wal_senders = 2
...
max_replication_slots = 1
...
hot_standby = on

recovery.confをデータディレクトリに配置します。

standby_mode = 'on'
primary_slot_name = 'replicator_slot'
primary_conninfo = 'user=replicator host=pipelinedb port=5432'
recovery_target_timeline = 'latest'

これでレプリケーションの設定は完了です。

レプリケーションの確認

レプリケーションを開始します。

$ psql -U pipeline -h <DOCKER_HOST> -p 5432 -c "SELECT * FROM pg_create_physical_replication_slot('replicator_slot');"

primaryサーバに書き込んだデータがstandbyサーバでも取得できるか確認してみましょう。

$ curl http://<DOCKER_HOST>/

$ psql -U pipeline -h <DOCKER_HOST> -p 5432 -c "select * from v_nginx_accesslogs;"
       minute        |    path    | code | total_count
---------------------+------------+------+-------------
 2015-12-23 15:39:00 | /test.html | 200  |           1
 2015-12-23 15:39:00 | /test      | 404  |           1
 2015-12-23 15:39:00 | /          | 200  |           4
 2015-12-23 15:39:00 | /hoge      | 404  |           1
(4 rows)

$ psql -U pipeline -h <DOCKER_HOST> -p 6544 -c "select * from v_nginx_accesslogs;"
       minute        |    path    | code | total_count
---------------------+------------+------+-------------
 2015-12-23 15:39:00 | /test.html | 200  |           1
 2015-12-23 15:39:00 | /test      | 404  |           1
 2015-12-23 15:39:00 | /          | 200  |           4
 2015-12-23 15:39:00 | /hoge      | 404  |           1
(4 rows)

PostgreSQLをベースにしているだけあって問題なく動きますね。 次回は重要なhigh availabilityについて書こうかなと思います。