これはPGroonga 2.X用のドキュメントです。古いPGroongaを使っているならPGroonga 1.xのドキュメントを見てください。
PGroongaは1.1.6からPostgreSQL組み込みのWALベースのストリーミングレプリケーション機能をサポートしています。
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.conf
にPGroongaのWAL関連の設定を追加する
[通常] スタンバイで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用のコマンドラインを書いています。もし、他のプラットフォームを使っている場合は自分でコマンドラインを調整してください。
これは通常の手順です。
プライマリーとスタンバイで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-.noarch.rpm
% sudo -H yum install -y postgresql96-pgroonga
スタンバイ:
% sudo -H yum install -y https://packages.groonga.org/centos/groonga-release-.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
パラメーターとpgroonga.max_wal_size
パラメーターの設定をpostgresql.conf
に追加します。
/var/lib/pgsql/9.6/data/postgresql.conf
:
pgroonga.enable_wal = on
# You may need more large size
pgroonga.max_wal_size = 100MB
この設定を反映するためにPostgreSQLを再起動します。
% sudo -H systemctl restart postgresql-9.6
上記のパラメターを設定したかどうかは、以下のSQLで確認できます:
SELECT name,setting FROM pg_settings WHERE name LIKE '%pgroonga%';
これは通常の手順です。
プライマリーでだけ一般ユーザーを作成します。
% 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') AS command;
-- 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.conf
にPGroongaのWAL関連の設定を追加するこれはPGroonga固有の手順です。
2.3.3で追加。
shared_preload_libraries
パラメーターにpgroonga_wal_applier
モジュールを追加します。
スタンバイ:
/var/lib/pgsql/9.6/data/postgresql.conf
:
変更前:
#shared_preload_libraries = ''
変更後:
shared_preload_libraries = 'pgroonga_wal_applier'
shared_preload_libraries
パラメータ を設定したかどうかは、以下のSQLで確認できます:
SELECT name,setting FROM pg_settings WHERE name = 'shared_preload_libraries';
これは通常の手順です。
スタンバイでPostgreSQLを起動します。
% sudo -H systemctl start postgresql-9.6
これで、プライマリーで挿入したデータをプライマリーで作成した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)