AWS上のZabbixをPacemakerで冗長化 その2(DRBD編)

| コメントをどうぞ

前回はAWS上のZabbixをPacemaker + RDS冗長化しましたので今回は、

● Pacemaker + DRBD

をやります。


前提条件としてDRBDは既にインストール/設定済みとします。(導入部分も書くと長くなる為。機会があれば別途DRBD導入方法も書きます。)

  • Pacemaker(HeartbeatV2) + DRBD

  • cluster2

    前回のheartbeatの設定ファイル、cib.xml等が/var/lib/heartbeat/crmに残っている為、一旦削除します。
    (稼働/待機両方で消します。残っていると同期されて元に戻ってしまう為)

    ● 稼働/待機系で前回の設定ファイル削除(/var/lib/heartbeat/crmの下を全消しでOK)

    # rm /var/lib/heartbeat/crm/* -fr
    

    ● 一旦heartbeatを起動

    # /etc/init.d/heartbeat start
    

    DRBD用のxmlファイルを置いて起動するつもりでしたが、何故かうまく行かず一旦起動後に置き換える
    方法を取らないとならなくなっている為。heartbeatでxmlを修正したのにうまく行かない事がありますが
    その場合も置き換えで上手く行く場合が多いです。

    ● cib.xml無しで起動すると以下のようになります。(クラスタホストが認識されているだけの状態)

    ============
    Last updated: Fri Dec  5 12:46:25 2014
    Stack: Heartbeat
    Current DC: zabbixcluster-2 (e1c9433f-8e5b-8681-2867-5a4dd5880dfe) - partition w
    ith quorum
    Version: 1.0.13-30bb726
    2 Nodes configured, unknown expected votes
    0 Resources configured.
    ============
    
    Online: [ zabbixcluster-1 zabbixcluster-2 ]
    

    ● ここでZabbix+DRBD用のファイルを以下のようにどこかのディレクトリ(/tmpなどどこでもOK)用意します。

    ※nodeidなどは環境に合わせて適宜置き換えます。

    <cib validate-with="pacemaker-1.0" crm_feature_set="3.0.1" have-quorum="1" dc-uuid="e1c9433f-8e5b-8681-2867-5a4dd5880dfe" admin_epoch="0" epoch="20" num_updates="0" cib-last-written="Wed Sep 17 10:46:40 2014">
      <configuration>
        <crm_config>
          <cluster_property_set id="cib-bootstrap-options">
            <nvpair id="cib-bootstrap-options-dc-version" name="dc-version" value="1.0.13-30bb726"/>
            <nvpair id="cib-bootstrap-options-cluster-infrastructure" name="cluster-infrastructure" value="Heartbeat"/>
            <nvpair id="cib-bootstrap-options-default-resource-stickiness" name="default-resource-stickiness" value="200"/>
            <nvpair id="cib-bootstrap-options-no-quorum-policy" name="no-quorum-policy" value="ignore"/>
            <nvpair id="cib-bootstrap-options-stonith-enabled" name="stonith-enabled" value="false"/>
          </cluster_property_set>
        </crm_config>
        <nodes>
          <node id="f76af805-bfff-66bd-3d83-95a20a3807ef" uname="zabbixcluster-1" type="normal"/>
          <node uname="zabbixcluster-2" type="normal" id="e1c9433f-8e5b-8681-2867-5a4dd5880dfe">
            <instance_attributes id="nodes-e1c9433f-8e5b-8681-2867-5a4dd5880dfe"/>
          </node>
        </nodes>
        <resources>
          <master id="ms_drbd_r0">
            <meta_attributes id="ms_drbd_r0-meta_attributes">
              <nvpair id="ms_drbd_r0-meta_attributes-master-max" name="master-max" value="1"/>
              <nvpair id="ms_drbd_r0-meta_attributes-master-node-max" name="master-node-max" value="1"/>
              <nvpair id="ms_drbd_r0-meta_attributes-clone-max" name="clone-max" value="2"/>
              <nvpair id="ms_drbd_r0-meta_attributes-clone-node-max" name="clone-node-max" value="1"/>
              <nvpair id="ms_drbd_r0-meta_attributes-notify" name="notify" value="true"/>
            </meta_attributes>
            <primitive class="ocf" id="drbd_r0" provider="linbit" type="drbd">
              <instance_attributes id="drbd_r0-instance_attributes">
                <nvpair id="drbd_r0-instance_attributes-drbd_resource" name="drbd_resource" value="r0"/>
              </instance_attributes>
              <operations>
                <op id="drbd_r0-monitor-20" interval="20" name="monitor" role="Slave" timeout="20"/>
                <op id="drbd_r0-monitor-10" interval="10" name="monitor" role="Master" timeout="20"/>
                <op id="drbd_r0-start-0" interval="0" name="start" timeout="240"/>
                <op id="drbd_r0-stop-0" interval="0" name="stop" timeout="100"/>
              </operations>
            </primitive>
          </master>
          <group id="group_zabbix">
            <primitive class="ocf" id="mount_r0" provider="heartbeat" type="Filesystem">
              <instance_attributes id="mount_r0-instance_attributes">
                <nvpair id="mount_r0-instance_attributes-device" name="device" value="/dev/drbd0"/>
                <nvpair id="mount_r0-instance_attributes-fstype" name="fstype" value="ext4"/>
                <nvpair id="mount_r0-instance_attributes-directory" name="directory" value="/drbd0"/>
                <nvpair id="mount_r0-instance_attributes-options" name="options" value="noatime"/>
              </instance_attributes>
              <operations>
                <op id="mount_r0-monitor-10" interval="10" name="monitor" timeout="60"/>
                <op id="mount_r0-start-0" interval="0" name="start" timeout="60"/>
                <op id="mount_r0-stop-0" interval="0" name="stop" on-fail="stop" timeout="60"/>
              </operations>
            </primitive>
            <primitive class="lsb" id="httpd" type="httpd">
              <operations>
                <op id="httpd-start-0" interval="0" name="start" timeout="60">
                  <instance_attributes id="httpd-start-0-instance_attributes">
                    <nvpair id="httpd-start-0-instance_attributes-prereq" name="prereq" value="fencing"/>
                    <nvpair id="httpd-start-0-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="httpd-monitor-10" interval="10" name="monitor" timeout="60">
                  <instance_attributes id="httpd-monitor-10-instance_attributes">
                    <nvpair id="httpd-monitor-10-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="httpd-stop-0" interval="0" name="stop" timeout="60">
                  <instance_attributes id="httpd-stop-0-instance_attributes">
                    <nvpair id="httpd-stop-0-instance_attributes-on_fail" name="on_fail" value="ignore"/>
                  </instance_attributes>
                </op>
              </operations>
            </primitive>
            <primitive class="lsb" id="mysqld" type="mysqld">
              <operations>
                <op id="mysqld-start-0" interval="0" name="start" timeout="60">
                  <instance_attributes id="mysqld-start-0-instance_attributes">
                    <nvpair id="mysqld-start-0-instance_attributes-prereq" name="prereq" value="fencing"/>
                    <nvpair id="mysqld-start-0-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="mysqld-monitor-10" interval="10" name="monitor" timeout="60">
                  <instance_attributes id="mysqld-monitor-10-instance_attributes">
                    <nvpair id="mysqld-monitor-10-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="mysqld-stop-0" interval="0" name="stop" timeout="60">
                  <instance_attributes id="mysqld-stop-0-instance_attributes">
                    <nvpair id="mysqld-stop-0-instance_attributes-on_fail" name="on_fail" value="ignore"/>
                  </instance_attributes>
                </op>
              </operations>
            </primitive>
            <primitive class="lsb" id="zabbix_server" type="zabbix_server">
              <operations>
                <op id="zabbix_server-start-0" interval="0" name="start" timeout="60">
                  <instance_attributes id="zabbix_server-start-0-instance_attributes">
                    <nvpair id="zabbix_server-start-0-instance_attributes-prereq" name="prereq" value="fencing"/>
                    <nvpair id="zabbix_server-start-0-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="zabbix_server-monitor-10" interval="10" name="monitor" timeout="60">
                  <instance_attributes id="zabbix_server-monitor-10-instance_attributes">
                    <nvpair id="zabbix_server-monitor-10-instance_attributes-on_fail" name="on_fail" value="restart"/>
                  </instance_attributes>
                </op>
                <op id="zabbix_server-stop-0" interval="0" name="stop" timeout="60">
                  <instance_attributes id="zabbix_server-stop-0-instance_attributes">
                    <nvpair id="zabbix_server-stop-0-instance_attributes-on_fail" name="on_fail" value="ignore"/>
                  </instance_attributes>
                </op>
              </operations>
            </primitive>
          </group>
        </resources>
        <constraints>
          <rsc_colocation id="db_on_drbd" rsc="mount_r0" score="INFINITY" with-rsc="ms_drbd_r0" with-rsc-role="Master"/>
          <rsc_order first="ms_drbd_r0" first-action="promote" id="order_db_after_drbd" score="INFINITY" then="group_zabbix" then-action="start"/>
        </constraints>
      </configuration>
    </cib>
    

    ● 上記で作成したcib.xmlをheartbeatを起動したまま以下のコマンドで置き換えます。

    # cibadmin --replace --xml-file cib.xml.drbd
    

    ● そうするとすぐにheartbeat側で反映されます。

    Online: [ zabbixcluster-1 zabbixcluster-2 ]
    
     Master/Slave Set: ms_drbd_r0
         Masters: [ zabbixcluster-1 ]
         Slaves: [ zabbixcluster-2 ]
     Resource Group: group_zabbix
         mount_r0   (ocf::heartbeat:Filesystem):    Started zabbixcluster-1
         httpd      (lsb:httpd):    Started zabbixcluster-1
         mysqld     (lsb:mysqld):   Started zabbixcluster-1
         zabbix_server      (lsb:zabbix_server):    Started zabbixcluster-1
    

    heartbeatで用意されているOCFを使うとDRBDプロセスの他にMaster/Slaveの状態も監視してくれるのでheartbeatのcolocationとorderで指定する事によって、DRBDがMasterで動いている方でZabbix、mysql、httpdを起動するクラスタが構成出来ます。(片系が壊れてStandAloneになってもMasterで動いている方で稼働します。)

    ● DRBDで片系故障時

    Online: [ zabbixcluster-2 ]
    OFFLINE: [ zabbixcluster-1 ]
    
     Master/Slave Set: ms_drbd_r0
         Masters: [ zabbixcluster-2 ]
         Stopped: [ drbd_r0:0 ]
     Resource Group: group_zabbix
         mount_r0   (ocf::heartbeat:Filesystem):    Started zabbixcluster-2
         httpd      (lsb:httpd):    Started zabbixcluster-2
         mysqld     (lsb:mysqld):   Started zabbixcluster-2
         zabbix_server      (lsb:zabbix_server):    Started zabbixcluster-2
    

    Zabbixサーバに意図的に障害を起こさせるテストをしていた際に気づいたのですが、状況によってはZabbixサーバが完全に死なない場合があります。親プロセス(usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf)のみがしぶとく生き残る為にheartbeatからは生きているように見えるのですが、実際は監視自体は止まってしまっている場合があります。今回発生が確認出来たのはMySQLは動いているけどZabbixは接続出来ないという状態を動作中に発生させた場合になりました。何らかの対処が必要になります。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>