RHEL5まではAPサブスクリプション上でクラスタと一体化して提供されていたが、RHEL6からはGFS2が単独のアドオンになった。
大まかな機能は以下のように振り分けられる。
CLVM・・・複数サーバ間で共有されるLVM2
GFS2・・・複数サーバ間から同時にアクセスできるファイルシステム
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 件のコメント:
コメントを投稿