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

構成

環境
  • 構築環境

postgresql-9.0.3
pgpool-II-3.0.3
heartbeat-2.1.4
libnet-1.1.2.1
pgpool-ha-1.3

概要
  • 構築イメージ


前回の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">'