ラベル GFS2 の投稿を表示しています。 すべての投稿を表示
ラベル GFS2 の投稿を表示しています。 すべての投稿を表示

2017/10/12

CentOS7 で GFS2 を構築/本番運用したノウハウまとめ

GFS2 を構築したり運用した時のノウハウを共有。
どちらかと言うと「こういう事もあったなー」的なエピソードのまとめです。


systemctl restart network はしてはいけない

死にます。
単一ノードの reboot は問題無くできます。
といって network の restart はノードが fence されてしまってクラスタから切り離されます。
クラスタから切り離されるのはまだ良い方で、最悪 HACluster 全体を巻き込んで死にます。
具体的には gfs2 を mount しているディレクトリに ls したら永遠に返ってこない。
全体を reboot で復活します。
network の configuration を変える時は pcs stop --all とかしてくださいね。


fsck.gfs2 は(直る時もある|直らない時もある)

死んだ時にはファイルが壊れたりするのですが、場合によれば fsck.gfs2 で直ります。
ただし、直らない時もあります。具体的には24時間以上かかっても終わらない。
gfs2 のサイズを大きく(テラオーダー)作ったのが原因かもしれませんが、直らない時は直らないです。
gfs2 を作った後に小さくすることはできませんが、大きくすることはできるます。
なので、最初は小さいサイズから作るのが良さそうです。


CPU/Network の利用率が100%になると fence される

各ノードの死活管理には fence というものを使います。
初期設定だと Network の利用率が100% になった時、ノードがクラスタから外されます。
あとは CPU の使用率が高すぎる時とか。
VMイメージのバックアップを取るためにノードが死んだりしました。
まー1ノードくらい落ちても動くための HACluster だから良いのかもしれないけれど。


umount までできるスクリプトを組んでおく + PowerChute との連携はしっかり

当然ですが、gfs2 上にあるファイルに読み書きしている時には umount できません。
例えば VM を gfs2 に置いてると、destroy する必要があります。
停電した際に電源が UPS に切り替わった時、 umount できないと焦ります。
スクリプトとかを書いておいて、よしなにしてくれるようにした方が良いでしょう。
出来れば pcs で管理して、gfs2 を止める時に kvm で動いている VM を全て destroy した方が良いです。
あとは停電対策として PowerChute とかとも連携すると良いですね。


scsi-shooter は暇なノードに置いておくと良い

fence を行なうノードはクラスタに1つで良いです。
なので、全ノードが fence 用のプロセスを起動している訳ではない。
死活監視のプロセスなので忙しいノードよりは暇なノードに置いた方が良いことが多いです(さっきの100%問題とか)。


公式ドキュメントを読もう

というかgfs2の参考文献とかだと公式ドキュメントしかなかったりします。
設定から何から書かれているので読みましょう。


環境

  • OS: CentOS Linux release 7.2.1511 (Core) 
  • Kernel: 3.10.0-327.10.1.el7.x86_64
  • pcs: 0.9.143


参考

2016/12/21

qcow2 の cluster leak を直す

qcow2 の cluster leak を直してみたログ。
オチがついてて原因が完全特定できていないのでふわっとしたお話。


環境

Host OS: CentOS 7.1.1503
Host Kernel: 3.10.0-327.4.5.el7.x86_64
qemu-img: 1.5.3


状況

VMイメージ を GFS2 上に置いているVMで ls が返ってこない。
pcs から見る限り clvmd も dlm も全ノード上で動いているし全ノード online になっている。
過去にクラスタの1ノードが物理的な問題で急に落ちたこともあって VM イメージの破損を疑ってみる。
調べてみると qcow2 の整合性の確認には qemu-img の check コマンドを使うことができるらしい。

qemu-img check を qcow2 に対して打つとこんな結果が返ってくる。
[root@hoge ~]# qemu-img check /mnt/hoge/fuga.qcow2
Leaked cluster 42362 refcount=1 reference=0
Leaked cluster 42363 refcount=1 reference=0
Leaked cluster 42364 refcount=1 reference=0
Leaked cluster 42365 refcount=1 reference=0
4 leaked clusters were found on the image.
This means waste of disk space, but no harm to data.
65043/524288 = 12.41% allocated, 0.15% fragmented, 0.00% compressed clusters
Image end offset: 4264099840
何やらエラーが返ってきている。
同じ GFS2 の上にある VM に対しても qemu-img check すると
[root@hoge ~]# qemu-img check /mnt/hoge/piyo.qcow2
No errors were found on the image.
468877/524288 = 89.43% allocated, 0.13% fragmented, 0.00% compressed clusters
Image end offset: 30733303808
と返すので問題の VM のみがエラーを吐いているらしい。


解決方法

qemu-img check -h を読んでいると -r オプションがあって、リカバリを試すことができる様子。
Parameters to check subcommand:
  '-r' tries to repair any inconsistencies that are found during the check.
       '-r leaks' repairs only cluster leaks, whereas '-r all' fixes all
       kinds of errors, with a higher risk of choosing the wrong fix or
       hiding corruption that has already occurred.
今回は cluster leak のようなので qemu-img -check r leaks を実行してみた。
どうやら上手くいったようで check してもエラーを返さなくなった。
直したイメージを起動すると ls が返ってきたのでめでたしめでたし。


オチ

これで直ったと思っていたらlsを返さない他のVMを発見。
そしてこいつは qemu-img check でエラーを返さない。
修復した VM の /var/log/messages に、 nfs への書き込みが time out している kernel panic っぽいものを発見。
両方のVMは同じ nfs をマウントしてたので nfs が原因説が濃厚に。
ちなみにある時間から nfs head server がレスポンスを返さない状態になっていたらしい。
おそらく前にもあった案件と同じ原因では無いかと思ってます。
しかし若干の謎があって、nfsをマウントしていたVMは最低限3つある上2つは死んでいたのに1つだけは生きていた。
しかも生きていたVMの mount option に intr は無い。
生きてたVMは書き込していなかった、とすれば辻褄はあうのですがそれはログからは分からなかった。

nfs server 側は私が直接触っていないので余計曖昧な情報ですが、レスポンスを返さない原因は特定のパーティションの容量が一杯だったせいとか。
容量一杯で nfs への書き込みができないのはともかく、それでハングするものなのだろうか。
最終的な対応としては nfs server 側の容量を空けることでおしまい。


ということで qcow2 の cluster leak を直したものの、本来の原因では無かった可能性がある。

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 のお世話になりました)


参考文献