glusterfsで始める分散ファイルシステム

Sat 17 October 2015
By cocuh

こんにちは、こくです。
今回は glusterfsという分散ファイルシステムでcoins-projectの余っているサーバーをストレージ化してみたので、紹介と構築方法を書こうと思います。

間違っている箇所などありましたら、@cocuh_まで連絡してくださると本人は非常に喜びます。

対象読者

  1. とりあえずcoins-projectのブログを読んでいる方
    • こういうこと自主的に勉強してる集団だと思っていただければと
    • 一緒に勉強しましょう…!
  2. glusterfsを触ろうと思っている方
    • かつlinuxのコマンドをある程度知っている
  3. to my future self
    • glusterfs構築したくなったら

glusterfsとは

分散ファイルシステムの一つで、イメージしやすいものを挙げれば自前の Dropboxです。下の要望から使うことが多いです。

  1. 複数の計算機のストレージを結合して大きいストレージとして使いたい
  2. ファイルを分散してアクセスの高速化をしたい
  3. 常にバックアップのようなことをしていて、どれかの計算機が壊れても復旧できるようにしたい(冗長化)
    • RAID10みたいなことを分散ファイルシステム上でする

分散ファイルシステムとは何

通常の計算機は、それぞれの計算機がストレージを持っていてそれにデータを保管しています。

fig0

ここで 「常にバックアップのようなことをしていて、どれかの計算機が壊れても復旧できるようにしたい」と思った時に思いつく方法は、 ファイルを作った時に他の計算機にもコピーする(レプリケーション)方法です。

fig1

1つのファイルが5回コピーされて保存されているので、全体の容量の 1/6 しか使えていなくてもったいないです。「コピーの回数を2回まで減らして容量を有効活用したい」と考えます。この方法だと全体の容量の1/3使えるので先ほどの倍使える計算になります。これが 「複数の計算機のストレージを結合して大きいストレージとして使いたい」ということです。

fig2

これらの処理を人間がすると大変です。使う人はこの仕組みを意識せずにファイルを保管すると自動でレプリケーションされると誰でも使えるようになります。そのために多くの分散ファイルシステムは仮想的なストレージを作って、人間はそれを使うと自動でそれぞれのストレージに対して処理してくれるようにします。このソフトウェアが分散ファイルシステムと呼ばれます。

fig3

glusterfsのアーキテクチャ

glusterfsは volumeという単位でファイルシステムを分けて管理しています。これがmount先として指定されることになります。 volumeは複数の brickと呼ばれる単位にわけられ、 brickがRAIDでいうblockのような形でレプリケーションが行われます。

brickは、 peerpathからできています。 peerはIP addrかdomain名で指定していて一つの計算機を示し、 pathはその計算機上のファイルシステムのパスを示します。

architecture

図は、VolumeのType(後述)がDistributed-Replicatedの場合の例です。

glusterfsは RAIDのようにパーティションを切って構築するのではありません。 既存のファイルシステム上にイメージファイルかファイル現物を置いて保管します。
そのため、 brickごとに同一サイズパーティションにする必要はないです。また、man glusterを読んだ限りbrick`ごとの最大サイズも指定できないようです。

運用する仕方としてglusterfsとraid1を併用するという方法も考えられて、raid1でマウントしたの上にglusterfsを組んで信頼性を上げるという方法もあります。(raid1の読み込み速度向上の恩恵は受けれなさそうですけど)

mount方法はfuseで実装されたnative-client, nfs, cifsが使えます。
https://gluster.readthedocs.org/en/latest/Administrator%20Guide/Setting%20Up%20Clients/#gluster-native-client

もっと詳しいarchitectureは公式ドキュメントに書いてあります(すごい楽しい)
https://gluster.readthedocs.org/en/latest/Quick-Start-Guide/Architecture/

volumeのTypeに関して

glusterfsのvolumeには執筆現在9つのTypeがあり、それぞれファイルのレプリケーションと分散のポリシーになっています。画像は公式ドキュメントより引用しています。普通の用途ならDistributed-Replicatedでいいのではないかなと思います。

これに関しては公式ドキュメントを読むのが一番はやいと思います。
https://gluster.readthedocs.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/

たぶん、用語の意味がわかればそこまで難しくないです。

  1. Distributed
    • ファイルごとbrick へ分散する。ファイルを細切れにはしない。
  2. Replicated
    • ファイルやblockを複製する
  3. Striped
    • 大きいファイルをblockごと細切れに して保管する。
  4. Dispersed

Distributed

ファイルごとに分散してbrickに保管する。レプリケーションをしないので容量いっぱいまで使える。スケールする場合に有効。信頼性は劣る。

Distributed volumes distributes files throughout the bricks in the volume. You can use distributed volumes where the requirement is to scale storage and the redundancy is either not important or is provided by other hardware/software layers.

distributed_volume

Replicated

ファイルの複製をすべてのbrickに配置する。高信頼で高可用性なところで使う。ただし、使える容量は減る。

Replicated volumes replicates files across bricks in the volume. You can use replicated volumes in environments where high-availability and high-reliability are critical.

replicated_volume

Striped

大きいファイルを細切れにしてそれぞれのbrickに分散する。非常に大きなファイルへの同時アクセスが頻発する環境で使える。

Striped volumes stripes data across bricks in the volume. For best results, you should use striped volumes only in high concurrency environments accessing very large files.

striped_volume

Distributed Striped

DistributedとStripedの同時利用。ファイルで分散して細切れにして保管する。DistributedのscaleしやすさとStripedの大きいファイルへの高速アクセス性を両立できる。

Distributed striped volumes stripe data across two or more nodes in the cluster. You should use distributed striped volumes where the requirement is to scale storage and in high concurrency environments accessing very large files is critical.

distributed_striped_volume

Distributed Replicated

DistributedとReplicatedの同時利用。ファイルで分散して複製にして保管する。DistributedのscaleしやすさとReplicatedの高信頼性を両立できる。利用可能なvolumeの容量は 1/レプリケーション数 になる。

Distributed replicated volumes distributes files across replicated bricks in the volume. You can use distributed replicated volumes in environments where the requirement is to scale storage and high-reliability is critical. Distributed replicated volumes also offer improved read performance in most environments.

distributed_replicated_volume

Distributed Striped Replicated

DistributedとStripedとReplicatedの同時利用。ファイルで分散して細切れにして複製にして保管する。DistributedのscaleしやすさとStripedの大きいファイルへの高速アクセス性とReplicatedの高信頼性を両立できる。

ただしbrick数がそこそこ必要になると思われる(推測)。isoの配布サーバーみたいな例に向いている…?

Distributed striped replicated volumes distributes striped data across replicated bricks in the cluster. For best results, you should use distributed striped replicated volumes in highly concurrent environments where parallel access of very large files and performance is critical. In this release, configuration of this volume type is supported only for Map Reduce workloads.

Striped Replicated

StripedとReplicatedの同時利用。ファイルを細切れにして複製にして保管する。Stripedの大きいファイルへの高速アクセス性とReplicatedの高信頼性を両立できる。

Striped replicated volumes stripes data across replicated bricks in the cluster. For best results, you should use striped replicated volumes in highly concurrent environments where there is parallel access of very large files and performance is critical. In this release, configuration of this volume type is supported only for Map Reduce workloads.

striped_replicated_volume

Dispersed

パリティをつけて分散する。stripedしながらパリティを(redundancy countの数だけ)配置する。redundancy countの数までなら故障しても復元できる。サイズは 全brick数 - redundancy となる。全brick数は、2*redundancyより多くなければならないので、最小構成は3bricks(redundancy=1)となる。

Dispersed volumes are based on erasure codes, providing space-efficient protection against disk or server failures. It stores an encoded fragment of the original file to each brick in a way that only a subset of the fragments is needed to recover the original file. The number of bricks that can be missing without losing access to data is configured by the administrator on volume creation time.

Distributed Dispersed

distributeしながらパリティをつけて分散する。Distributed Replicatedで、Dispersedでパリティをつけるようにしている。

Distributed dispersed volumes distribute files across dispersed subvolumes. This has the same advantages of distribute replicate volumes, but using disperse to store the data into the bricks.

https://gluster.readthedocs.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/

glusterfs-serverの構築

Ubuntu 14.04で構築します。

hostが - tomato00 - 192.168.33.100 - tomato01 - 192.168.33.101 - tomato02 - 192.168.33.102 - tomato03 - 192.168.33.103

brickは以下の6つにして、tomato00:/var/bricktomato01:/var/brickのようにそれぞれでreplicateして、replicatedされたものを3つでdistributedします。

volumeのtypeとしてはDistributed-Replicatedとなります。

  • replicate
    • 192.168.33.100:/var/brick
    • 192.168.33.101:/var/brick
  • replicate
    • 192.168.33.102:/var/brick
    • 192.168.33.103:/var/brick
  • replicate
    • 192.168.33.100:/var/brick2
    • 192.168.33.101:/var/brick2

コンソールの様子はVagrantで立ち上げたVMでやったものです。その時使用したVagrantfileとansibleも使いたい方のためにおいておきます。

packageのインストール

all hosts#
# aptitude install glusterfs-server

peerの登録

glusterfsに「このpeerは信頼できる」と登録します。一つのhostでprobeすると向こうからもpeerされた状態になります。

peer名はipアドレスでも指定できます。

vagrant@tomato00:~$ sudo gluster peer probe 192.168.33.101
peer probe: success
vagrant@tomato00:~$ sudo gluster peer probe 192.168.33.102
peer probe: success
vagrant@tomato00:~$ sudo gluster peer probe 192.168.33.103
peer probe: success
vagrant@tomato00:~$

gluster peer statusでpeer一覧を確認できます

vagrant@tomato00:~$ sudo gluster peer status
Number of Peers: 3

Hostname: 192.168.33.101
Port: 24007
Uuid: 498afe6a-0f66-4f8b-93f6-61601327ebf4
State: Peer in Cluster (Connected)

Hostname: 192.168.33.102
Port: 24007
Uuid: f45e1923-b5d0-49c9-b0e1-f9dfdf3174d7
State: Peer in Cluster (Connected)

Hostname: 192.168.33.103
Port: 24007
Uuid: c60e5840-a9a3-4726-bca3-cb4afc4994e5
State: Peer in Cluster (Connected)

volumeの作成

brickのディレクトリを作成します。

all hosts#
# mkdir /var/brick

2つにレプリケーションするので、replica 2とします。2つにレプリケーションするのに4つbrickを与えると、自動的にDistributed-Replicatedになります。

# gluster volume create coins-p_volume replica 2 192.168.33.100:/var/brick 192.168.33.101:/var/brick 192.168.33.102:/var/brick 192.168.33.103:/var/brick

今回はrootパーティションと同じパーティションにbrickを配置しているのでエラーがでます。
本来ならパーティションを分けてシステムと隔離すべきなのでしょうが面倒なのでforceします。

vagrant@tomato00:~$ sudo gluster volume create coins-p_volume replica 2 192.168.33.100:/var/brick 192.168.33.101:/var/brick 192.168.33.102:/var/brick 192.168.33.103:/var/brick
volume create: coins-p_volume: failed: The brick 192.168.33.100:/var/brick is is being created in the root partition. It is recommended that you don't use the system's root partition for storage backend. Or use 'force' at the end of the command if you want to override this behavior.
vagrant@tomato00:~$ sudo gluster volume create coins-p_volume replica 2 192.168.33.100:/var/brick 192.168.33.101:/var/brick 192.168.33.102:/var/brick 192.168.33.103:/var/brick force
volume create: coins-p_volume: success: please start the volume to access data

add-brickでbrickの追加ができます。ただし、追加する場合はreplica数と同じ数のbrickを追加しなければならないです。

vagrant@tomato00:~$ sudo gluster volume add-brick coins-p_volume 192.168.33.100:/var/brick2 192.168.33.101:/var/brick2 force
volume add-brick: success
vagrant@tomato00:~$

volumeの確認方法

gluster volume listでvolume一覧。gluster volume info [volume]でvolumeの情報が見れます。

vagrant@tomato00:~$ sudo gluster volume list
coins-p_volume
vagrant@tomato00:~$ sudo gluster volume info coins-p_volume

Volume Name: coins-p_volume
Type: Distributed-Replicate
Volume ID: fc353533-6929-45ba-8a98-d031dea3442a
Status: Created
Number of Bricks: 3 x 2 = 6
Transport-type: tcp
Bricks:
Brick1: 192.168.33.100:/var/brick
Brick2: 192.168.33.101:/var/brick
Brick3: 192.168.33.102:/var/brick
Brick4: 192.168.33.103:/var/brick
Brick5: 192.168.33.100:/var/brick2
Brick6: 192.168.33.101:/var/brick2

typeが Distributed-Replicateになっていることがわかります。Number of Bricks3 x 2はdistributedが3で、replica数が2になっていることをしめしてます。作ったばかりのためStatusCreatedになってます。

volumeの起動

gluster volume start [volume]で起動できます。

vagrant@tomato00:~$ sudo gluster volume start coins-p_volume
volume start: coins-p_volume: success
vagrant@tomato00:~$ sudo gluster volume info coins-p_volume

Volume Name: coins-p_volume
Type: Distributed-Replicate
Volume ID: fc353533-6929-45ba-8a98-d031dea3442a
Status: Started
Number of Bricks: 3 x 2 = 6
Transport-type: tcp
Bricks:
Brick1: 192.168.33.100:/var/brick
Brick2: 192.168.33.101:/var/brick
Brick3: 192.168.33.102:/var/brick
Brick4: 192.168.33.103:/var/brick
Brick5: 192.168.33.100:/var/brick2
Brick6: 192.168.33.101:/var/brick2
vagrant@tomato00:~$ 

statusStartedになりました。

glusterfsをmountする

tomato00からcoins-p_volumeをmountします。

パッケージを入れる

そのためのfuseのドライバが必要なのでglusterfs-clientパッケージを入れます。

tomato00#
# aptitude install glusterfs-client

mountする

mount先はvolumeを構築するbrickの一つを指定すればよいです。

mount -t glusterfs [peer]:[volume_name] [mount point]

tomato00#
# mkdir -p /volumes/coins-p_volume
# mount -t glusterfs 192.168.33.100:coins-p_volume /volumes/coins-p_volume

遊ぶ

mount先にファイルを作成してレプリケーションされてるか見ましょう

vagrant@tomato00:~$ cd /volumes/coins-p_volume
vagrant@tomato00:/volumes/coins-p_volume$ echo youjo|sudo tee ninja 
vagrant@tomato00:/volumes/coins-p_volume$ ls
ninja
vagrant@tomato00:/volumes/coins-p_volume$ ls /var/brick
ninja                                                                                                           vagrant@tomato00:/volumes/coins-p_volume$ cat /var/brick/ninja
youjo

distributedなのでファイルがそのまま/var/brickにおいてあります。(今回はたまたまtomato00:/var/brickになりました。)

tomato01:brickにもレプリケーションがあるはずなので見てみます。

vagrant@tomato01:~$ ls /var/brick
ninja
vagrant@tomato01:~$ cat /var/brick
youjo
vagrant@tomato01:~$

想定通りの挙動をしています。

まとめ

  • glusterfsで分散ファイルシステムを構築した
  • 分散ファイルシステムは複数の計算機にまたがったファイルシステム
  • なんかvolumeのtypeがたくさんある
  • 意外と簡単に作れる

おわりに

どうだったでしょうか?個人的には作業ログから文章にしたら思った以上に長くなってしまってびっくりです。 そんなに難しいことしてないんですけど、文章が下手なんですね。

感想

感想としては分散ファイルシステム構築自体は簡単なんですが、チューニングが気になるところです。 cacheとかしてるのかな?とman glusterよんでいるんですがあんまり見えてなくてよくわからないです。 mount -t glusterfsのほう読めばいいのかな?

でも自宅の鯖で使うことはないでしょうw たかだか5hostぐらいしかないのであんまり分散させるメリットがないです。

cifsでsambaで使えるのでcoins-projectのファイルサーバーに使えるかなと思ったのですが、だったらレプリケーションならjenkinsなりでrsyncするし、分散させるのは可用性ぐらいしかメリットがないですし、20人ぐらいだったら別にいいかなと思う次第です。

公式ドキュメント読んでいるとsnapshotが使えるらしいので、凝るならやってもいいかな…?

http://www.gluster.org/community/documentation/index.php/Features/Gluster_Volume_Snapshot

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

Pages

Categories

Tags