藤井@シャノンです。
今回は、Centos6.2上でpostgres9.1+pacemaker(非同期レプリケーション)で実現するDB高可用化です。
想定課題としては、
・今までのDBでは、PITRを利用し、データの冗長性を確保していた。そのためマスター障害発生時に切り替え時間がかかっていたのを自動化して短縮したい
・障害発生時のデータロストを最小にする
上記を解決するために今回の変更を実施します。
冗長構成の仕組み
通常時は、DB1とDB2でMaster-Slaveを構成し、非同期Replicationでデータの同期を取っています。
障害発生時には自動でDB2がMasterに昇格して、サービスは停止せず継続運用されます。
再びDB2が故障した場合は、DB3がマスターになって、DB1をStandbyに設定することでぐるぐる回っていきます。
この構成の利点は、フェールバック作業が不要なので、停止メンテナンスが要らないことです。
故障したサーバもゆっくり対応・修理が出来、詳細な原因追及やナレッジを作成する余裕ができます。サーバ一台余裕を持つコストより運用負担軽減とサービス向上のメリットが多いかなと思っています。
さてpostgresql9,pacemakerインストール手順です。
Postgresql9、Pacemakerインストール手順
前提条件:Centos6.2
【DB1、DB2、DB3全てにおいて実施】
1 ・古いPostgresの削除(初期から入っている場合があるため、念のため実施)
yum remove postgresql*
rpm -qa | grep postg
2 ・postgresql 9.1 rpm の取得
wget http://yum.postgresql.org/9.1/redhat/rhel-6-x86_64/pgdg-centos91-9.1-4.noarch.rpm
3 ・インストール
rpm --nodeps -ivh http://yum.postgresql.org/9.1/redhat/rhel-5-x86_64/pgdg-centos91-9.1-4.noarch.rpm
4 ・Yumの編集
vi /etc/yum.repos.d/CentOS-Base.repo
↓↓[base]セクションと[update]セクションに下記を追加
exclude=postgresql*
5 ・古いrepoを削除(存在する場合)
rm /etc/yum.repos.d/pgdg-84-centos.repo
6 ・インストール
yum install postgresql-server postgresql-contrib postgresql-devel
今回のバージョン:9.1.5-3PGDG.rhel5
7 ・initdb
パスを通す
ln -s /usr/pgsql-9.1/bin/initdb /usr/bin/initdb
ln -s /usr/pgsql-9.1/bin/pg_basebackup /usr/bin/
su - postgres
initdb -D /var/lib/pgsql/9.1/data/ --no-locale -E UTF8 ##ここら辺は環境に合わせて
8 ・Configの編集 (環境に合わせて編集して下さい)
・pg_hba.confの編集
・postgresql.confの編集
設定例:ストリーミングレプリケーション関連のみ記述しました
wal_level = hot_standby
max_wal_senders = 3
wal_keep_segments = 32
replication_timeout = 5000
hot_standby = on
wal_receiver_status_interval = 2
hot_standby_feedback = on
・init.dの編集
vi /etc/init.d/postgresql-9.1 ###”-i” の追加 下記を参考に
$su -l postgres -c "$PGENGINE/postmaster -i -p '$PGPORT' -D '$PGDATA' ${PGOPTS} &" >> "$PGLOG" 2>&1 < /dev/null
9 archive ディレクトリの作成
su - postgres
mkdir /var/lib/pgsql/data/archive
※まだPGSQL起動しない (鍵交換が必要)
10 Pacemakerインストール手順↓
wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -ivh epel-release-5-4.noarch.rpm
cd /etc/yum.repos.d/
wget http://clusterlabs.org/rpm/epel-5/clusterlabs.repo
yum install corosync.x86_64 heartbeat.x86_64 pacemaker.x86_64
今回はCorosyncではなくHeartBeatを利用します。
11 鍵交換 postgresユーザでパスワードなしでSSH接続出来るように設定する
su - postgres
ssh-keygen
scp .ssh/id_rsa.pub root@<相手DBのアドレス>:/tmp/<自分ホスト名>.pub
相手先にログイン
rootになって
chmod 666 /tmp/<相手DBホスト名>.pub
su - postgres
cat /tmp/<相手DBホスト名>.pub >> .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
12 slave側recovery.confの編集
vi /var/lib/pgsql/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=<MASTERのIP> port=5432 user=postgres application_name=hoge1 '
restore_command = 'scp postgres@<MASTERのIP>:$HOME/data/archive/%f %p < /dev/null'
13 heartbeatの初期設定
/etc/ha.d/ha.cfを環境に合わせて編集
/etc/ha.d/authkeysを環境に合わせて編集
chmod 600 /etc/ha.d/authkeys
/usr/lib/ocf/resource.d/heartbeat/Change_Pgの編集
シャノンでは/tmp/mentがある時にメンテナンスモードになるように書き換えています。
chmod 755 /usr/lib/ocf/resource.d/heartbeat/Change_Pg
/etc/init.d/heartbeat start
crm設定例 db-1を優先設定にしています。下記はほぼデフォルトですが、障害検知後の切り替えラグを、migration-thresholdとmigration-threshold、timeoutの組み合わせで調整すると良いです。デフォルトだと、切り替えまでが長すぎると思うので、試験しましょう。
誤検知を防ぐためにmigration-
crm
configure
primitive Change_Pg ocf:heartbeat:Change_Pg \
op start interval="0s" timeout="60s" on-fail="restart" \
op monitor interval="10s" timeout="60s" on-fail="restart" \
op stop interval="0s" timeout="60s" on-fail="ignore"
primitive pingCheck ocf:pacemaker:pingd \
params name="default_ping_set" host_list="192.168.3.253" multiplier="100" \
op start interval="0s" timeout="60s" on-fail="restart" \
op monitor interval="10s" timeout="60s" on-fail="restart" \
op stop interval="0s" timeout="60s" on-fail="ignore"
primitive vip-master ocf:heartbeat:IPaddr2 \
params ip="192.168.3.250" nic="br0:1" cidr_netmask="24" \
op start interval="0s" timeout="60s" on-fail="restart" \
op monitor interval="10s" timeout="60s" on-fail="restart" \
op stop interval="0s" timeout="60s" on-fail="block"
group master-group vip-master Change_Pg \
meta ordered="false"
clone clnPingCheck pingCheck
location rsc_location_group master-group \
rule $id="preferred_location_group_1" 100: #uname eq db-1.shanon.co.jp
property \
no-quorum-policy="ignore" \
stonith-enabled="false" \
crmd-transition-delay="1s"
rsc_defaults \
resource-stickiness="INFINITY" \
migration-threshold="750" \
failure-timeout="3600s"
14.HeartBeatを両方落とした後の始末 "HeartBeatを再起動しただけでは既存の設定(cib.xml)を読み込まないので、下記実施
cibadmin -U -x /var/lib/heartbeat/crm/cib.xml
初期化の場合は、
rm -f /var/lib/heartbeat/crm/*
以上になります。configの中身とかは、あまり細かく書きませんでした。
Change_Pgの中身は、start,stop,monitorの手前に"test ! -f /tmp/ment &&"を追加しています。
ではでは