2011年7月22日金曜日

RHEL6.1 を使い倒す Resilient Storage(GFS2)


このエントリーをはてなブックマークに追加


Resilient Storage はRHEL6のAdd-onパッケージの1つで、GFS2とCLVM、Clustered Samba(プレビュー版)が含まれている。

RHEL5まではAPサブスクリプション上でクラスタと一体化して提供されていたが、RHEL6からはGFS2が単独のアドオンになった。

大まかな機能は以下のように振り分けられる。

CLVM・・・複数サーバ間で共有されるLVM2
GFS2・・・複数サーバ間から同時にアクセスできるファイルシステム
Clustered Samba・・・複数サーバ間でCIFSのロック状態等を共有できるGFS2を前提としたSamba
Samba & ctdb ・・・gfs2上で稼働するクラスタSAMBA(ctdb)

ざっくり言えば Resilient Storage はプレビュー版ということはあるけど、IsilonのようなスケールアウトNASを実現するためのもの。サーバを並列に増やすことでサーバ側の帯域や処理能力を向上し、LUNを増やすことでストレージ側の処理能力を向上できる。


ここではまず3ノード、3ストレージを使った環境でのGFS2を実現してみる。


クイック設定

GFSとCLVMはRHEL5でクラスタ機能の一部として提供されていたが、RHEL6でGFSとクラスタが別々のアドオンになった。しかし分かれたのはライセンスによる課金の体系だけで、実態としてGFSはクラスタの一部というのは変わっていない。

そのためGFSを設定するにはクラスタの設定を行ってしまうのが一番手っ取り早い。


Conga - luci & ricci -

クラスタの設定をするのに最も簡単なのはCongaを使うこと。Congaはluci, ricci という二つのパッケージから成り立っている。

luci ・・・クラスタ管理サーバ
ricci ・・・luci から管理されるクラスタ設定エージェント


今回は以下のようなノード構成で実行する。

rhel6-1 ・・・luciサーバ

rhel6-2 ・・・クラスタノード1
rhel6-3 ・・・クラスタノード2
rhel6-4 ・・・クラスタノード3


設定準備

設定前にiptabesを無効にしておく。セキュリティを気にするならiptablesをしっかり設定しておこう。クラスタ関連のポートはこちらを参照。

[root@rhel6-1 ~]# /etc/init.d/iptables stop
[root@rhel6-2 ~]# /etc/init.d/iptables stop
[root@rhel6-3 ~]# /etc/init.d/iptables stop
[root@rhel6-4 ~]# /etc/init.d/iptables stop

[root@rhel6-1 ~]# /etc/init.d/ip6tables stop
[root@rhel6-2 ~]# /etc/init.d/ip6tables stop
[root@rhel6-3 ~]# /etc/init.d/ip6tables stop
[root@rhel6-4 ~]# /etc/init.d/ip6tables stop

[root@rhel6-1 ~]# chkconfig iptables off
[root@rhel6-2 ~]# chkconfig iptables off
[root@rhel6-3 ~]# chkconfig iptables off
[root@rhel6-4 ~]# chkconfig iptables off

[root@rhel6-1 ~]# chkconfig ip6tables off
[root@rhel6-2 ~]# chkconfig ip6tables off
[root@rhel6-3 ~]# chkconfig ip6tables off
[root@rhel6-4 ~]# chkconfig ip6tables off


Conga のインストール

事前にインストールメディアを使ってローカルリポジトリを構成しておく。

[root@rhel6-1 ~]# yum install luci
[root@rhel6-1 ~]# chkconfig luci on

* RHEL6 からのluci は luci_admin init を実行する必要はない。管理ユーザはPAMでOSユーザと連携している。


[root@rhel6-2 ~]# yum install ricci
[root@rhel6-3 ~]# yum install ricci
[root@rhel6-4 ~]# yum install ricci


ricciをインストールするとローカルユーザ「ricci」が作成される。パスワードが空なので設定しておく。

[root@rhel6-2 ~]# passwd ricci
[root@rhel6-3 ~]# passwd ricci
[root@rhel6-4 ~]# passwd ricci

[root@rhel6-2 ~]# chkconfig ricci on
[root@rhel6-3 ~]# chkconfig ricci on
[root@rhel6-4 ~]# chkconfig ricci on

ここまで来たら全ノードを一度リブートする。


luci からクラスタを構成する

全ノードが再起動してきたら ブラウザから https://luci_server_ip:8084 へアクセスする。luciが正常起動していれば管理画面へアクセスできる。

管理画面へのログインはOSの rootユーザ で行う。

ログインしたら早速クラスタを作成する。


ここで登録した各ノードで設定するパスワードはricciユーザのパスワードになる。rootでは無いので注意。

download packages にチェックを入れると ricci が必要なパッケージをyumでインストールしてくれる。

reboot nodes before joiniing cluster にチェックを入れるとクラスタに参加できたノードが自動的に再起動される(推奨

enable shared storage support にチェックを入れるとclvmがインストールされ、lvm.confでclvmが有効になる。
# Type of locking to use. Defaults to local file-based locking (1).
    # Turn locking off by setting to 0 (dangerous: risks metadata corruption
    # if LVM2 commands get run concurrently).
    # Type 2 uses the external shared library locking_library.
    # Type 3 uses built-in clustered locking.
    # Type 4 uses read-only locking which forbids any operations that might
    # change metadata.
    locking_type = 3


パッケージの追加中



追加完了しリブート待ち



無事クラスタが構成されると以下のようになる。



コマンドラインでの状態確認
[root@rhel6-2 ~]# clustat
Cluster Status for cluster01 @ Thu Jul 21 23:01:21 2011
Member Status: Quorate

 Member Name             ID   Status
 ------ ----             ---- ------
 rhel6-2.gfs2.com            1 Online, Local
 rhel6-3.gfs2.com            2 Online
 rhel6-4.gfs2.com            3 Online


GFSとCLVMはこれだけ設定すれば使える。厳密にやる場合はフェンスデバイスやクォーラムなんかも設定すると良い。最低限の設定ファイル。
[root@rhel6-2 ~]# cat /etc/cluster/cluster.conf
<?xml version="1.0"?>
<cluster config_version="1" name="cluster01">
        <clusternodes>
                <clusternode name="rhel6-2.gfs2.com" nodeid="1"/>
                <clusternode name="rhel6-3.gfs2.com" nodeid="2"/>
                <clusternode name="rhel6-4.gfs2.com" nodeid="3"/>
        </clusternodes>
        <cman/>
        <fencedevices/>
        <rm/>
</cluster>


clvmを構成する

各ノードではiscsiストレージを以下のように設定した。
[root@rhel6-2 ~]# iscsiadm -m node
192.168.1.50:3260,1 iqn.1986-03.com.sun:02:e5031b06-003c-667d-df6d-8a15a61c0df6
192.168.1.50:3260,1 iqn.1986-03.com.sun:02:91fd7c4e-ec83-658a-a345-d2663c3e8d49
192.168.1.50:3260,1 iqn.1986-03.com.sun:02:14ce1943-46c5-4393-8c58-d9864f7b699f


各ターゲットはrhel6-2から以下のようにパーティションを作成
デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1       30720    31457264   8e  Linux LVM
/dev/sdc1               1       30720    31457264   8e  Linux LVM
/dev/sdd1               1       30720    31457264   8e  Linux LVM


以下の作業は操作しているホスト名に注意する必要有り。

まずPVをrhel6-2から構成
[root@rhel6-2 ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created

[root@rhel6-2 ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created

[root@rhel6-2 ~]# pvcreate /dev/sdd1
  Physical volume "/dev/sdd1" successfully created

[root@rhel6-2 ~]# pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda2  vg_rhel62 lvm2 a-   99.51g     0
  /dev/sdb1            lvm2 a-   30.00g 30.00g
  /dev/sdc1            lvm2 a-   30.00g 30.00g
  /dev/sdd1            lvm2 a-   30.00g 30.00g


次にVGをrhel6-2から構成。 -c y をつけることでクラスタ用のVGが構成される。
-c, --clustered {y|n}
If clustered locking is enabled, this defaults to y indicating that this Volume Group
is shared with other nodes in the cluster.

If the new Volume Group contains only local disks that are not visible on the other
nodes, you must specify --clustered n. If the cluster infrastructure is unavailable
on a particular node at a particular time, you may still be able to use such Volume
Groups.
[root@rhel6-2 ~]# vgcreate -s 4m -c y clvg01 /dev/sdb1 /dev/sdc1 /dev/sdd1
  Clustered volume group "clvg01" successfully created

[root@rhel6-2 ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  clvg01      3   0   0 wz--nc 89.99g 89.99g
  vg_rhel62   1   2   0 wz--n- 99.51g     0


ここで各ノードのclvmを再起動すると、全ノードからlvmが参照可能になる。
[root@rhel6-2 ~]# /etc/init.d/clvmd restart
Restarting clvmd:                                          [  OK  ]

[root@rhel6-2 ~]# pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda2  vg_rhel62 lvm2 a-   99.51g     0
  /dev/sdb1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdc1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdd1  clvg01    lvm2 a-   30.00g 30.00g

[root@rhel6-2 ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  clvg01      3   0   0 wz--nc 89.99g 89.99g
  vg_rhel62   1   2   0 wz--n- 99.51g     0



[root@rhel6-3 ~]# /etc/init.d/clvmd restart
Restarting clvmd:                                          [  OK  ]

[root@rhel6-3 ~]# pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda2  vg_rhel63 lvm2 a-   99.51g     0
  /dev/sdb1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdc1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdd1  clvg01    lvm2 a-   30.00g 30.00g

[root@rhel6-3 ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  clvg01      3   0   0 wz--nc 89.99g 89.99g
  vg_rhel63   1   2   0 wz--n- 99.51g     0



[root@rhel6-4 ~]# /etc/init.d/clvmd restart
Restarting clvmd:                                          [  OK  ]

[root@rhel6-4 ~]# pvs
  PV         VG        Fmt  Attr PSize  PFree
  /dev/sda2  vg_rhel64 lvm2 a-   99.51g     0
  /dev/sdb1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdc1  clvg01    lvm2 a-   30.00g 30.00g
  /dev/sdd1  clvg01    lvm2 a-   30.00g 30.00g

[root@rhel6-4 ~]# vgs
  VG        #PV #LV #SN Attr   VSize  VFree
  clvg01      3   0   0 wz--nc 89.99g 89.99g
  vg_rhel64   1   2   0 wz--n- 99.51g     0


lvmを作成する。
[root@rhel6-2 ~]# lvcreate -L 50G -n clvm01 clvg01
  Logical volume "clvm01" created


クラスタ化されたVG上に作成したので、即全ノードから認識される。
[root@rhel6-2 ~]# lvs
  LV      VG        Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  clvm01  clvg01    -wi-a- 50.00g
  lv_root vg_rhel62 -wi-ao 97.54g
  lv_swap vg_rhel62 -wi-ao  1.97g

[root@rhel6-3 ~]# lvs
  LV      VG        Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  clvm01  clvg01    -wi-a- 50.00g
  lv_root vg_rhel63 -wi-ao 97.54g
  lv_swap vg_rhel63 -wi-ao  1.97g

[root@rhel6-4 ~]# lvs
  LV      VG        Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  clvm01  clvg01    -wi-a- 50.00g
  lv_root vg_rhel64 -wi-ao 97.54g
  lv_swap vg_rhel64 -wi-ao  1.97g


gfs2を構成する

作成したclvm上にgfs2ファイルシステムを作成する。
[root@rhel6-2 ~]# mkfs -t gfs2 -j 3 -p lock_dlm -t cluster01:gfs01 /dev/clvg01/clvm01
This will destroy any data on /dev/clvg01/clvm01.
It appears to contain: symbolic link to `../dm-2'

Are you sure you want to proceed? [y/n] y

Device:                    /dev/clvg01/clvm01
Blocksize:                 4096
Device Size                50.00 GB (13107200 blocks)
Filesystem Size:           50.00 GB (13107198 blocks)
Journals:                  3
Resource Groups:           200
Locking Protocol:          "lock_dlm"
Lock Table:                "cluster01:gfs01"
UUID:                      2869068F-8C33-83A9-5328-464589A7406E
-j 作成するジャーナル数を指定する。通常はノード数を同じ値。
-p ロック方式を指定。通常はlock_dlmを指定。1ノードでGFS2を使う(そんな状況は無いと思うけど)場合はlock_nolockを指定
-t 複数ノード間での情報共有のための識別子を指定する。:の前はgfs2を使うノードが参加しているクラスタ名を指定。:の後ろはそのクラスタ間で一意な名前(任意に指定可)


全ノードでマウントする。
[root@rhel6-2 ~]# mkdir /mnt/gfs01
[root@rhel6-2 ~]# mount -t gfs2 /dev/clvg01/clvm01 /mnt/gfs01

[root@rhel6-3 ~]# mkdir /mnt/gfs01
[root@rhel6-3 ~]# mount -t gfs2 /dev/clvg01/clvm01 /mnt/gfs01

[root@rhel6-4 ~]# mkdir /mnt/gfs01
[root@rhel6-4 ~]# mount -t gfs2 /dev/clvg01/clvm01 /mnt/gfs01

gfs2のマウントオプションは豊富にあるので暇な人は試してみてください。


動作確認

1ノードで作ったファイルを多ホストから参照してみる。
[root@rhel6-2 ~]# cp /var/log/messages /mnt/gfs01/

[root@rhel6-2 ~]# ls -alF /mnt/gfs01/
合計 244
drwxr-xr-x. 2 root root   3864  7月 21 23:46 2011 ./
drwxr-xr-x. 3 root root   4096  7月 21 23:42 2011 ../
-rw-------. 1 root root 231609  7月 21 23:46 2011 messages

[root@rhel6-2 ~]# wc -l /mnt/gfs01/messages
2764 /mnt/gfs01/messages


[root@rhel6-3 ~]# ls -alF /mnt/gfs01/
合計 244
drwxr-xr-x. 2 root root   3864  7月 21 23:46 2011 ./
drwxr-xr-x. 3 root root   4096  7月 21 23:42 2011 ../
-rw-------. 1 root root 231609  7月 21 23:46 2011 messages

[root@rhel6-3 ~]# wc -l /mnt/gfs01/messages
2764 /mnt/gfs01/messages


[root@rhel6-4 ~]# ls -alF /mnt/gfs01/
合計 244
drwxr-xr-x. 2 root root   3864  7月 21 23:46 2011 ./
drwxr-xr-x. 3 root root   4096  7月 21 23:42 2011 ../
-rw-------. 1 root root 231609  7月 21 23:46 2011 messages

[root@rhel6-4 ~]# wc -l /mnt/gfs01/messages
2764 /mnt/gfs01/messages


ノード間のファイルロックを確認

gfs2はノードをまたいだファイルロックを行うことができる。

まず1台のノードからファイルをロックして適当なコマンドを実行。

[root@rhel6-2 ~]# flock /mnt/gfs01/messages watch -n 1 ls
→ wathch -n 1 ls が実行される。


次に2台目のノードで同じコマンドを実行する

[root@rhel6-3 ~]# flock /mnt/gfs01/messages watch -n 1 ls
→ /mnt/gfs01/messages のロックを取得できないため無応答になる。
→ 最初のノードでC-cでコマンド終了すると2台目でもwatch -n 1 ls が実行される。


flockは第一引数で指定したファイルにロック(デフォルトは排他ロック)をかけて、第二引数のコマンド実行するコマンド。
flock(2) システムコールを使ってファイルロックを取得し、そのロックを保持する指定されたコマンドを実行する。指定するオプションにより、排他ロックにも共有ロックにもできる。また、ロック競合が発生した際の動作は、ロックが使用可能になるまで無限に待ち続ける (デフォルト) ように指定することも、指定された時間の後にロックが使用可能にならなければ失敗するように指定することもできる。時間を 0 に指定すると、コマンドは (訳註: ロックの取得を) 全く待たない。

--shared
共 有ロックを取得する。共有ロックの取得は、他者による共有ロックの取得を停止させないが
、他者による排他ロックの取得を停止させる。逆に、排他ロックの取得 (デフォルト) は、 他
者 による排他ロックの取得も共有ロックの取得も停止させる。一般的には、ロックされたデー
タをコマンドが単に読み込む場合には共有ロックが使用され、ロックされたデータにコマン ド
が書き込みを行う場合には排他ロックが使用される。

--timeout=n
n 秒以内にロックが取得できない場合は、中止 (abort) する。全くブロックせずにロックを取
得したい場合は、 --timeout=0 と指定すること。タイマーはロックの取得にのみ適用される。
ロ ックが取得されると、タイムアウトは直ちにキャンセルされる。実行されるコマンドはタイ
ムアウトの対象ではない。


とりあえずここまで、Clustered Sambaは次回。

0 件のコメント:

コメントを投稿