pgpool-IIで負荷分散めも その2 pgpool-ha編
PostgreSQLのツール、pgpool-IIとpgpool-ha、heartbeatで負荷分散、高可用構成でサービスを構築するメモの2
前回の構成だと、pgpool-IIサーバがシングルポイントになってしまうため、heartbeat2.0とpgpool-HAを使って冗長構成にします。
参考
pgpool-HAとは
pgpool-haの本家
http://pgpool.sraoss.jp/index.php?pgpool-HA
heartbeatをつかってpgpool-IIの高可用な構成を組むときに使用する制御スクリプト。このメモのきもはどちらかというと、heartbeatのほうです。
heartbeatとは
heartbeatについてです。
http://www.linux-ha.org/
本家ユーザガイド
http://www.linux-ha.org/ClusterInformationBase/UserGuide
DRBDのサイトですが、heartbeat、CRMについてよくまとまっていて、ここを読むとかなりわかります。
http://www.drbd.jp/users-guide/ch-heartbeat.html
構成
概要
- 構築イメージ
前回のpgpool-IIによる負荷分散構成ではpgpool-IIサーバがダウンした場合、サービスが停止してしまいます。そのため、pgpool-IIサーバの冗長化が必要ですが、ここではheartbeat2.0(とCRM(Cluster Resource Manager))とpgpool-HAを使用して構築を行います。
ほかの構築方法としては、下記イメージのように、Webサーバにpgpool-IIをたててpgpool-IIがダウンしても、サービス全体がダウンしないようにする方法があります。
- webサーバにpgpool-IIをたてる場合
- heatbeatとpgpool-HAの役割
プロセスやサーバの監視はheartbeatを使って行います。pgpool-HAには、pgpoolの監視スクリプト,起動スクリプト,終了スクリプトが記述されていて、CRM構成のheartbeat2.0で実行する事でpgpoolの監視、再起動、系切り替えを行います。
インストール
postgresql、pgpool-IIについてはこちらを参考にしてください。
- libnetインストール
heartbeatに必要です。
http://libnet.sourceforge.net/
cd /usr/local/src wget ftp://ftp.eenet.ee/pub/gentoo/distfiles/libnet-1.1.2.1.tar.gz tar zxf libnet-1.1.2.1.tar.gz cd libnet ./configure --prefix=/usr/local make su - cd /usr/local/src/libnet make install exit
- heartbeat
http://linux-ha.org/wiki/Download
グループ(haclient)もついでに追加しておきます。
su - groupadd -g 1000 haclient useradd -g haclient -s /sbin/nologin -d / -M hacluster exit cd /usrlocal/src wget http://hg.linux-ha.org/lha-2.1/archive/tip.tar.bz2 tar jxf Heartbeat-STABLE-2-1-STABLE-2.1.4.tar.bz2 cd Heartbeat-STABLE-2-1-STABLE-2.1.4 ./ConfigureMe configure make su - cd /usr/local/src/Heartbeat-STABLE-2-1-STABLE-2.1.4 make install exit
- pgpool-HA
http://pgfoundry.org/projects/pgpool/からダウンロード
cd /usr/local/src wget http://pgfoundry.org/frs/download.php/2871/pgpool-ha-1.3.tar.bz2 tar jxf pgpool-ha-1.3.tar.bz2 cd pgpool-ha-1.3 ./configure cd ./src make su - cd /usr/local/src/pgpool-ha-1.3/src make install
HA構成設定
HA構成詳細
- pgpool-ha構成詳細図
- pgpoolサーバの切り替えについて
待機サーバからheartbeatによる死活監視によりアクティブなpgpoolサーバのダウンが検出されると、pgpool接続で使用する仮想IP(VIP)が待機サーバに割り当てられ、pgpoolプロセスが起動されます。クライアントからはpgpoolに接続するIPの変更はないため、瞬間的にアクセスが途切れるだけですむようになります。
- heartbeatの監視方法について
heartbeatはUDPベースの通信プロトコルを使用し、ノードの可用性を定期的にチェックします。今回は以下の通信方法でチェックします。
-
- IPユニキャスト
eth2(10.0.0.11)のUDPポート694番を使用します。
/dev/ttyS0(baud:19200)を使用します。
また、pgpool-haをheartbeat2.0で使用する場合、CRM構成モードでのheartbeatクラスタの実行が必要です。CRM構成については以下に。
- heartbeat CRM構成
heartbeatクラスタには、次のような設定ファイルが必要です。
/etc/ha.d/ha.cf | グローバルクラスタ構成 |
/etc/ha.d/authkeys | ノードの相互認証用キー |
CRMクラスタの場合は、heartbeat構成の一部が次の設定ファイルに記述されます。
/etc/ha.d/ha.cf
crm yes # trueでもよい
/etc/ha.d/authkeys
上記以外のクラスタ構成は、 CIB (Cluster Information Base: クラスタ情報ベース)に格納されています。
- クラスタ情報ベース
クラスタ情報ベース(CIB)は1つのXMLファイル /var/lib/heartbeat/crm/cib.xmlに記述されています。
CIBにはクラスタ構成 (cib.xmlファイルに記述される変化しない情報) および現在のクラスタ状態についての (変化する)情報の両方が含まれています。そのため、新しいクラスタ構成を作成する場合以外は、このファイルの内容を直接編集することは避けてください。(そのためのコマンドが用意されています。詳細はAPPENDIXあたりに)
HA構成設定
- ホスト設定
vi /etc/hosts
192.168.0.11 server1 192.168.0.12 server2
- 設定ファイルコピー
cp -a /usr/share/doc/heartbeat-2.1.4/ha.cf /etc/ha.d/ cp -a /usr/share/doc/heartbeat-2.1.4/authkeys /etc/ha.d/
vi /etc/ha.d/authkeys
auth 1 1 crc
vi /etc/modprob.conf
options softdog nowayout=0
cl_status hbparameter -p watchdog
vi /etc/ha.d/ha.cf
logfile /var/log/ha-log Logfacility local0 # syslog設定 keepalive 2 # 2秒間隔で監視 deadtime 10 # 10秒応答がないとエラー warntime 5 # 5秒で警告 initdead 10 # 起動時 udpport 694 # 監視udpポート serial /dev/ttyS0 # シリアルデバイス baud 19200 # シリアル通信速度 ucast eth2 10.0.0.11 # ユニキャストアドレス。サーバによって変更 watchdog /dev/watchdog # 自ノード監視 auto_failback off node server1 # uname-nで表示するサーバ名。/etc/hostsで設定したもの node server2 # uname-nで表示するサーバ名。/etc/hostsで設定したもの # ネットワーク疎通確認用IPアドレス。ルータなど ping 192.168.1.100 respawn root /usr/lib64/heartbeat/pingd -m 100 -d 5s -a default_ping_set crm true
vi /var/lib/heartbeat/crm/cib.xml
<cib admin_epoch="0" num_updates="0" epoch="1" have_quorum="true" cib_feature_revision="1.0"> <configuration> <crm_config> <cluster_property_set id="cib-bootstrap-options"> <attributes> <!-- 実行時に設定される --> <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="2.1.4-node: aa909246edb386137b986c5773344b98c6969999"/> </attributes> </cluster_property_set> </crm_config> <nodes><!-- 実行時に設定される --></nodes> <resources> <!-- pgpoolのグループを追加する --> <group id="grp_pgpool"> <!-- 監視するIPアドレスの設定 --> <primitive class="ocf" id="pgpool_if" provider="heartbeat" type="IPaddr"> <operations> <op id="pgpool_if_mon" interval="3" name="monitor" timeout="5" on_fail="restart"/> </operations> <instance_attributes id="grp_pgpool_if_instance_att"> <attributes> <!-- 仮想IPアドレス --> <nvpair id="pgpool_if_attr_ip" name="ip" value="192.168.0.13"/> <!-- ネットマスク --> <nvpair id="pgpool_if_attr_mask" name="cidr_netmask" value="24"/> <!-- ネットワークインタフェース --> <nvpair id="pgpool_if_attr_nic" name="nic" value="eth1"/> </attributes> </instance_attributes> </primitive> <!-- pgpoolの設定 pgpool-HAを使用してプロセス監視、起動、終了を行う --> <primitive class="ocf" id="pgpool_proc" provider="heartbeat" type="pgpool"> <operations> <op id="pgpool_proc_mon" name="monitor" interval="3" timeout="20" start_delay="1m" on_fail="restart"/> </operations> <instance_attributes id="grp_pgpool_proc_instance_att"> <attributes> <!-- pgpoolの接続設定ファイル等 --> <nvpair id="pgpool_conf_path" name="pgpoolconf" value="/usr/local/pgpool/etc/pgpool.conf"/> <nvpair id="hba_conf_path" name="hbaconf" value="/usr/local/pgpool/etc/pool_hba.conf"/> <nvpair id="pcp_conf_path" name="pcpconf" value="/usr/local/pgpool/etc/pcp.conf"/> <nvpair id="log_file_path" name="logfile" value="/usr/local/pgpool/log/pgpool.log"/> <nvpair id="pid_file_path" name="pidfile" value="/var/run/pgpool/pgpool.pid"/> </attributes> </instance_attributes> </primitive> </group> </resources> <constraints> <rsc_location id="rsc_location_pingd" rsc="grp_pgpool"> <rule id="rscloc_pingd" score_attribute="default_ping_set"> <expression id="rscloc_pingd_1_defined" attribute="default_ping_set" operation="defined"/> </rule> </rsc_location> <rsc_location id="rsc_location_grp_pgpool" rsc="grp_pgpool"> <rule id="rscloc_grp_pgpool_2" score="-INFINITY" boolean_op="or"> <expression attribute="default_ping_set" id="rscloc_grp_pgpool_2_undefined" operation="not_defined"/> <expression attribute="default_ping_set" id="rscloc_grp_pgpool_2_zero" operation="lte" value="0"/> </rule> </rsc_location> </constraints> </configuration> </cib>
- 起動
/etc/init.d/heartbeat start # 動作確認 crm_mon -i 5 # サービス登録 chkconfig --add heartbeat chkconfig heartbeat on
APPENDIX
- cibadmin コマンド
CIBにはクラスタ構成 (cib.xmlファイルに記述される変化しない情報) および現在のクラスタ状態についての (変化する)情報の両方が含まれています。そのため、heartbeat起動後は、cib.xmlは直接編集しないで、cibadminコマンドでリソースの追加、削除を行う必要があります。
- リソース追加
追加するリソースをadd_resource.xml(ファイル名はなんでもOKです)に記述します。
vi add_resource.xml
<resources> <group id="grp_pgpool"> <!-- PgPool-II 192.168.0.14 --> <primitive class="ocf" id="pgpool_proc_2" provider="heartbeat" type="pgpool"> <operations> <op id="pgpool_proc_mon_2" name="monitor" interval="5" timeout="20" start_delay="1m"/> </operations> <instance_attributes id="grp_pgpool_proc_instance_att_2"> <attributes> <nvpair id="pgpool_conf_path_2" name="pgpoolconf" value="/usr/local/pgpool/etc/pgpool_2.conf"/> <nvpair id="hba_conf_path_2" name="hbaconf" value="/usr/local/pgpool/etc/pool_hba.conf"/> <nvpair id="pcp_conf_path_2" name="pcpconf" value="/usr/local/pgpool/etc/pcp.conf"/> <nvpair id="log_file_path_2" name="logfile" value="/usr/local/pgpool/log/pgpool_2.log"/> <nvpair id="pid_file_path_2" name="pidfile" value="/var/run/pgpool/pgpool_2.pid"/> </attributes> </instance_attributes> </primitive> </group> </resources>
cibadminコマンドでadd_resource.xmlを流し込みます。
cibadmin -U -x add_resource.xml
- リソース削除
削除するリソースを直接指定します。
cibadmin -D -X '<primitive class="ocf" id="pgpool_proc_2" provider="heartbeat" type="pgpool">'