heartbeat CRM対応クラスタでDRBDを使用する

Linux-HA開発チームは、heartbeatリリース2ではCRMモードの使用を推奨しています。

メリット. R1スタイルとは対照的に、CRM モードには次のようなメリットがあります。

1つのCRMクラスタが最大255ノードをサポートするというメリットは、 DRBD自体が2ノードしかサポートしないため、 DRBDを使用するセットアップにはあまり関係がありません。

デメリット. R1スタイルと比べて、CRMモードには特に次のようなデメリットがあります。

heartbeat CRM構成

CRMクラスタの場合は、heartbeat構成ファイルの一部だけを使います。

  • /etc/ha.d/ha.cf (ha.cfファイル」を参照)CRMモードを有効にするには、この設定ファイルに次の行を記述する必要があります。

    crm yes
  • /etc/ha.d/authkeys. このファイルの内容はR1スタイルのクラスタのものと同じです。詳細は、authkeys ファイル」を参照してください。

上記以外のクラスタ構成は、 CIB (Cluster Information Base: クラスタ情報ベース)に格納されます。 詳細は、次のセクションを参照してください。上述の2つの設定ファイルとは異なり、 CIBを手動で配付する必要はありません。 heartbeatサービスにより自動的に配付されます。

クラスタ情報ベース

クラスタ情報ベース(CIB)は XMLファイル /var/lib/heartbeat/crm/cib.xmlに記述されます。ただし、ゼロから新しいクラスタ構成を作成する場合以外は、このファイルの内容を直接編集することは避けてください。heartbeatには、CIBを変更するためのコマンドラインアプリケーションとGUIが用意されています。

実際には、cib.xmlファイルに書き込まれるCIBにはクラスタ構成 (静的な情報) および現在のクラスタの状態 (変化する動的な情報)の両方が含まれます。 heartbeatコマンドラインツールまたはheartbeat GUIを使用して、状態情報も検索できます。

新しいheartbeat CRMクラスタを作成すると、新しい空のCIBが自動的に作成されます。 CRMクラスタの作成とは、 ha.cfおよびauthkeysファイルを作成してクラスタノード間に配付し、 heartbeatサービスを開始して、ノードがクラスタ間通信を確立するまで待機することを含みます。 CIBの内容は次のようになります。

<cib>
   <configuration>
     <crm_config>
       <cluster_property_set id="cib-bootstrap-options">
         <attributes/>
       </cluster_property_set>
     </crm_config>
     <nodes>
       <node uname="alice" type="normal"
             id="f11899c3-ed6e-4e63-abae-b9af90c62283"/>
       <node uname="bob" type="normal"
             id="663bae4d-44a0-407f-ac14-389150407159"/>
     </nodes>
     <resources/>
     <constraints/>
   </configuration>
 </cib>

このファイルの正確な形式と内容については、 Linux-HAのWebサイトを参照してください。ただし、この段階で理解しておくべきことは、このクラスタには alicebobという名前の2つのノードがあり、この時点ではリソースもリソース制約も構成されていないということです。

クラスタ構成にDRBDのサービスを追加する

ここでは、heartbeat CRMクラスタで、 DRBDで保護されたサービスを有効にする方法を説明します。ここで取り上げる例は、「heartbeatリソース」で説明されている R1スタイルのheartbeatクラスタに対応するものと、機能的には同様です。

ここで説明する構成手順はかなり複雑なため、 R1スタイルのheartbeat構成しか扱ったことがない人には難しく感じられるかもしれません。 heartbeat CRMクラスタの構成はたしかに複雑で、ユーザフレンドリでないことも多いですが、 CRMには、 R1スタイルのクラスタよりも大きなメリットがあります。いずれの方法を使用するかは、管理者の裁量で決定してください。

heartbeat CRM構成にdrbddiskリソースエージェントを使用する

CRMモードでheartbeatを使用している場合でも、 drbddiskなどのR1対応リソースエージェントを使用できます。このリソースエージェントにはセカンダリノードの監視機能はなく、リソースの昇格と降格だけが監視されます。

drbddiskを使用して、 heartbeat CRMクラスタでMySQLデータベース用のDRBDを使用する構成を有効にするには、次のような構成を使用します。

<group ordered="true" collocated="true" id="rg_mysql">
  <primitive class="heartbeat" type="drbddisk"
             provider="heartbeat" id="drbddisk_mysql">
    <meta_attributes>
      <attributes>
        <nvpair name="target_role" value="started"/>
      </attributes>
    </meta_attributes>
    <instance_attributes>
      <attributes>
        <nvpair name="1" value="mysql"/>
      </attributes>
    </instance_attributes>
  </primitive>
  <primitive class="ocf" type="Filesystem"
             provider="heartbeat" id="fs_mysql">
    <instance_attributes>
      <attributes>
        <nvpair name="device" value="/dev/drbd0"/>
        <nvpair name="directory" value="/var/lib/mysql"/>
        <nvpair name="type" value="ext3"/>
      </attributes>
    </instance_attributes>
  </primitive>
  <primitive class="ocf" type="IPaddr2"
             provider="heartbeat" id="ip_mysql">
    <instance_attributes>
      <attributes>
        <nvpair name="ip" value="192.168.42.1"/>
        <nvpair name="cidr_netmask" value="24"/>
        <nvpair name="nic" value="eth0"/>
      </attributes>
    </instance_attributes>
  </primitive>
  <primitive class="lsb" type="mysqld"
             provider="heartbeat" id="mysqld"/>
</group>

この構成を/tmp/hb_mysql.xmlという名前の一時ファイルに保存します。このリソースグループをクラスタ構成に追加するには、任意のクラスタノードで次のコマンドを実行します。

cibadmin -o resources -C -x /tmp/hb_mysql.xml

新しく構成したリソースグループは、 heartbeatによって自動的にすべてのクラスタノードに配付されます。

heartbeat CRM構成にdrbd OCFリソースエージェントを使用する

drbdリソースエージェントはいわば純粋なOCF RAで、マスター/スレーブ機能により、 heartbeatが複数のノードのDRBDリソースを開始して監視し、必要に応じて昇格と降格を行うことを可能にします。ただし、heartbeatを停止したりノードをスタンバイモードにすると、 drbd RAは管理するDRBDリソースを停止します。

drbd OCFリソースエージェントを使用して、 heartbeat CRMクラスタでMySQLデータベース用のDRBDを使用する構成を有効にするには、必要なリソースとheartbeat制約を作成し、すでに昇格したDRBDリソースのみでサービスが開始するように設定する必要があります。次に示す例のように、まず、制約を作成します。

<constraints>
  <rsc_order id="mysql_after_drbd" from="rg_mysql" action="start"
             to="ms_drbd_mysql" to_action="promote" type="after"/>
  <rsc_colocation id="mysql_on_drbd" to="ms_drbd_mysql"
                  to_role="master" from="rg_mysql" score="INFINITY"/>
</constraints>

たとえば、この設定を/tmp/constraints.xmlという名前のファイルに保存して、次のコマンドで有効にします。

cibadmin -U -x /tmp/constraints.xml

次に、対応する適切なリソースを作成します。

<resources>
  <master_slave id="ms_drbd_mysql">
    <meta_attributes id="ms_drbd_mysql-meta_attributes">
      <attributes>
        <nvpair name="notify" value="yes"/>
        <nvpair name="globally_unique" value="false"/>
      </attributes>
    </meta_attributes>
    <primitive id="drbd_mysql" class="ocf" provider="heartbeat"
        type="drbd">
      <instance_attributes id="ms_drbd_mysql-instance_attributes">
        <attributes>
          <nvpair name="drbd_resource" value="mysql"/>
        </attributes>
      </instance_attributes>
      <operations id="ms_drbd_mysql-operations">
        <op id="ms_drbd_mysql-monitor-master"
	    name="monitor" interval="29s"
            timeout="10s" role="Master"/>
        <op id="ms_drbd_mysql-monitor-slave"
            name="monitor" interval="30s"
            timeout="10s" role="Slave"/>
      </operations>
    </primitive>
  </master_slave>
  <group id="rg_mysql">
    <primitive class="ocf" type="Filesystem"
               provider="heartbeat" id="fs_mysql">
      <instance_attributes id="fs_mysql-instance_attributes">
        <attributes>
          <nvpair name="device" value="/dev/drbd0"/>
          <nvpair name="directory" value="/var/lib/mysql"/>
          <nvpair name="type" value="ext3"/>
        </attributes>
      </instance_attributes>
    </primitive>
    <primitive class="ocf" type="IPaddr2"
               provider="heartbeat" id="ip_mysql">
      <instance_attributes id="ip_mysql-instance_attributes">
        <attributes>
          <nvpair name="ip" value="10.9.42.1"/>
          <nvpair name="nic" value="eth0"/>
        </attributes>
      </instance_attributes>
    </primitive>
    <primitive class="lsb" type="mysqld"
               provider="heartbeat" id="mysqld"/>
  </group>
</resources>

たとえば、この設定を/tmp/resources.xmlという名前のファイルに保存して、次のコマンドで有効にします。

cibadmin -U -x /tmp/resources.xml

これで設定が有効になります。 DRBDリソースを昇格させるノードをheartbeatが選択し、同じノードでDRBDで保護されたリソースグループを開始します。

heartbeat CRM クラスタの管理

クラスタリソースの制御の引き継ぎ

CRMクラスタでは、次のようにクラスタリソースの制御を引き継ぎます。

  • 1つのクラスタリソースの手動テイクオーバ. リソースの移動をテストしたい場合や、手動負荷分散の手段としてリソースをローカルノードに移動したい場合に、この方法が適切です。この操作は次のコマンドで実行します。

    crm_resource -r resource -M -H `uname -n`

    [注記]注記

    crm_resourceコマンドの -M (または--migrate)オプションを -Hオプションなしで使用すると、リソースをローカルホストから移動するように指定できます。ローカルホスト移動するには、 -H オプションを指定し、ローカルホスト名をオプション引数として指定します。

    移行は永続的です。移動先として明示して移動させない限り、リソースは決しての移動元のノードに移動しません。クラスタのほぼ全体に障害が発生して、そのノードだけが動作している場合でも、このような移動は行われません。ほとんどの場合、このような挙動は望ましくありません。このためリソースの移動が完了したら、次のコマンドでこのような制約を取り除いてください。

    crm_resource -r resource -U

    リソースグループの定義内容や、順序および共存に関する制約の内容によって、Heartbeatは明示的に指定されたリソース以外のリソースも必要ならば移動します。

  • すべてのクラスタリソースの手動テイクオーバ. この手順では、対向ノードをスタンバイモードに切り替えます (hostname は対向ノードのホスト名)。

    crm_standby -U hostname -v on

クラスタリソースの放棄

いくつかの方法で、 heartbeat CRMクラスタノードに強制的に1つまたはすべてのリソースを放棄させることができます。

  • 1つのクラスタリソースの放棄. 次のコマンドを実行すると、ノードが1つのリソースの制御を放棄します。ここでも、前のセクションに記載された注意事項が適用されます。

    crm_resource -r resource -M 

    特定のホストに移動する場合は、次のコマンドを使用します。

    crm_resource -r resource -M -H hostname

    ただし、DRBDの制限が2ノードのため、後者の構文はDRBDを使用するCRMクラスタにはほとんど関係がありません。 2つのコマンドは実質的に同じ意味になります。

  • クラスタノードをスタンバイモードに切り替える. リソースの移行をテストしたい場合や、ノードをクラスタから削除する必要のない操作を行う場合には、この方法が適切です。この操作は次のコマンドで実行します。

    crm_standby -U `uname -n` -v on

  • ローカルクラスタ管理システムインスタンスのシャットダウン. これはソフトウェア更新などのローカル保守に適切です。この場合、ノードを一時的にクラスタから削除する必要がありますが、システムを再起動する必要はありません。手順は、heartbeat R1スタイルのクラスタの場合と同じです。

  • ローカルノードのシャットダウン. ハードウェアの保守など、システムのシャットダウンと再起動を必要とする場合に適切です。 heartbeat R1スタイルのクラスタの説明で述べた安全なシャットダウンコマンドを使用します。