これで安心!信頼性を高めるサーバのクラスタ構成 Part2

  • このエントリーをはてなブックマークに追加
  • Pocket

Part1 ではクラスタ構成の基礎部分まで構築しましたが、今回は実際にサービスを動作させるための設定を行っていきたいと思います。

 

HeartBeatとPacemakerの関係性

クラスタ環境でサービスを動作させるために、Pacemaker というものを使用します。

HeartBeat と Pacemaker については Part1 でざっくりと説明していましたが、それぞれどのような動きをし、どういった関係なのかもう少し詳しく見ていきましょう。

 

HeartBeat

Heartbeat は「クラスタサーバの管理システム」として動作します。

 

各サーバの死活監視を行っており、Heartbeat を実行しているサーバは、「ハートビート」と呼ぶパケットを他のサーバに向けて定期的に送信し、他のサーバは応答を返します。

一定時間応答がないサーバは、停止したと見なされてクラスタから取り除かれます。

電源不良や kernel Panic など、ハードウェアや OS に関する障害が発生した場合に、これを検知します。

また、Heartbeat は Pacemaker が必要とする通信を仲介し、クラスタ全体の実行ログも管理します。

 

Pacemaker

Pacemaker は「クラスタリソースの管理システム」として動作します。

クラスタリソースとは、クラスタサーバで有効化されたり実行されるサービスなどのことをいいます。

 

共有ディスク型のクラスタ構成で動作しているデータベースを例にすると、現用系のサーバでは以下のような流れでクラスタリソースが起動されます。

 

  1. データベースのデータ領域となるディスクをマウントする。
  2. 外部アクセスで使用される仮想IPアドレスを有効化する。
  3. データベースを起動する。

 

上記の様に起動したクラスタリソースの状況を、Pacemaker が定期的に監視します。

クラスタリソースが正常に動作していなければ再起動を行い、それでも正常に動作しない場合は、リソース全体を待機系サーバに移動します。

これがフェイルオーバーとなります。

 

つまり、クラスタ構成で問題なくサーバが動作しているか相互に確認する基礎となる部分が Heartbeat で、クラスタ上で動作するサービスを管理・制御するものが Pacemaker となります。

 

heartbeart

 

 

 

クラスタリソース設定事前準備

では、さっそくクラスタリソースの設定をやっていきましょう!

と言いたいところですが、その前にやらなくてはならないことがいろいろあります。

 

今回は、共有ディスク型のクラスタ構成で PostgreSQL を動作させたいと考えています。

ですので、クラスタリソースの設定の前に、以下をやっておかないといけません。

 

  1. 共有ディスクの設定
  2. ファイルシステムの作成
  3. PostgreSQLのインストール・設定

 

では、ちゃっちゃとやっていきましょう。

 

 

共有ディスクの設定

 

共有ディスクの設定は、現用系サーバのみで実行します。

 

サーバに割り当てられた共有ディスクの情報を表示し、パーティションが作成されていないことを確認します。

[root]# fdisk -l
…省略…
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
ディスク /dev/sdb は正常な領域テーブルを含んでいません

 

 

パーティションを作成します。

[root]# fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルをディスク識別子 0x5893f949 で作成します。
あなたが書き込みを決定するまで、変更はメモリ内だけに残します。
その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
^
コマンド (m でヘルプ): n          ← 新たに領域を作成
コマンドアクション
e   拡張
p   基本パーティション (1-4)
p          ← 基本パーティションを作成
パーティション番号 (1-4): 1
最初 シリンダ (1-2610, 初期値 1):           ← 初期値を使用するため何も入力せず[Enter]
初期値 1 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-2610, 初期値 2610):     ← 初期値を使用するため何も入力せず[Enter]
初期値 2610 を使います
^
コマンド (m でヘルプ): p          ← 領域テーブルを表示
^
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
^
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1        2610    20964793+  83  Linux
^
コマンド (m でヘルプ): w          ← テーブルをディスクに書き込み、終了
パーティションテーブルは変更されました!
^
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
[root]#

 

 

パーティションが作成されたことを確認します。

[root]# fdisk -l
…省略…
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes
^
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1        2610    20964793+  83  Linux

 

 

ファイルシステムの作成

現用系サーバでファイルシステムを作成します。

[root]# mkfs -t ext4 /dev/sdb1
…省略…
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
^
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root]#

 

マウントポイントを現用系/待機系の両サーバで作成します。

[root]# mkdir /share_disk01

 

現用系サーバでファイルシステムをマウントします。

[root]# mount /dev/sdb1 /share_disk01

 

共有ディスクのファイルシステムのマウントは Pacemaker で制御するため、サーバ起動時にファイルシステムのマウントを自動化する /etc/fstab の設定は行いません。

 

 

PostgreSQLのインストール・設定

PostgreSQLのソフトウェアを現用系/待機系の両サーバのローカルディスクにインストールします。

データベースの作成は現用系サーバのみで行い、データ領域(データベースクラスタ)は共有ディスクに作成します。

 

インストール方法などは、以前紹介した「CentOS7にPostgreSQL9.3と最新のもので環境構築してみた。」を参考にして下さい。

 

PostgreSQLの起動スクリプトを /etc/init.d ディレクトリに作成します。

今回は、PostgreSQLのソースコードにあるサンプルスクリプトを使用しました。

[root]# cp <ソースコード展開ディレクトリ>/contrib/start-scripts/linux /etc/init.d/postgres
[root]# chmod 755  /etc/init.d/postgres

 

また、PostgreSQLの起動・停止は Pacemaker で制御するため、OS の Service としては登録しません。

登録しても問題ないですが、その場合は自動起動しないように全てのランレベルを off にしておきます。

 

 

クラスタリソース設定

さて、いよいよクラスタリソースの設定です。

 

まずは、Heartbeat と Pacemaker が起動していることを確認します。

[root]# crm_mon -A
============
Last updated: Mon Jan  5 03:49:57 2015
Stack: Heartbeat
Current DC: node2 (9453ca83-74d7-415b-aa3e-074237a5605e) – partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
0 Resources configured.
============
^
Online: [ node1 node2 ]
^
vip(ocf::heartbeat:IPaddr2):    Started node1
^
Node Attributes:
* Node node1:
* Node node2:

 

 

crmコマンドでクラスタリソース設定モードになります。

[root]# crm configure
crm(live)configure#

 

init スクリプトにより PostgreSQL を制御します。

crm(live)configure# primitive PostgreSQL lsb:postgres \
>op monitor interval=”30s” timeout=”60s” on-fail=”restart” \
>op start interval=”0s” timeout=”60s” on-fail=”restart” \
>op stop interval=”0s” timeout=”60s” on-fail=”fence”
crm(live)configure#

 

Filesystem リソースエージェントを使用し、Filesystem リソースを設定します。

crm(live)configure# primitive share_fs ocf:heartbeat:Filesystem \
>params device=”/dev/sdb1″ directory=”/share_disk01″ fstype=”ext4″ \
>op monitor interval=”20s” timeout=”40s” \
>op start interval=”0″ timeout=”60s” \
>op stop interval=”0″ timeout=”60s”
crm(live)configure#

 

リソースをグループ化します。

crm(live)configure# group Cluster vip share_fs PostgreSQL
crm(live)configure#

 

設定を反映し、クラスタリソース設定モードを終了します。

crm(live)configure# commit
crm(live)configure# exit
bye
[root]#

 

上記のクラスタリソース設定での書式や設定項目については、以下のサイトを参照してください。

Linux-HA Japan – 動かして理解するPacemaker ~CRM設定編~ その2

STONITH 機能と自動フェイルバックを無効化します。

[root]# crm configure property no-quorum-policy=”ignore” stonith-enabled=”false”
[root]# crm configure rsc_defaults resource-stickiness=”INFINITY” migration-threshold=”1″
[root]#

 

 

設定を確認します。

[root]# crm configure show
node $id=”4a9fa8fb-2b62-4147-a6de-a1743b256eac” node1
node $id=”9453ca83-74d7-415b-aa3e-074237a5605e” node2
primitive PostgreSQL lsb:pgsql \
^   op start interval=”0s” timeout=”60s” on-fail=”restart” \
  op monitor interval=”30s” timeout=”60s” on-fail=”restart” \
^   op stop interval=”0s” timeout=”60s” on-fail=”fence”
primitive share_fs ocf:heartbeat:Filesystem \
  params device=”/dev/sdb1″ directory=”/share_disk01″ fstype=”ext4″ \
^   op monitor interval=”20s” timeout=”40s” \
^   op start interval=”0″ timeout=”60s” \
^   op stop interval=”0″ timeout=”60s”
primitive vip ocf:heartbeat:IPaddr2 \
^   params ip=”10.1.1.3″ nic=”eth0″ cidr_netmask=”24″ \
^   op start interval=”0s” timeout=”60s” \
^   op monitor interval=”5s” timeout=”20s” \
  op stop interval=”0s” timeout=”60s”
group Cluster vip share_fs PostgreSQL
property $id=”cib-bootstrap-options” \
^   dc-version=”1.0.13-a83fae5″ \
  cluster-infrastructure=”Heartbeat” \
^   stonith-enabled=”false” \
^   no-quorum-policy=”ignore”
rsc_defaults $id=”rsc-options” \
  resource-stickiness=”INFINITY” \
^   migration-threshold=”1″
[root]#

 

 

Pacemaker の状態を確認します。

[root]# crm_mon -A
============
Last updated: Mon Jan  5 03:49:57 2015
Stack: Heartbeat
Current DC: node2 (9453ca83-74d7-415b-aa3e-074237a5605e) – partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
^
Online: [ node1 node2 ]
^
Resource Group: Cluster
vip(ocf::heartbeat:IPaddr2):    Started node1
share_fs   (ocf::heartbeat:Filesystem):    Started node1
PostgreSQL (lsb:postgres):    Started node1
^↑ 作成したリソースがnode1(現用系サーバ)で起動していることが確認できます。
Node Attributes:
* Node node1:
* Node node2:

 

 

 

動作確認

無事クラスタリソースの設定が完了し、正常に動作していることが確認できました。

では、実際にフェイルオーバーできるか試してみましょう。

 

PostgreSQLのプロセスを kill します。

[root]# ps -ef | grep “postmaster -D” | grep -v grep
postgres  1991     1  0 04:03 ?        00:00:00 /usr/local/pgsql/bin/postmaster -D /share_disk01/pgsql/data
[root]#
[root]# kill 1991
[root]#

 

うまくフェイルオーバーできたか確認してみましょう。

[root]# crm_mon -A
============
Last updated: Mon Jan  5 03:49:57 2015
Stack: Heartbeat
Current DC: node2 (9453ca83-74d7-415b-aa3e-074237a5605e) – partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
^
Online: [ node1 node2 ]
^
Resource Group: Cluster
vip        (ocf::heartbeat:IPaddr2):       Started node1
share_fs   (ocf::heartbeat:Filesystem):    Started node1
PostgreSQL (lsb:postgres):    Started node1 FAILED
^
Node Attributes:
* Node node1:
* Node node2:
^
Failed actions:
PostgreSQL_monitor_30000 (node=node1, call=10, rc=7, status=complete): not running
PostgreSQL_stop_0 (node=node1, call=26, rc=1, status=complete): unknown error

 

ん〜PostgreSQLのクラスタリソースの停止処理でエラーになってる(ノД`)

ログとか見ながら原因調査…

 

原因はPostgreSQLのプロセスを kill したことでPIDファイルが無くなったからでした。

Pacemaker で PostgreSQL を停止するときは、/etc/init.d/postgres を使用する様に設定してましたが、PIDファイルが無いと /etc/init.d/postgres が異常終了してました。

取り敢えずPIDファイルが存在しない場合は、PostgreSQL の停止処理をスルーする様に /etc/init.d/postgres を修正。

 

クラスタリソースが正常に動作している状態まで戻して、再度PostgreSQLのプロセスを kill してみます。

 

今度はどうだ?っとフェイルオーバーできたか確認してみます。

[root]# crm_mon -A
============
Last updated: Mon Jan  5 03:49:57 2015
Stack: Heartbeat
Current DC: node2 (9453ca83-74d7-415b-aa3e-074237a5605e) – partition with quorum
Version: 1.0.13-a83fae5
2 Nodes configured, unknown expected votes
1 Resources configured.
============
^
Online: [ node1 node2 ]
^
Resource Group: Cluster
vip        (ocf::heartbeat:IPaddr2):       Started node2
share_fs   (ocf::heartbeat:Filesystem):    Started node2
PostgreSQL (lsb:postgres):    Started node2
^
Node Attributes:
* Node node1:
* Node node2:

 

よっし! ちゃんと待機系サーバのnode2にフェイルオーバーできてる(^O^)

何とか無事終わってよかったよかったw

 

 

まとめ

今回はHAクラスタ構成を構築しましたが、DBサーバ単体として動作するものだったので、それほど難しくはありませんでした。

WEB/APサーバとしても使用するサーバだったり、その他のいろいろなサービスを動作させたりするサーバだったら、もっと複雑なクラスタリソースの制御が必要になり難しいと思うけど、今後挑戦していこうと思います!

 

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメントを残す

*