TECH BLOG
技術ブログ

ARTICLE

  • 2020-09-08 PostgreSQL

    Pacemaker+DRBD+PostgreSQLの構築の流れ

オープンソースのHAクラスタソフトであるPacemakerは複数の様々なリソースをネットワーク間で連携し、異常検知・発生時に自動的にフェイルオーバーを行うことで高可用性を実現します。
また、DRBDはLinuxプラットフォームの分散ストレージシステムであり、データレプリケーション(複製)のためのソフトウェアで、サーバ間でブロックデバイス(ハードディスクや論理ボリュームなど)の内容をミラーリングします。

はじめに

みなさん、こんにちは。インサイトの梅宮です。
今回のブログ内容は『Pacemaker+DRBD+PostgreSQL』の構築の流れについてです。
この内容はLinux技術者認定資格であるLPIC/LinuC304試験の範囲にもなっています。
私も少し前まで304試験の受験勉強を行っていましたが、実際に手を動かして環境を構築することは受験対策としても大変有効です。
そのため本記事はLinuC304の受験対策として、また純粋に高可用性構成の構築の参考としても活用できる内容に仕上げています。

構築の概要

  • 2台構成での構築を想定しています。
  • ホスト名やリソース名、IPに関しては私が実行した環境での名前や値になっているため、実行環境によって任意で変更してください。

構築イメージ

構築に使用するバージョン

  • PostgreSQL11
  • Pacemaker1.1.19
  • DRBD9.6.0

構築手順

1. /etc/hostsの編集
2. パーティションの作成
3. Pacemakerの導入と設定
4. DRBDの導入と設定
5. PostgreSQLの導入と設定
6. Pacemakerのリソース設定
7. 確認とテスト

注意点

本記事の内容並びに構築手順は本番環境適応を想定しておりません。本番環境へ適応させる場合には
①各環境・ソフトウェアとの互換性などを考慮した設定値の検証
②各ソフトウェアのクライアント認証方式やSELINUXの設定
などを考慮する必要がありますのでご注意ください。

本記事の内容としては高可用性構成の構築手順の流れや意義を理解していただくためのものと思っていただければ幸いです。

1. /etc/hostsの編集(2台共通)

以降の手順を円滑に進めるために名前解決を行います。

# cat /etc/hosts    # 既に追加済だったりしないか確認します。追加済みの場合、以下の記述は必要ありません。
# cp -p /etc/hosts /etc/hosts.bak
# echo "192.168.249.37 Insight1" >> /etc/hosts
# echo "192.168.249.38 Insight2" >> /etc/hosts
# diff /etc/hosts.bak /etc/hosts

2. パーティションの作成

パーティションの作成手順や使用するコマンドはLInuC304試験だけでなく、LinuC201試験の『LVM』セクションでも頻出の分野となっています。

※vagrantなどの仮想環境で以下の手順を実行する場合はDRBD用にディスクを追加する必要があります。

2.1 使用するディスクの確認(2台共通)
# lsblk
# fdisk -l
2.2 パーティションの作成(2台共通)
# fdisk /dev/sdb
※fdiskコマンド実行後にキーの入力を求められます。
> n   #新しいパーティションを作成。
> p   #パーティションテーブルを表示。
> [Enter]  #デフォルト設定のまま処理を進めます。
> [Enter]
> [Enter]
> t   #区画のシステムIDを変更。
> 8e  #論理ボリューム用のパーティションに設定。
> w  #テーブルを書き込んで終了。
# fdisk -l

※fdiskコマンドは対話モードであり、メニューとカーソルキーを使用するcfdiskコマンドもあります。

2.3 LVMのインストール及び設定(2台共通)
# yum -y install lvm2
# pvcreate /dev/sdb1     #pvcreate以下は、2.2の手順で対象としたディスクのパスを入力します。
# pvdisplay
2.4 VG、LV名をサーバ毎に変更する(2台共通)
# vgcreate vg_primary(vg_standby) /dev/sdb1  #vg_primary(vg_standby)/以下はpvdisplayで表示されるパスを指定します。
# vgdisplay
# lvcreate --name lv_primary(lv_standby) -l 100%FREE  vg_primary(vg_standby)    #今回の構築においては空き容量を全て使用するよう指定します。
# lvdisplay

3. Pacemakerの導入と設定

3.1 パッケージのインストール(2台共通)
# yum -y install https://osdn.net/projects/linux-ha/downloads/70298/pacemaker-repo-1.1.19-1.1.el7.x86_64.rpm
# yum -y install pacemaker-all
3.2 Corosyncの設定ファイルを作成(2台共通)
# vi /etc/corosync/corosync.conf  #Corosyncの設定ファイルを新規作成します。
 

以下のテキストを設定ファイル内に記述します(クリックで展開)

 

totem {
version: 2
cluster_name: inscluster
rrp_mode: passive
secauth: off
transport: udpu
token: 30000
token_retransmits_before_loss_const:10
join:5000
}

logging {
to_syslog: yes
to_logfile: yes
logfile: /var/log/cluster/corosync.log
}

nodelist {
node {
name: Insight1
ring0_addr: 192.168.249.37
nodeid: 1

}
node {
name: Insight2
ring0_addr: 192.168.249.38
nodeid: 2

}
}
quorum {
provider: corosync_votequorum
two_node: 1
}

3.3 corosync認証鍵ファイルの設定(Primaryのみ)
# corosync-keygen -l
# ls -l /etc/corosync/authkey
# scp -p /etc/corosync/authkey root@192.168.249.37:/etc/corosync/authkey
3.4 corosync鍵認証ファイルの確認(Standbyのみ)
# ls -l /etc/corosync/authkey
3.5 pacemakerの設定ファイルを設定(2台共通)
# cp -p /etc/sysconfig/pacemaker /etc/sysconfig/pacemaker.bak       # 差分確認用にバックアップファイルを作成します。
# vi /etc/sysconfig/pacemaker       #Pacemakerの内部プロセスが停止した場合もノード故障と見なす為に以下のパラメータを追記または修正します。
PCMK_fail_fast=yes
# diff /etc/sysconfig/pacemaker.bak /etc/sysconfig/pacemaker
3.6 クラスタの起動と状態の確認(2台共通)
# systemctl start pacemaker
# crm_mon

※起動後すぐにオンライン表記が出るとは限らない為、少々時間を置いてから実行します。

4. DRBDの導入と設定

4.1 DRBDをインストール(2台共通)
# yum -y install http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el7/x86_64/RPMS/drbd90-utils-9.12.2-1.el7.elrepo.x86_64.rpm
# yum -y install http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el7/x86_64/RPMS/kmod-drbd90-9.0.22-2.el7_8.elrepo.x86_64.rpm
4.2 DRBDのresourceの設定(2台共通)
# vi /etc/drbd.d/insight.res
/etc/drbd.d/リソース名.res内に以下のテキストを記述します(クリックで展開)

resource insight {
device /dev/drbd1;
meta-disk internal;
protocol C;
syncer {
verify-alg sha1;
}
on Insight1 {
address 192.168.249.37:7789;
disk /dev/vg_primary/lv_primary;
}
on Insight2 {
address 192.168.249.38:7789;
disk /dev/vg_standby/lv_standby;
}
}

4.3 DRBDの初期設定(2台共通)
# drbdadm create-md insight
4.4 DRBDマウントポイントの作成(2台共通)
# mkdir /drbd
4.5 DRBDサービスを起動(2台共通)
# systemctl start drbd
# ps -ef | grep drbd | grep -v grep     #drbdプロセスが存在することを確認します。
# systemctl enable drbd     #DRBDサービスの自動起動をenableにします。
4.6 各台のDRBDの状態を確認し、片方をprimaryにする(Primary及びSecondary)
# drbdadm cstate insight  #Connectedの表示を確認します。
# 
#Inconsistent/Inconsistentの表示を確認します。
# drbdadm role insight   #Standbyの表示を確認します。
Primaryにする台に対して
# drbdadm primary --force insight
# drbdsetup status insight --verbose --statistics       #PrimaryとSecondaryの『disk』、『connection』項目の表示を確認します。
#『out-of-syn』が「0」になることの確認も必要です。
4.7 ファイルシステムをxfsでフォーマットし、マウントする(Primaryのみ)
# mkfs -t xfs /dev/drbd1
# mount /dev/drbd1 /drbd
# df -h     #mountされていることを確認します。

5. PosgreSQLの構築と設定

5.1 postgresユーザーを作成し、rootユーザーの環境変数を設定します。(2台共通)
# cp -p ~/.bash_profile ~/.bash_profile.bak
# vi ~/.bash_profile
--------------------------------------
export PGHOME=/usr/pgsql-11
export PGDATA=/drbd/data
PATH=$PATH:HOME/bin:$PGHOME/bin
export PATH
--------------------------------------
# diff ~/.bash_profile.bak ~/.bash_profile
# cat ~/.bash_profile
# source ~/.bash_profile

# groupadd -g 1002 postgres
# useradd -u 1002 -g 1002 -m postgres -p postgres       #nfsはuidを参照するため、各サーバーのuidを揃えます。
# mkdir -p $PGDATA
# mkdir /drbd/arclog
# chown -R postgres:postgres /drbd
# ls -ld /drbd && ls -l /drbd
5.2 PostgreSQLのインストール(2台共通)

PostgreSQL11のインストール方法

# 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
5.3 データベースとデータベース監視ユーザーの作成、設定ファイルの編集(Primaryのみ)
# su postgres
$ initdb
$ cp -p /drbd/data/postgresql.conf /drbd/data/postgresql.conf.bak
$ vi /drbd/data/postgresql.conf
--------------------------------------
listen_addresses = '*'
archive_mode = on
archive_command = '/bin/cp %p /drbd/arclog/%f'
--------------------------------------
$ diff /drbd/data/postgresql.conf.bak /drbd/data/postgresql.conf

$ cp -p /drbd/data/pg_hba.conf /drbd/data/pg_hba.conf.bak
$ vi /drbd/data/pg_hba.conf
---------------------------------------------------
host all all 192.168.249.37/32 trust
host all all 192.168.249.38/32 trust
---------------------------------------------------
$ diff /drbd/data/pg_hba.conf.bak /drbd/data/pg_hba.conf

$ pg_ctl start
$ createuser -P pgdba  #パスワードの設定をします(今回は「P@ssw0rd」とします)。
$ pg_ctl -D /drbd/data stop
$ exit

6. Pacemakerのリソース設定

6.1 DRBDのアンマウント(Primaryのみ)
# umount /drbd
# drbdadm secondary insight     #この作業は初めてリソース設定をする場合にのみ行います。
6.2 リソースを記述したファイルを作成して適用(Primaryのみ)
# vi cib.txt
 

リソースの設定例(クリックで展開)

### Cluster Option ###
property \
no-quorum-policy="ignore" \
stonith-enabled="false" \
startup-fencing="false" \
pe-error-series-max="100" \
pe-input-series-max="100" \
pe-warn-series-max="100"

### Resource Defaults ###
rsc_defaults resource-stickiness="INFINITY" \
migration-threshold="2"

### Primitive Configuration ###
primitive db.vip ocf:heartbeat:IPaddr2 \
params ip="192.168.249.39" nic="eth2" cidr_netmask="24" \
op monitor interval="5" timeout="30" \

primitive db.fs ocf:heartbeat:Filesystem \
params device="/dev/drbd1" fstype="xfs" directory="/drbd" \
op monitor interval="5" timeout="40" on-fail=restart \
op start timeout="60" on-fail=restart \
op stop timeout="60" on-fail=block

primitive db.pgsql ocf:heartbeat:pgsql \
params pgctl="/usr/pgsql-11/bin/pg_ctl" \
ctl_opt="-w" \
psql="/usr/pgsql-11/bin/psql" \
pgdata="/drbd/data" \
monitor_user="pgdba" monitor_password="P@ssw0rd" \
pgdb="template1" \
monitor_sql="select now();" \
op start interval="0" timeout="120" \
op stop interval="0" timeout="120" \
op monitor interval="30" timeout="120" \

### Group Configuration ###
group grp_db \
db.fs \
db.vip \
db.pgsql

# crm configure load update cib.txt

7. 状態の確認と動作テスト

7.1 状態を確認する。(2台共通)
# crm configure show        #cib.txtと内容が同じであることを確認します。
# crm_mon       #2台とも『ONLINE』であることを確認します。
# drbdsetup status insight --verbose --statistics       #PrimaryとSecondaryの『disk』、『connection』項目の表示を確認します。
7.2 リソースで指定したVIPがPrimary側で表示されるかを確認(Primaryのみ)
# ip a
7.3 PostgreSQLでのテスト

PostgreSQLにデータベースとテーブルを作成します。

# su postgres
$ psql -h 192.168.249.39 #VIPを指定
=# CREATE DATABASE test_db;
=# \l
=# \c test_db
=# CREATE TABLE test_table();
=# \d

Primary側のpacemakerを停止させます。

$ exit
# systemctl stop pacemaker

Secondaryにリソースが移動したかを確認します。

# crm_mon
# drbdsetup status insight --verbose --statistics

テーブルが存在するか確認します。

# su postgres
$ psql -h 192.168.249.39
=# \l
=# \c test_db
=# \d

Secondaryにリソースで指定したVIPが表示されているか確認します。

$ ip  a

終わりに

大変長くなってしまいましたが、最後までご覧いただきありがとうございました。
今回ブログに書かせていただいた『PostgreSQL+Pacemaker+DRBD』による高可用性構成は障害の検知と迅速な復旧やメンテナンス時の停止時間の短縮などシステム運用上重要な役割を果たします。そのためLinux上でPostgreSQLを稼働させるシステムを構築する上では必須の技術となるでしょう。
また最初にも書かせて頂きましたが、LinuC試験やPostgreSQLの勉強をしているという方がいらっしゃいましたら、私もそうでしたが、このように実際に手を動かしてみるとアーキテクチャや構築の手順が机上の勉強以上に頭に入って来やすいため、大変オススメです!
※構築の手順や使用コマンドが数通り存在する場合(ex. Pacemakerを管理するコマンドにはcrmコマンドとpcsコマンドがある)もあるので参考程度と思ってください。

余談にはなりますが、株式会社インサイトはLPI-JAPAN OSS-DBアカデミック認定校としてOSS-DB技術者認定資格の取得を支援しているため、今後もPostgreSQLの技術情報やパフォーマンス・チューニングに関する情報とともにOSS-DB技術者認定資格や、この資格の付随するLinuC試験などの対策や情報なども含めてお伝えしたいと思いますので、どうぞよろしくお願いいたします。

お問い合わせ

https://www.insight-ltd.co.jp/contact/

OSS-DB技術者認定資格教材の概要と購入について

https://store.insight-ltd.co.jp/category/item/itemgenre/oss-db/postgresql-training/

関連記事

PostgreSQLにおけるレプリケーション機能とPgpool-IIについて
PostgreSQLミドルウェア Pgpool-IIの便利機能3選
Pgpool-II+PostgreSQL+Zabbbixの組み合わせ構築

CATEGORY

ARCHIVE

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

CONTACT