2015/11/11

CentOS7 で HACluster を組んで GFS2 を mount したりノードを追加したりする

CentOS7 のマシン4台を使って iscsi + clvmd + gfs2 の HA Cluster を組んだログ。


環境

  • CentOS :  7.1.1503
  • Kernel : 3.10.0-229.20.1.el7
  • pcs : 0.9.137
  • dlm_controld : 4.0.2
  • clvmd : 2.02.115(2)-RHEL7 (2015-01-28)
  • iscsi-initiator-utils : 6.2.0.873-28


設定

  • ホスト名 : aquamarine, heliodor, malachite, topaz
  • クラスタ名 : sim
  • iscsi のデバイス : /dev/disck/by-id/dm-name-hoge
  • gfs2のストレージ名 : base
  • マウントポイント : /mnt/base


各ノードから iscsi でディスクへと接続する

iscsi 側の設定は省略します。
ディスクのフォーマットと各ノードのIPへのアクセス制限とマルチアクセスは許可されているものとします。
全ノードで
  • # yum install -y iscsi-initiator-utils gfs2-utils lvm2-cluster
  • # iscsiadm -m discovery -t sendtargets -p <iscsi-ip>
  • # iscsiadm -m node --login
してディスクを /dev/disk/by-id/dm-name-hoge として認識させます。
あと lvm のロックの設定を変更して gfs2 を使えるようにします。
  • # lvmconf --enable-cluster
これは設定の反映に再起動が必要なので reboot します。
/etc/lvm/lvm.conf の locking_type が 3 になっていれば OK です。


2ノードで HA Cluster を組む

ディスクの準備ができたところで、ここを参考に 2ノードで HA Cluster を組みます。
組むノードは aquamarine と heliodor 。
それぞれ /etc/hostname にホスト名の設定と、 /etc/hosts で相互にアドレス解決ができるようにしておきます。

## は全ノードで実行するコマンド、 a# は aquamarine で、 h# は heliodor で実行するコマンドです。

  • ## yum install -y pcs fence-agents-all
    • クラスタ管理用の pcs と各ノードの死活監視をする fence の agent を入れます
  • ## firewall-cmd --permanent --add-service=high-availability
  • ## firewall-cmd --add-service=high-availability
    •  firewalld で HA Cluster 用の通信を許可します
  • ## passwd hacluster
    • pcs でクラスタを管理する際に使用するユーザ hacluster のパスワードを設定します
    • pcs をインストールすると自動で追加されます
    • 全ノードで同じパスワードを設定しておきます
  • ## systemctl start pcsd
  • ## systemctl enable pcsd
    • pcsd の起動と自動起動を有効化しておきます
  • ## systemctl enable corosync
    • cluster の設定を同期する corosync の自動起動を有効化しておきます
  • ## systemctl enable pacemaker
    • cluster の各ノードをハートビートで監視をする pacemaker の自動起動を有効化しておきます
  • a# pcs cluster auth aquamarine heliodor -u hacluster
    • クラスタのノード間で認証します
    • パスワードは先程設定したパスワードです
    • 認証しておくと、1ノードだけの作業でクラスタ内で共有リソースを管理できます
    • なのでここからは aquamarine で作業していきます
  • a# pcs cluster setup --start --name sim aquamarine heliodor
    • クラスタ sim を作成します
  • a# pcs cluster start --all
    • 2ノードでクラスタをスタートします
    • # pcs status で状態が確認できます
    • 2ノードがオンラインになっていればOKです


2ノードのクラスタで GFS2 をフォーマットしてマウントする

ここ と ここを参考に GFS2 を構築します。
ディスクのパーティション設定は既に終わっているものとします。

  • a# pcs stonith create scsi-shooter fence_scsi devices=/dev/disk/by-id/dm-name-hoge pcmk_host_list='aquamarine heliodor'  meta provides=unfencing
  • a# pcs property set no-quorum-policy=freeze
    • scsi 用の fence デバイスを作成します
    • fence デバイスの名前は scsi-shooter です
    • fence は各ノードの死活監視をするものです
    • stonith はノードに異常を検出した場合にそのノードを遮断する機構のようです
    • 具体的には pacemaker で行なわれるようで、 systemctl status pacemaker で確認できます
    • pcmk_host_list はこのデバイスが監視できるノードのリストです
      • 今回は aquamarine と heliodor を監視します
    • この状態で pcs status をすると stonith が追加されているはずです
  • a# pcs resource create dlm ocf:pacemaker:controld op monitor interval=30s on-fail=fence clone interleave=true ordered=true
    • 各ノードが GFS2 にアクセスした際の排他制御をする dlm を resource として追加します
  • a# pcs resource create clvmd ocf:heartbeat:clvm op monitor interval=30s on-fail=fence clone interleave=true ordered=true
    • cluster 上で同じ logical volume を扱うために clvmd を resource として追加します
  • a# pcs constraint order start dlm-clone then clvmd-clone
    • dlm が起動してから clvmd が起動するように順序を設定します
  • a# pcs constraint colocation add clvmd-clone with dlm-clone
    • dlm と clvmd が同じ時に起動することを許可します
  • a# mkfs.gfs2 -p lock_dlm -t sim:base -j 2 /dev/mapper/hoge
    • journal 2 つで /dev/mapper/hoge を gfs2 でフォーマットします
    • lock は dlm を使います
  • a# pcs resource create fs_gfs2 Filesystem device="/dev/mapper/hoge" directory="/mnt/base" fstype="gfs2" options="noatime,nodiratime" op monitor interval=10s on-fail=fence clone interleave=true
    • gfs2 を resource として追加します
    • /mnt/base に mount するようにしています
  • a# pcs constraint order start clvmd-clone then fs_gfs2-clone
  • a# pcs constraint colocation add fs_gfs2-clone with clvmd-clone
    • gfs2 が clvmd よりも先に起動しないようにします
これで各ノードから gfs2 が見えるようになりました。
aquamarine でしか作業をしていませんが heliodor でも mount されています。
pcs status で各ノードと stonith と resource の状態を確認できます。
また、 pcs resource cleanup をすると stonith/resource の状態を更新できます。


クラスタのノード数を2から3にする

クラスタに topaz を追加します。
topaz での作業は t# と書きます。
  • a# pcs stonith update scsi-shooter pcmk_host_list='aquamarine heliodor malachite topaz' devices=/dev/disk/by-id/dm-name-hoge meta provides=unfencing
    • fence を許可するノードに topaz を追加します
      • おまけで malachite も追加します
    • この時に一時的に gfs2 が umount されます
    • どうやら fence device を追加したり update したりすると依存してるものが停止するようです
  • a# pcs cluster auth aquamarine heliodor topaz -u hacluster
    • ノードを追加するために topaz も auth します
  • a# pcs cluster node add topaz
    • topaz をクラスタに追加します
    • corosync が実行されてクラスタの設定が topaz に反映されます
    • この段階では pcs で Online になりますが、クラスタを topaz で起動していないので resource などは topaz で利用できません
  • a# gfs2_jadd -j1 /mnt/base
    • gfs2 に journal を追加します
    • journal は mount するノードの台数分だけ必要なので+1します
  • t# pcs cluster start
    • topaz で cluster を起動します
    • 自動で dlm, clvmd が起動して gfs2 も mount されます


クラスタのノード数を3から4にする

malachite もクラスタに追加します。
基本的にやることは同じで
  • a# pcs cluster auth aquamarine heliodor topaz malachite -u hacluster
    • クラスタに認証する
  • a# pcs cluster node add malachite
    • クラスタに追加する
  • a# gfs2_jadd -j1 /mnt/base
    • journal を追加する
  • a# pcs cluster start --all
    • クラスタを起動する
の手順です。
今回は起動を aquamarine でやっています。
加えて、 fence の pcmk_host_list に事前に malachite を追加していたので、gfs2が停止することはありません。


クラスタのノード数を4から3にする

クラスタからノードを外してみます
  • a# pcs cluster node remove topaz
    • topaz を外します
    • この段階で resource が topaz で利用できなくなります
    • topaz には cluster の設定も無くなります
topaz を除く他のノードは gfs2 をそのまま使えます。
3から2にすることも同じように可能です。


まとめ

4ノードで HA Cluster が組めました。
fence の pcmk_host_list の変更さえ気を付ければ gfs2 を mount したままノード数を減らしたり増やしたりできます。
以下 tips とか。


TIPS: gfs2 を fsck する

node が kernel panic などをおこして正常に終了しなかった場合など、 gfs2 に整合性の取れない書き込みなどが残る場合があります。
fsck でその部分を修復します。

  • a# pcs resource disable fs_gfs2-clone
    • fsck するために gfs2 を全ノードから umount します
  • a# fsck.gfs2 -y /dev/mapper/hoge
    • fsck します。
    • だいぶ酷い時は yes/no を聞いてくる回数が多いので -y 推奨です
    • 修復する時もありますが数時間で終わらない時もあります……
    • もちろんディスクのサイズとデータのサイズによります
  • a# pcs resource enable fs_gfs2-clone
    • fsck が終わったので全ノードで mount します


TIPS: 一部ノードだけ gfs2 を利用できなくする

一部ノードだけ gfs2 を umount する場合は
  • a# pcs resource ban heliodor
とかします。もう一度 mount する時は
  • a# pcs resource clear heliodor
とかです。


TIPS: Resource を他ノードに移動させる

stonith デバイスを明示的に特定のノードに移動させる場合は
  • a# pcs resource move scsi-shooter malachite
とかでできます。


TIPS: その他ちょっとしたこと

  • auth に使用するのは hostname の方が良いようです
  • resource の dlm と、 systemctl で見える dlm は別ものみたいです。
    • systemctl status dlm して inactive でもきちんと ps にはいます
  • 同じように、 clvmd は systemctl から見えないですけれど pcs で動いてる場合にはきちんと ps にいます。
  • ちなみに各ノードを reboot とかかけてもきちんと umonut して mount してくれます。
    • たまに終了が長かったりしますが
  • あと network の restart を mount したままやると dlm が大変なことになるのでやめた方が良いです。(これのせいで fsck のお世話になりました)


参考文献

0 件のコメント:

コメントを投稿