PipelineDBのレプリケーションをセットアップする
前回に引き続きPipelineDBネタ。 冗長化や負荷分散のための第一歩、レプリケーションです。 PostgreSQLはversion9.4以降標準でレプリケーションの機能を持っていて PipelineDBでも同じようにStreaming Replicationがサポートされています。
公式ドキュメントにも手順が書いてあります。
Replication — PipelineDB 0.8.0 documentation
今回も同じリポジトリでPipelineDBのスレーブサーバをセットアップしてみました。
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について書こうかなと思います。