ちょっとスペースがあるのでCloudn上の仮想サーバでUbuntuサーバを起動してその上にGlusterFSを作ってみます。
- cloudn はNTTコミュニケーションのパブリッククラウドです。代替最小のノードで980円/月転送量が要らないのでパッと遊ぶときには便利です。
サーバの用意
この辺りを見るととりあえず動くだけであればメモリ1Gほどあれば良いみたいなので t1.micro でいきたいのですがこれは 0.5GRAMなんですよね。その上になると 2Gになってしまうのでとりあえず t1.micro で進めてみます。
またOSもRedhat系が多いのでここではUbuntuで実施してみます。
構成は以下のように進めて行きたいと思います。
- gluster01
- gluster02
- 利用クライアント:chance
これらをパブリッククラウド上に構成してみます。ディスクとしては gluster01/02にそれぞれディスクを40Gづつ追加して(別ディスク扱い)そこに分散ドライブを作成したいと思います。
GlusterFSの導入
手順は省きますが、このサーバは Ubuntu 12.10 です。とりあえずおまじないのごとく apt-get update / apt-get upgrade をしておきます。
以下のコマンドでレポジトリに追加
# apt-get install python-software-properties software-properties-common
# add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.3
# apt-get update
次にパッケージの導入をします
# apt-get install glusterfs-server glusterfs-client
次に起動の設定
# update-rc.d glusterfs-server defaults
以上で完了です。
プロセスはこんなかんじでした
root@gluster01:~# ps -ef | grep gluster
root 21929 1 0 11:17 ? 00:00:00 /usr/sbin/glusterd -p / var/run/glusterd.pid
ディスクの作成
ディスクを追加してみます。Cloudn上から40Gのディスクを作成して先ほどの gluster01にアタッチします。fdisk /dev/vdb ですべて1パーティションのLVM領域として確保します。また参考しているドキュメントにXFSでの利用が記載されていたのでその手順に従いたいと思います。
パーティションの作成
fdisk /dev/vdb か Partedコマンドなどでパーティションを作ります。タイプは8e(LVM)で作ります。
Disk /dev/vdb: 42.9 GB, 42949672960 bytes
16 heads, 63 sectors/track, 83220 cylinders, total 83886080 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x53d37261
Device Boot Start End Blocks Id System
/dev/vdb1 2048 83886079 41942016 8e Linux LVM
VGからLVまでの作成
ざっくりコマンドだけを記載していますが。基本的には通常通りLVM->PV->VG->LVと作っていけば問題ありません。
root@gluster01:~# pvcreate /dev/vdb1
Writing physical volume data to disk "/dev/vdb1"
Physical volume "/dev/vdb1" successfully created
root@gluster01:~# vgcreate vg_data /dev/vdb1
Volume group "vg_data" successfully created
root@gluster01:~# lvcreate -n lv_data -l 80%VG vg_data
Logical volume "lv_data" created
XFSでフォーマットを行う
導入初期だとパッケージが不足していたのでXFS用のモジュールの導入も一緒に実施します。
# apt-get install xfsprogs
root@gluster01:~# mkfs.xfs -i size=512 /dev/vg_data/lv_data
meta-data=/dev/vg_data/lv_data isize=512 agcount=4, agsize=2096896 blks
= sectsz=512 attr=2, projid32bit=0
data = bsize=4096 blocks=8387584, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=4095, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
fstabにエントリーの追加
/dev/mapper/vg_data-lv_data /brick xfs defaults 0 0
マウントディレクトリの作成とマウント
root@gluster01:~# mkdir /brick
root@gluster01:~# mount /brick
root@gluster01:~# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/localhost-root 13123096 1242896 11213576 10% /
udev 242108 8 242100 1% /dev
tmpfs 100648 304 100344 1% /run
none 5120 0 5120 0% /run/lock
none 251620 0 251620 0% /run/shm
none 102400 0 102400 0% /run/user
/dev/vda1 233191 29080 191670 14% /boot
/dev/mapper/vg_data-lv_data 33533956 32944 33501012 1% /brick
この/brickというディスクのエリアをGlusterFSの領域として利用します。実際に物理で作る場合にはこの辺りをローカルのRAID6などで保護しながらということに成るかと思います。
ノードの追加
上記の手順でもう一台同じ物を作ります。gluster02として作成します。サーバ側ではなくクラウドエヌなどの仮想環境で行う場合ネットワークの設定があるので確認します。
利用されるポート番号は、TCPポート111、24007、24008、24009以降(24009 + すべてのボリュームのbricksの数)になります。
また今回は特に設定がされていないですが ufw や iptables と言ったものでもフィルタリングされる可能性があるので注意です。体感的にぱっと返答がなくてTimeoutするような感じで動くものはたいていはFirewallの機能でブロックされています。
- 参考:ポート番号
登録方法
管理コマンドは gluster になります。対話式で制御できるので実施していきます。
gluster> peer probe gluster02
Probe successful
gluster> peer status
Number of Peers: 1
Hostname: gluster02
Uuid: 1dee20d6-73e4-4531-a358-e201531ec4bf
State: Peer in Cluster (Connected)
ボリュームの作成
どのような構成で作るかを決めて実施します。
上記のリンクのように複数の組み合わせがあるので適切なものを選んでいきます。
gluster> volume create rvol replica 2 gluster01:/brick gluster02:/brick
Creation of volume rvol has been successful. Please start the volume to access data.
gluster> volume info
Volume Name: rvol
Type: Replicate
Volume ID: 35531397-94b0-4fde-804f-a7af5dd37ddd
Status: Created
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster01:/brick
Brick2: gluster02:/brick
gluster> volume info rvol
Volume Name: rvol
Type: Replicate
Volume ID: 35531397-94b0-4fde-804f-a7af5dd37ddd
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: gluster01:/brick
Brick2: gluster02:/brick
Status of volume: rvol
Gluster process Port Online Pid
------------------------------------------------------------------------------
Brick gluster01:/brick 24009 Y 23014
Brick gluster02:/brick 24009 Y 22504
NFS Server on localhost 38467 Y 23020
Self-heal Daemon on localhost N/A Y 23026
NFS Server on gluster02 38467 Y 22510
Self-heal Daemon on gluster02 N/A Y 22516
クライアント側の設定
ここまで来てようやく気がついたのですがCIFSで繋ぐ場合には別途sambaを起動する必要があるのですね。Redhat Storege Server の場合にはこの辺りの設定も入っているみたいですが glasuterFS を直接実施する場合には、Native クライアントか NFS で利用する必要があるみたいです。
準備
更に別のサーバからネイティブクライアントで接続をしてみます。先ほどのAPTパッケージの登録を行った後にクライアントを導入します。またNFSのモジュールも不足するので事前に導入しておきます。
# apt-get install glusterfs-client
# apt-get install nfs-common
mount -t glusterfs gluster01:/rvol /mnt/native
mount -t nfs -o vers=3 gluster01:/rvol /mnt/nfs
所感
ネイティブクライアントもNFSもともに問題なく利用できることがわかりました。ネイティブのクライアントの場合には片側が停止している状態でも問題なく利用することが出来ました。ただし復旧後すぐにデータが復元されないんで同期には暫くかかっていました。NFSなどの接続では停止した場合ノードが見えなくなるためです。
Sambaを利用していなのでまた後ほどするにして色々止めたりすると動作が面白いですね。実際にどの程度利用されているかは不明ですが使ってみたいなという感じですね。
スケールアウト型のNASとして考えた場合どの程度が制約があるのかわかりませんが増やすこと自体は簡単にできそうなのですが構成パターンとか考えないと難しそうですね。