こんにちは。松本です。
今回は、Btrfsのより便利な使い方についてご紹介します。
いつもはVirtualBox[https://www.virtualbox.org/wiki/Downloads]に準備したCentOS7を使っていましたが、今回はMicrosoft Azure[http://azure.microsoft.com/ja-jp/]に作ったCentOS7を使います。
なぜAzureを選んだのか、その理由もあわせてご紹介します。
はじめに、システムの可用性と拡張性をテーマに、Btrfsの便利な機能をご紹介します。
・・・ですが、その前に前提となる技術を簡単(?)に解説しておきます。
■ストレージ運用の課題
昨今、クラウドが広く使われるようになりましたが、もちろん従来の物理サーバ/仮想サーバの環境(オンプレミスと呼ばれます)も残っていますし、これからも使われるでしょう。
クラウドにはストレージサービス(有名なものでAWSのS3があります)があり、これを使うことで容量の上限や機器の故障を考える必要がなくなります。
また、AWSのEBSやAzureのVHDのようにサーバに接続して使用するディスクでも、クラウドの内部的な仕組みで冗長化されているものがあります。
では、ストレージ(ディスク)について問題がなくなったのかというと、必ずしもそうではありません。
- AWSのS3のようなクラウドストレージは、上にも述べたとおり容量の上限や機器の故障を考える必要がありません。
しかし、一般的にサーバのローカルディスクや外付けディスクといった使い方が出来ません。
いくつかのソフトウェアを組み合わせることで可能になりますが、I/O性能は非常に低くなります。 - AWSのEBSやAzureのVHDのようにサーバに接続して使用するディスクは、クラウドの内部的な仕組みで冗長化されているものがあります。
しかし、このタイプのディスクは容量に限りがあります。
オンプレミスでは、機器の故障等は業務へ大きな影響を及ぼしますし、やはり容量の問題もあります。
これらの問題を解決するには、どのような方法があるのでしょう。
ディスクの可用性や容量についての問題を解決する手段として、従来からRAIDという技術があります。
RAIDは、RAID0・RAID1・RAID5・RAID6・RAID10などのレベルに分けられます。
この中の RAID1 を使うことで、ディスクの冗長化(ミラーリング)を構成できます。
また、RAID5やRAID6、RAID10を使うことで、冗長化に加えて大容量のストレージを実現できます。
RAIDを使うことで、可用性や容量の問題を解決できます。
しかし、実際は他にも問題があります。
それは、「業務(サービス)の継続性」です。
RAID構成では、一部のディスクに故障があった場合、そのディスクと新品のディスクを交換することで冗長化を再度構成することが出来ます。
しかし、ディスクを交換するとき、OSをシャットダウンする必要はないでしょうか。
最近は、OSやハードウェアが進歩しており、OSが起動した状態でハードディスクの交換が可能なものも多く出ています。
この場合は、シャットダウンの必要はありません。
ですが、安価なサーバや古いサーバは、対応している可能性は低いです。
オンプレミスではこのような状況ですが、クラウドではどうでしょう。
クラウド上のサーバにディスクを追加するとき、事前にOSのシャットダウンが必要な場合とそうでない場合は、ベンダーによって異なります。
例えば、AWSやAzureではOSが起動したままディスクの追加が可能ですが、その他のクラウドサービスではシャットダウンが必要なものもあります。
さて、ようやくBtrfsの話です。
Btrfsには次の機能があります。
- マルチデバイス対応
- RAID(RAID0・RAID1・RAID5・RAID6・RAID10)
■マルチデバイス対応
Linuxで長く使われてきた、ext2,ext3,ext4やxfs、reiserfs等は一つのデバイス(※1)毎にしか作れませんでした。
そこで、LVM(※2)といった技術を組み合わせることで複数のデバイスにまたがったファイルシステムを作り、大容量化やデバイスの追加/削除を可能にしていました。
※1:ハードディスク以外にも、USBメモリやフロッピーディスクなどがあります。
※2:LVM:複数の物理デバイスを1つの論理的なデバイスとして管理するための仕組みです。
Btrfsでは、LVMを使わずともマルチデバイスの管理が可能です。
そして、LVMよりもシンプルな運用が可能です。
例えば、Btrfsでフォーマットされたデバイス: /dev/sda1 が マウントポイント: /bf01 にマウントされているとします。
これに /dev/sdb1 を追加するときは、このようにします。
# btrfs device add /dev/sdb1 /bf01
これだけでデバイスの追加は完了です。
ただしこのままでは、データやメタデータが /dev/sda1 にだけにありますので、これを全てのデバイスに均等化します。
# btrfs filesystem balance /bf01
既に存在するファイルシステムに追加するのではなく、最初から複数のデバイスでフォーマットするにはこのようにします。
# mkfs.btrfs /dev/sda1 /dev/sdb1 /dev/sdc1
デバイスを削除するときは、このようにします。
デバイス: /dev/sdc1 がマウントポイント: /bf02 にマウントされているとします。
# btrfs device delete /dev/sdc1
# btrfs balance start /bf02
Btrfsではオンラインの状態(シャットダウン不要)でデバイスの追加や削除が出来ます。
■RAID(RAID0・RAID1・RAID5・RAID6・RAID10)
BtrfsはRAIDを構成できます。
ただし、RAID5とRAID6は未だ安定していませんので、重要なシステムには使わないことをお勧めします。
Linuxには、RAIDを使うために次の方法があります。
- ハードウェアRAIDを利用する
- ソフトウェアRAIDを利用する
ハードウェアRAIDとは、RAIDの機能をハードウェア(RAIDカード、RAIDコントローラ)が行います。
ソフトウェアRAIDとは、RAIDの機能をOSの機能を使ってソフトウェアとして実現するものです。
(厳密には、それぞれの定義はもう少し複雑なものになるのですが、ここでは割愛します)
BtrfsのRAID機能は、ソフトウェアRAIDに入ります。
この機能を使うために、特定のハードウェアは必要ありません。
オンプレミスのサーバでもクラウドのサーバでも、どちらでも使用することが出来ます。
使い方の例として、RAID10を使ってみます。
メタデータとデータの両方ともRAID10にします。
RAID10では、最低4つのデバイスが必要です。
# mkfs.btrfs -m raid10 -d raid10 /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1
RAID10のストレージを準備することが出来ました。
もし一つのデバイスが故障した場合は、次の操作を行います。
デバイス: /dev/sda1,/dev/sdb1,/dev/sdc1,/dev/sdd1 をマウントポイント: /bf03 にマウントしていたとします。
このとき、 /dev/sdb1が故障したので、かわりのデバイス: /dev/sde1 に交換する場合はこのようにします。
# umount /bf03
# mount -o degraded /dev/sda1 /bf03 ←指定するのは /dev/sdb1 ではありません
# btrfs device add /dev/sde1 /bf03
# btrfs device delete missing ← /dev/sdb1 が削除されます
# btrfs balance start /bf03
このようにBtrfsを使うことで、他の複雑なしくみやハードウェアを使うことなく、ストレージの可用性と拡張性を得ることが出来ます。
また、OSをシャットダウンする必要がありませんので、業務(サービス)の継続性を維持することも出来ます。
■Microsoft Azureと組合せ
大変便利なBtrfsですが、少しおもしろい使い方もあります。
それは、Microsoft AzureでVirtualMachineを作成して、データ領域にBtrfsを使うというものです。
弊社には、cloudThrow[http://cloudthrow.jp]という、プライベートなファイル共有システムを提供するサービスがあります。
お客様専用のファイル共有システムを構築するもので、そのストレージにはお客様の大切なデータが保存されます。
そして、ストレージ費用を抑えつつも、I/O性能を高くする必要があります。
そこで、Azureの特徴である「データは自動で3つのデバイスに保存される」という点と、RAID0による高速化を組み合わせることにしました。
RAID0を使いますので可用性は低くなりますが、Azureの3多重保存を組み合わせることでその欠点はカバーできます。
さらに、AzureではVirtualMachineに接続するローカルディスクも、実際に使用した容量に対してのみ課金されます。
例えば、1TBのディスクを二つ使ってRAID0を構成して、100GBのデータを書き込んだとします。
1TBのディスクを二つも使いますが、実際に使用した容量は100GBですので、100GB分の課金しか発生しません。
最大サイズの1TBのデータを書き込んだとしても、1TB分の課金しか発生しないのです。
この構成を物理ディスクや他のクラウドで作った場合、1TBのディスクを二つ使いますので、2TB分の費用が発生します。
そして、RAID0ですので容量は半分の1TBしか使えません。
如何でしょうか。Btrfsで簡単にRAID構成が作れました。
また、Azureと組み合わせることで、高いI/O性能かつ可用性に優れたストレージを安価に使うことが出来ます。
加えて、前回ご紹介したスナップショット機能を使ってバックアップを行えば、さらに安心です。
次回は「Btrfsでバックアップ 最終回」として、より高度かつ便利なバックアップをご紹介します。
よろしくお願いします。