[wiki:ScalableStorageWithOSS02 OSS だけでスケーラブルなストレージを安価に構築する方法 #2] のつづき。今回はストレージサーバ側で GNBD によりブロックデバイスをエクスポートし、クライアント側でインポートするまでの手順を紹介します。
用途的にはクラスタリングする必要はないのですが、GNBD でエクスポートする際に、cman(Cluster Manager) を動かす必要があるため、まずは cman をインストール、設定、起動して、ストレージクラスタを構成します。
といっても、クラスタリングは本来の趣旨とははずれるので、設定は適当。
まずは storage0a と storage0b をクラスタリング。最初に storage0a で cman をインストール。
$ sudo yum -y install cman
storage0a で ccs_tool を実行し、/etc/cluster/cluster.conf のスケルトンを作成。
$ sudo /sbin/ccs_tool create storage0
/etc/cluster/cluster.conf を以下のように修正。
<?xml version="1.0"?>
<cluster name="storage0" config_version="1">
<clusternodes>
<clusternode name="storage0a.example.org" nodeid="1" votes="1"/>
</clusternodes>
<fencedevices/>
<rm>
<failoverdomains/>
<resources/>
</rm>
</cluster>
cman を起動。
$ sudo /etc/init.d/cman start
次に、sorage0b をクラスタに追加するべく、/etc/cluster/cluster.conf を、storage0a 上で修正。
<?xml version="1.0"?>
<cluster name="storage0" config_version="2">
<clusternodes>
<clusternode name="storage0a.example.org" nodeid="1" votes="1"/>
<clusternode name="storage0b.example.org" nodeid="2" votes="1"/>
</clusternodes>
<fencedevices/>
<rm>
<failoverdomains/>
<resources/>
</rm>
</cluster>
configversion の値をインクリメントしておくのがポイント。ccstool update を実行して、設定を反映。
$ sudo /sbin/ccs_tool update /etc/cluster/cluster.conf
次に storage0b 側で cman を起動。
$ sudo yum -y install cman
$ sudo /sbin/ccs_tool create storage0
$ sudo /etc/init.d/cman start
/etc/cluster/cluster.conf は、storage0a から自動的にコピーされる。cman_tool nodes を実行すると、クラスタメンバが表示される。
$ sudo /sbin/cman_tool nodes
Node Sts Inc Joined Name
1 M 24 2008-10-25 04:29:59 storage0a.example.org
2 M 4 2008-10-25 04:23:50 storage0b.example.org
storage0a と storage0b のクラスタリングができたら、storage1a と storage1b を同様にクラスタリング。上記で storage0 と書かれているところを storage1 と読み替えて、同じ手順を実行。
次に、storage0a, storage0b で GNBD によりブロックデバイスをエクスポート。まずは gnbd をインストール。
$ sudo yum -y install gnbd
gnbd_serv を起動。
$ sudo /sbin/gnbd_serv
gnbd_serv: startup succeeded
エクスポート。storage0a では以下のように。-d で指定するデバイス名は、DRBD デバイスを指定。-e では適当なエクスポート名をつける。
$ sudo /sbin/gnbd_export -d /dev/drbd0 -e gnbd0a -u0
gnbd_export: created GNBD gnbd0a serving file /dev/drbd0
storage0b では以下のように、-e オプションで指定するエクスポート名を変える。-u で指定する UID は、storage0a と storage0b で同じにする必要がある。(Device-Mapper Multipath で同一デバイスと認識させるため。)
$ sudo /sbin/gnbd_export -d /dev/drbd0 -e gnbd0b -u0
gnbd_export: created GNBD gnbd0b serving file /dev/drbd0
-l オプションで、エクスポート状態を確認できる。
$ sudo /sbin/gnbd_export -l
Server[1] : gnbd0a
--------------------------
file : /dev/drbd0
sectors : 2096944
readonly : no
cached : no
timeout : 60
uid : 0
strage1a, storage1b でも同様にエクスポートする。
GNBD でインポートするクライアント側でも cman を動かす必要があるので、client0, client1 で cman を動かす。後に出てくる CLVM でも必要。注意点は、ccs_tool create で指定するクラスタ名を、ストレージクラスタで指定したものを別にすること。
$ sudo /sbin/ccs_tool create client
あとの手順はストレージの時と一緒。
client0, client1 でストレージサーバからエクスポートされているデバイスをインポートする。以下の手順を、client0, client1 双方で実行。
まずは GNBD カーネルモジュールと GNBD をインストール。
$ sudo yum -y install kmod-gnbd-xen gnbd
インポートする。
$ sudo /sbin/modprobe gnbd
$ sudo /sbin/gnbd_import -i storage0a.example.org
$ sudo /sbin/gnbd_import -i storage0b.example.org
$ sudo /sbin/gnbd_import -i storage1a.example.org
$ sudo /sbin/gnbd_import -i storage1b.example.org
-l オプションでインポート状況を確認。
$ sudo /sbin/gnbd_import -l
Device name : gnbd0a
----------------------
Minor # : 0
sysfs name : /block/gnbd0
Server : storage0a.example.org
Port : 14567
State : Close Connected Clear
Readonly : No
Sectors : 2096944
Device name : gnbd0b
----------------------
Minor # : 1
sysfs name : /block/gnbd1
Server : storage0b.example.org
Port : 14567
State : Close Connected Clear
Readonly : No
Sectors : 2096944
Device name : gnbd1a
----------------------
Minor # : 2
sysfs name : /block/gnbd2
Server : storage1a.example.org
Port : 14567
State : Close Connected Clear
Readonly : No
Sectors : 2096944
Device name : gnbd1b
----------------------
Minor # : 3
sysfs name : /block/gnbd3
Server : storage1b.example.org
Port : 14567
State : Close Connected Clear
Readonly : No
Sectors : 2096944
デバイスファイルを確認してみる。
$ ls /dev/gnbd/
gnbd0a gnbd0b gnbd1a gnbd1b
/dev/gnbd/gnbd0a は、/dev/gnbd0 と同じデバイス。他も同様。
ここまでセットアップした状態を図にすると、以下のようになります。GNBD により、ネットワーク越しにブロックデバイスにアクセスできるようになっています。
次回は DM-MP あたりを解説予定。