これはPGroonga 1.X用のドキュメントです。新しいPGroongaを使っているならPGroonga 2.xのドキュメントを見てください。
PGroongaは1.1.6からPostgreSQL組み込みのWALベースのストリーミングレプリケーション機能をサポートしています。この機能を使うにはPostgreSQL 9.6以降が必要です。
PostgreSQL 9.5以前を使っている場合は、PGroongaと一緒に使える別のストリーミングレプリケーションの実装を使ってください。
pg_shard(pg_shardは非推奨になりました。pg_shardの後継プロジェクトのCitusもおそらくPGroongaと一緒に使えます。もし、CitusがPGroongaと一緒に使えることを確認したら、報告してください。)
WALをサポートしているといってもクラッシュセーフではないことに注意してください。WALベースのストリーミングレプリケーションをサポートしているだけです。もし、PGroongaのインデックスを更新している最中にPostgreSQLがクラッシュしたら、そのPGroongaのインデックスは壊れるかもしれません。もし、PGroongaのインデックスが壊れたらREINDEX
で作り直さなければいけません。
このドキュメントではPostgreSQL組み込みのWALベースのストリーミングレプリケーション機能をPGroonga用に設定する方法を説明します。多くの手順は通常のストリーミングレプリケーションの設定手順です。いくつかPGroonga固有の手順があります。
PostgreSQL組み込みのWALベースのストリーミングレプリケーション機能をPGroonga用に設定する手順は次の通りです。「[通常]」タグは通常のストリーミングレプリケーション用の手順であることを示しています。「[固有]」タグはPGroonga固有の手順であることを示しています。
[通常] マスターとスレーブでPostgreSQLをインストールする
[固有] マスターとスレーブでPGroongaをインストールする
[通常] マスターでPostgreSQLのデータベース初期化する
[通常] マスターでpostgresql.conf
とpg_hba.conf
にストリーミングレプリケーション用の設定を追加する
[固有] マスターでpostgresql.conf
にPGroonga関連の設定を追加する
[通常] マスターでデータを投入する
[固有] マスターでPGroongaのインデックスを作成する
[固有] マスターでPGroonga関連のデータをフラッシュする
[通常] スレーブでpg_basebackup
を実行する
[通常] スレーブでpostgresql.conf
にストリーミングレプリケーション用の設定を追加する
[通常] スレーブでPostgreSQLを起動する
このドキュメントでは次の環境を使います。
マスター:
OS:CentOS 7
IPアドレス:192.168.0.30
データベース名:blog
レプリケーションユーザー名:replicator
レプリケーションユーザーのパスワード:passw0rd
スレーブ1:
OS:CentOS 7
IPアドレス:192.168.0.31
スレーブ2:
OS:CentOS 7
IPアドレス:192.168.0.31
このドキュメントではCentOS 7用のコマンドラインを書いています。もし、他のプラットフォームを使っている場合は自分でコマンドラインを調整してください。
2017年7月03日現在、WALをサポートしている公式のPGroongaパッケージは次の通りです。これはWALサポートにはMessagePackとPostgreSQL 9.6以降が必要だからです。他のプラットフォームはこれら2つの条件を満たしていません。PGroongaをソースからビルドする場合は、ソースからインストールを読んでください。MessagePackと一緒にビルドする方法が書いています。
これは通常の手順です。
マスターとスレーブでPostgreSQL 9.6をインストールします。
マスター:
% sudo -H yum install -y http://yum.postgresql.org/9.6/redhat/rhel-$(rpm -qf --queryformat="%{VERSION}" /etc/redhat-release)-$(rpm -qf --queryformat="%{ARCH}" /etc/redhat-release)/pgdg-centos96-9.6-3.noarch.rpm
% sudo -H yum install -y postgresql96-server
% sudo -H systemctl enable postgresql-9.6
スレーブ:
% sudo -H yum install -y http://yum.postgresql.org/9.6/redhat/rhel-$(rpm -qf --queryformat="%{VERSION}" /etc/redhat-release)-$(rpm -qf --queryformat="%{ARCH}" /etc/redhat-release)/pgdg-centos96-9.6-3.noarch.rpm
% sudo -H yum install -y postgresql96-server
% sudo -H systemctl enable postgresql-9.6
PostgreSQL: Linux downloads (Red Hat family)も参照してください。
これはPGroonga固有の手順です。
マスターとスレーブでPGroongaをインストールします。
マスター:
% sudo -H yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
% sudo -H yum install -y postgresql96-pgroonga
スレーブ:
% sudo -H yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
% sudo -H yum install -y epel-release
% sudo -H yum install -y postgresql96-pgroonga
CentOSにインストールも参照してください。
これは通常の手順です。
マスターでだけPostgreSQLのデータベースを初期化します。スレーブではPostgreSQLのデータベースを初期化する必要はありません。
マスター:
% sudo -H env PGSETUP_INITDB_OPTIONS="--locale C --encoding UTF-8" /usr/pgsql-9.6/bin/postgresql96-setup initdb
postgresql.conf
とpg_hba.conf
にストリーミングレプリケーション用の設定を追加するこれは通常の手順です。
マスターでだけ次のストリーミングレプリケーション用の設定をpostgresql.conf
に追加します。
listen_address = '*'
wal_level = replica
max_wal_senders = 4
(= 2(スレーブ数) * 2
。* 2
は意図せず接続が切れた場合のため。)
/var/lib/pgsql/9.6/data/postgresql.conf
:
変更前:
#listen_address = 'localhost'
#wal_level = minimal
#max_wal_senders = 0
変更後:
listen_address = '*'
wal_level = replica
max_wal_senders = 4
マスターでだけ以下のストリーミングレプリケーション用の設定をpg_hba.conf
に追加します。
192.168.0.0/24
からのレプリケーションユーザーreplicator
でのレプリケーション接続を許可します。/var/lib/pgsql/9.6/data/pg_hba.conf
:
変更前:
#local replication postgres peer
#host replication postgres 127.0.0.1/32 ident
#host replication postgres ::1/128 ident
変更後:
host replication replicator 192.168.0.0/24 md5
マスターでだけレプリケーションユーザーを作成します。
% sudo -H systemctl start postgresql-9.6
% sudo -u postgres -H createuser --pwprompt --replication replicator
Enter password for new role: (passw0rd)
Enter it again: (passw0rd)
postgresql.conf
にPGroonga関連の設定を追加するこれはPGroonga固有の手順です。
マスターでだけpgronga.enable_wal
パラメーターの設定をpostgresql.conf
に追加します。
/var/lib/pgsql/9.6/data/postgresql.conf
:
pgroonga.enable_wal = on
この設定を反映するためにPostgreSQLを再起動します。
% sudo -H systemctl restart postgresql-9.6
これは通常の手順です。
マスターでだけ一般ユーザーを作成します。
% sudo -u postgres -H createuser ${USER}
マスターでだけデータベースを作成します。
% sudo -u postgres -H createdb --locale C --encoding UTF-8 --owner ${USER} blog
マスターでだけ作成したデータベースにテーブルを追加します。
作成したblog
データベースに接続します。
% psql blog
entries
テーブルを作成します。
CREATE TABLE entries (
title text,
body text
);
作成したentries
テーブルにデータを追加します。
INSERT INTO entries VALUES ('PGroonga', 'PGroonga is a PostgreSQL extension for fast full text search that supports all languages. It will help us.');
INSERT INTO entries VALUES ('Groonga', 'Groonga is a full text search engine used by PGroonga. We did not know about it.');
INSERT INTO entries VALUES ('PGroonga and replication', 'PGroonga 1.1.6 supports WAL based streaming replication. We should try it!');
これはPGroonga固有の手順です。
このデータベースにPGroongaをインストールします。スーパーユーザー権限が必要です。
% sudo -u postgres -H psql blog --command "CREATE EXTENSION pgroonga;"
% sudo -u postgres -H psql blog --command "GRANT USAGE ON SCHEMA pgroonga TO ${USER};"
再度一般ユーザーでPostgreSQLに接続します。
% psql blog
マスターでだけPGroongaのインデックスを作成します。
CREATE INDEX entries_full_text_search ON entries USING pgroonga (title, body);
作成したインデックスを確認します。
SET enable_seqscan TO off;
SELECT title FROM entries WHERE title %% 'replication';
-- title
-- --------------------------
-- PGroonga and replication
-- (1 row)
これはPGroonga固有の手順です。
マスターでだけメモリー上にあるPGroonga関連のデータを確実にディスクに書き出します。以下のどれかの方法を使います。
SELECT pgroonga.command('io_flush');
を実行する
すべての接続を切断する
pgroonga.command('io_flush')
を使う場合は次のようになります。
SELECT pgroonga.command('io_flush');
-- command
-- -----------------------------------------------
-- [[0,1478446349.2241,0.1413860321044922],true]
-- (1 row)
マスターでは、次のpg_basebackup
の手順が終わるまではPGroongaのインデックスを使っているテーブルを変更してはいけません。
pg_basebackup
を実行するこれは通常の手順です。
スレーブでだけpg_basebackup
を実行します。pg_basebackup
はマスターから現在のデータベースをコピーします。
スレーブ:
% sudo -u postgres -H pg_basebackup --host 192.168.0.30 --pgdata /var/lib/pgsql/9.6/data --xlog --progress --username replicator --password --write-recovery-conf
Password: (passw0rd)
149261/149261 kB (100%), 1/1 tablespace
postgresql.conf
にストリーミングレプリケーション用の設定を追加するこれは通常の手順です。
スレーブでだけ次のレプリカ用の設定をpostgresql.conf
に追加します。
hot_standby = on
スレーブ:
/var/lib/pgsql/9.6/data/postgresql.conf
:
変更前:
#hot_standby = off
変更後:
hot_standby = on
これは通常の手順です。
スレーブでPostgreSQLを起動します。
% sudo -H systemctl start postgresql-9.6
これで、masterで挿入したデータをmasterで作成したPGroongaのインデックスで検索できます。
スレーブ1:
% psql blog
SET enable_seqscan TO off;
SELECT title FROM entries WHERE title %% 'replication';
-- title
-- --------------------------
-- PGroonga and replication
-- (1 row)
pg_basebacup
以降にマスターで追加したデータも検索できます。
マスター:
INSERT INTO entries VALUES ('PostgreSQL 9.6 and replication', 'PostgreSQL supports generic WAL since 9.6. It is required for replication for PGroonga.');
スレーブ1:
SELECT title FROM entries WHERE title %% 'replication';
-- title
-- --------------------------------
-- PGroonga and replication
-- PostgreSQL 9.6 and replication
-- (2 rows)
スレーブ2:
% psql blog
SELECT title FROM entries WHERE title %% 'replication';
-- title
-- --------------------------------
-- PGroonga and replication
-- PostgreSQL 9.6 and replication
-- (2 rows)