TECH BLOG
技術ブログ

ARTICLE

  • 2020-12-25 PostgreSQL

    PostgreSQLのストリーミングレプリケーションとPacemakerによるクラスター構築方法(1)

はじめに

みなさん、こんにちは。
インサイトの梅宮です。
前回はLinuC304試験対策も兼ねて『Pacemaker+DRBD+PostgreSQLの構築』を記事として公開しました。
最近は私もクラスター構築の記事や専門書などを読みながら理解を更に深めています。
そんな中、『PostgreSQLのストリーミングレプリケーションとPacemakerによるクラスター構築』といった内容の記事や手順書などはあまり見かけることがありませんでした。
ストリーミングレプリケーションもPacemakerも、未だに多くのユーザーが使用している機能・ツールであるため、この2つを利用したクラスター構築の方法に大変興味が湧きました。
今回はその構築の手順やその過程で判明したことなどをご紹介したいと思います。
本記事は2部構成となっております。前半では構築の概要・イメージの説明とストリーミングレプリケーション環境の構築までの手順を紹介します。
後半ではPacemakerの導入と設定の手順から、稼働テストの結果までを紹介します。

構築の概要

  • 2台構成での構築
  • OSはCentOS7.8、PostgreSQLは11.10を使用
  • Pacemakerのバージョンは1.1.19-1
  • testcentos01をPrimary、testcentos02をStandbyとする
  • 本記事の構築は本番想定ではなく、あくまでレプリケーションとPacemakerを使用した最小構成の1例となります

●環境情報

ホスト名 PostgreSQLアクセス用IP レプリケーション用IP
testcentos01 192.168.33.11 192.168.160.11
testcentos02 192.168.33.12 192.168.160.12

構築イメージ

●仮想IPについて
フェイルオーバーによりプライマリとスタンバイが入れ替わっていてもクライアントはその変更に気付かないため、仮想IPを用意しています。(物理IPは固定でフェイルオーバーをしたと言う情報は持っていないため)。
また、仮想IPは設定上必ずPrimaryに付与されるようになっています。そのため仮想IPを設定しそこに接続することによって常にPrimaryに接続する事が出来ます。
詳しい設定の内容に関しては後述のPacemakerのリソース設定のセクションを参照してください。
ex. 上記イメージ図では 192.168.33.11 にmaster_ipが付与されているが、フェイルオーバーによりPrimaryが 192.168.33.12 に移った場合、master_ipの仮想IPも同時に移ることになります。
また、本ブログでは通信の混雑を避けるためにmaster_ipとreplica_ipのIP体系をそれぞれ別にしています。

  • master_ip:PostgreSQLアクセス用の仮想IP
  • replica_ip:レプリケーション用の仮想IP

注意点(仮)

(基本的に手順に関する注意点やポイントはその都度記載していますが、全体に関することや一項目として記改めて載しておくべきであればこの項目に記述します。)

構築手順

1. 名前解決の設定
2. 環境変数の設定とユーザーの作成
3. PostgreSQLのインストールと環境構築
4. レプリケーション環境の構築
5. Pacemakerの導入と設定
6. 確認とテスト

1. 名前解決の設定(2台共通)

以降の手順を円滑に進めるために /etc/hosts を編集して名前解決を行います。
すでに記述済み・記述が不要な場合は2.の手順に進んで下さい。

# vi /etc/hosts
-----------------------------
127.0.0.1 localhost
192.168.33.11 testcentos01
192.168.33.12 testcentos02
192.168.160.11 test_rep01
192.168.160.12 test_rep02

※viコマンドで各種設定ファイルを編集する場合は事前にcpコマンドでバックアップを作成しておくと、不測の事態に比較や再編集が容易に行えます。

2. 環境変数の設定とユーザーの作成

環境変数の設定(2台共通)

この後に行うyumコマンドでのPostgreSQLのインストールでpostgresユーザーの追加処理は自動的に行われますが、その場合プロンプトのユーザー名が『-bash-X.Y』で固定されてしまい、
現在のディレクトリが一目で分かりづらいため、先にpostgresユーザーを作成することによって、この問題を回避しています。

# useradd -m postgres -p postgres
# su - postgres

$ vi ~/.bash_profile #環境変数の設定を以下のようにします
---------------------------------
export PGHOME=/usr/pgsql-11
export PGLIB=$PGHOME/lib/pgsql
export PGDATA=/pgsql/data
PATH=$PATH:$HOME/bin:$PGHOME/bin
export PATH
---------------------------------
$ source ~/.bash_profile
$ exit

# vi ~/.bash_profile
--------------------------------
export PGHOME=/usr/pgsql-11
export PGLIB=$PGHOME/lib/pgsql
export PGDATA=/pgsql/data
PATH=$PATH:$HOME/bin:$PGHOME/bin
export PATH
---------------------------------
# source ~/.bash_profile

※上記の手順のように先に useradd をしなくてもプロンプトの表記を変える方法もあります
bashの表示フォーマットは PS1 という環境変数に格納されているため、この環境変数の記述を変更することによってbashの表示フォーマットを柔軟に変更することが出来ます。

PostgreSQL用のディレクトリの作成(2台共通)
# mkdir -p $PGDATA
# mkdir -p $PGHOME/lib/pgsql
# mkdir $PGDATA/../arclog
# chown postgres:postgres $PGHOME
# chown postgres:postgres $PGLIB
# chown -R postgres:postgres $PGDATA/..
# chmod 700 $PGHOME
# chmod 700 $PGLIB
# chmod -R 700 $PGDATA/..

3. PostgreSQLのインストールと構築(2台共通)

PostgreSQLのインストール(2台共通)
# yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum -y install postgresql11 postgresql11-server postgresql11-contrib

yum install 前に yum search postgresql コマンドを実行してインストール可能なバージョンを確認しておくのも良いかと思います。

PostgreSQLの構築(Primaryのみ)
(testcentos01)# su - postgres

(testcentos01)$ initdb --no-locale --encoding=UTF-8
(testcentos01)$ vi /$PGDATA/postgresql.conf
------------------------
listen_addresses = '*'
archive_mode = on
archive_command = '/bin/cp %p /pgsql/arclog/%f'
hot_standby = on
hot_standby_feedback = on
wal_log_hints = on
lc_messages = 'C'
lc_monetary = 'C'
lc_numeric = 'C'
-------------------------

4. レプリケーション環境の構築

pg_hba.confの編集(Primary側)
(testcentos01)$ vi /$PGDATA/pg_hba.conf
---------------------------------------
host replication rep 192.168.160.0/24 trust
host all         all 192.168.33.0/24  trust
---------------------------------------
(testcentos01)$ pg_ctl start

※pg_hba.confの接続形式 trust は接続を無条件で許可する設定であるため、本番環境向きではありません。

ストリーミングレプリケーションの設定(Primary側)

レプリケーション用ユーザーの作成

(testcentos01)$ psql
=# CREATE ROLE rep REPLICATION LOGIN;
=# ¥q
ストリーミングレプリケーションの設定(Standby側)

Primary側で作成したデータベースクラスタをStandbyに複製します。

(testcentos02)# su - postgres

(testcentos02)$ pg_basebackup -h test_rep01 -U rep -D $PGDATA --progress -R

(testcentos02)$ pg_ctl start
レプリケーション状態の確認

上記の手順でPrimaryとStandbyで実行したコマンドや設定が問題ないかレプリケーションの状態を確認します。

(testcentos01)$ psql

(testcentos01)=# SELECT client_addr, application_name, sync_state FROM pg_stat_replication;
client_addr   | application_name | sync_state 
----------------+------------------+------------
 192.168.160.12 | walreceiver      | async
(1 row)

Standby側(testcentos02)のIPが取得できていればレプリケーションが行われています。

※別の確認方法として、Primaryで作成したテーブルやインデックスなどのオブジェクトをStandby側で確認し、問題なく取得出来ていればレプリケーションができていると判断出来ます。

後半の記事では本記事で作成した環境を利用してPacemakerの導入と設定を行い、その後稼働テストを行なった結果などを載せております。
近日公開予定です。しばしお待ちください。

CATEGORY

ARCHIVE

PostgreSQLの
ハイパフォーマンスチューニングのご相談は
株式会社インサイトまで
お気軽にお問い合わせください。

CONTACT