仕事柄、開発環境やテスト環境の構築はよく行うのですが、実運用環境を構築する機会はあまりありません。環境構築の作業そのものはあまり変わらないとも言えるけど、信頼性を重視されるような観点での環境構築経験は薄かったといえます。
このたび、とあるサーバーを「RAID1(ミラーリング)環境で」構築することになり、予算の観点から専用のハードウェアを使わずに、単純にハードディスク2台をつなげるソフトウェア RAID で実現することになりました。その構築時の作業のメモです。なおサーバーそのものは Linux(CentOS) で、その Linux の標準機能として持っているソフトウェア RAID を使っています。またハードディスクは同じ容量の SATA ディスクが2台(/dev/sda, /dev/sdb)接続されているものと仮定します。
ではその導入手順の紹介です。普通の CentOS 導入と変わらない点はここでは省略して、RAID 環境を構築する際の要点だけを紹介します。CentOS(バージョン6)の導入手順はこちらを参照ください:
CentOS の導入
インストーラーを実行して、普通に進めていくと、ディスク構成の箇所がやってきます。ここで2台のハードディスクによる RAID を構築していくよう指定していくことになります。まずはインストール先デバイス、ここは普通に「基本ストレージデバイス」を選択します。

ディスクの中にデータが含まれているかもしれない、という警告です。まあ OS を普通にインストールするので「破棄」を選択。この辺りは普通のインストールとあまり変わらないですね。

インストールタイプの指定です。RAID 構成にする場合は「カスタムレイアウトを作成する」を選択する必要があります。

ケースバイケースですが、このタイミング OS をインストールするハードディスクを選択する画面が表示されることがあります。その場合は RAID の構成に使用する2台のハードディスクを指定して、右側の画面に映しておいてください。

この後に具体的なカスタム構成を指定していきます。まずは2つのハードディスク(sda, sdb)が認識されていることを確認し、またすでに何らかのパーティショニングや LVM(論理ボリュームマネージャ)の設定がされていた場合は「選択して削除ボタン」を繰り返して、論理ボリュームは削除し、2台のディスク全てを「空き」の状態にします。この図のような状態になったことを確認してください。

言い忘れましたが、今回の目標はミラーリング(同じ内容を複数台のハードディスクに書き込んで障害耐性を強化)を実現することで、具体的には以下のような RAID1 ディスク構成の3パーティションを作成して OS を導入することです:
(1)ブートイメージのパーティション(300MB)
(2)スワップディスクのパーティション(1GB)
(3)ルートパーティション(残り全部)
※実質的なファイルシステムは全て (3) のルートパーティションに構築することになりますが、別パーティションを作成したい場合は (3) と同様の手続きを繰り返すだけなので、さほど違いはないと思っています。
では、まずは1台目のディスク(/dev/sda)に (1) のブート用パーティションを作成します。「作成」ボタンをクリックして、「標準パーティション」を指定します。

追加パーティションを以下のように指定します:
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: sda のみにチェック
サイズ: 300
追加容量オプション: 固定容量
基本パーティションにする: チェック
注意点としては、このパーティションは最終的には /boot にマウントすることになるのですが、この段階ではマウントポイントを指定しない、ということです。

ブート用パーティションのサイズは 200MB でも大丈夫だと思いますが、念のため少し大きめに作成しておきます。
最後に「OK」をクリックして、1つ前の画面に戻ります。sda ドライブに sda1 という 300MB のパーティションが作成されたことを確認します。

再度「作成」ボタンをクリックし、全く同じ手順をもう一度実行して、今度は2台目のディスク(sdb)にも同様のパーティションを作成します。

この時点でこのようなパーティション構成になっています。2台のディスク両方に software RAID タイプの300MBのパーティションが作られています。この2つを RAID 構成でミラーリングすることになるわけです。

ここからはその RAID 用デバイスを作ります。「作成」ボタンをクリックし、次の画面では「RAIDデバイス」を選択して「作成」します。

sda1 と sdb1 をミラーリングする RAID デバイスを以下のように作成します:
マウントポイント: /boot
ファイルシステムタイプ: ext4
RAID デバイス: md1
RAID レベル: RAID1
RAID メンバー: sda1 と sdb1 両方にチェック
通常のパーティション作成時に指定するようなマウントポイントやファイルシステムタイプはここで指定することになります。このパーティションはブート用なのでマウントポイントを /boot にしています。ファイルシステムタイプは ext4 である必要はなく、ext3 とかでも構いませんが、特に理由がなければ ext4 をおススメします。そして RAID としてのデバイス名(md1)やそのレベル(RAID1)を指定し、このRAID デバイスに属してミラーリングすることになる物理デバイス(sda1 と sdb1)を指定します。この例であれば /dev/md1 という RAID デバイスを作成して /boot にマウントする、と指定していることになります。そしてデバイスの実体は /dev/sda1 と /dev/sdb1 にミラーリングしていることになります。

「OK」をクリックするとこの画面に戻り、RAID デバイス md1 が追加されたことが確認できます。これで上記の (1) のパーティショニングが完了したことになります。

残りの (2) と (3) のパーティショニングについても同様に行います。(2) はスワップ用に用意する 1GB のパーティションですが、こちらもまずは物理的なパーティションを2つ作成します。「作成」をクリックした後に「標準パーティション」を選択し、以下の内容でパーティションを2回追加します:
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
サイズ: 1024
追加容量オプション: 固定容量
基本パーティションにする: チェック

この手順を2度、 sda と sdb 両方に対して実行すると、このようなパーティション状態になります。

今作成したスワップパーティションについても RAID 構成にします。再度「作成」をクリックし、「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します:
マウントポイント: なし
ファイルシステムタイプ: swap
RAID デバイス: md2
RAID レベル: RAID1
RAID メンバー: sda2 と sdb2 両方にチェック

スワップディスクなのでファイルシステムタイプを "swap" にする必要があります。またマウントポイントは不要です。
これで RAID 構成になったスワップパーティション md2 が定義されました。後は (3) のルートパーティションについても同様に物理パーティションから作成します。

「作成」ボタンをクリックして「標準パーティション」を選択し、以下の内容でパーティションを作成します。
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
サイズ: (残り容量すべて ただし1つ目と2つ目で同じサイズを指定する)
追加容量オプション: 固定容量
基本パーティションにする: チェック

ここでの注意点としてはパーティションのサイズです。全く同じ容量のハードディスク2台で RAID 構成を構築する場合は問題ないのですが、やむを得ず異なるサイズのハードディスク2台で構成する場合は、この時点での「残り容量」が異なるはずです。2つのパーティションは同じサイズにするため、サイズが異なる場合は残り容量の少ない方に合わせて同じサイズを指定する必要がある、ということに注意してください。
sda と sdb 双方でこのルート用のパーティションを追加します。このように sda3, sdb3 が定義されたパーティションになっていることを確認します。

最後に sda3, sdb3 をミラーリングする RAID デバイスを定義します。「作成」をクリックして「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します。ここはマウントポイント以外は (1) の時と同じです:
マウントポイント: /
ファイルシステムタイプ: ext4
RAID デバイス: md3
RAID レベル: RAID1
RAID メンバー: sda3 と sdb3 両方にチェック

最終的にこのようなパーティション構成になりました。この例ですと実際に使うパーティションは / の1つだけですが、/usr や /opt などに別のパーティションを用意することも(もちろん)可能です。その場合は同様に物理デバイスと RAID デバイスを追加していきます。

パーティション定義が完了したので「次へ」をクリックして定義内容をディスクに書き込みます。以下の様な警告メッセージが表示された場合は「フォーマット」をクリックします。

パーティション定義を変更する直前の、最後の確認メッセージです。変更して問題なければ「変更をディスクに書き込む」をクリックします。

定義内容に従ってパーティショニングが行われ、ファイルシステムも作成されます。

パーティショニングが終わった直後にブートローダーに関する指定画面が現れます。今のままですとブートローダーは物理デバイスである /dev/sda が指定されていますが、ここも RAID 構成用に変更しておきましょう。「デバイスの変更」ボタンをクリックします。

ブートローダーの導入先として RAID デバイスの /boot として指定した /dev/md1 を選択し、「OK」をクリックします。

このような画面になればブートローダーの変更もできました。これで RAID 用のパーティショニングで気をつける点は全てです。後は普通にインストール作業を進めます。

インストール中は特に違いはなく、普通っぽく進んでいきます。

インストールが完了したらマシンを再起動するようガイドされます。再起動すると RAID 構成の環境が立ち上がることになります。

実際に再起動した環境で Terminal を起動し、 "df -h" と "/etc/fstabs" を実行してみた時の様子です。パーティション/マウントの構成では /dev/sda? や /dev/sdb? は使われておらず、これらのミラーリングデバイスである /dev/md? がマウントされていることが分かります。これら /dev/md? は(上記で定義したように)ミラーリングのデバイスなので、これらに書き込まれた内容はソフトウェア RAID によって実際には2台の物理ディスクに反映され、一台に問題や障害が生じた場合でももう一台で運用を続けることができます。

今回は最初の段階からディスクが2台用意できていて、セットアップ時に RAID 構成を定義できる前提での手順を紹介しました。この前提があれば非常に簡単にソフトウェア RAID が実現できることが分かりました。ソフトウェアでコントロールしているとはいえ、コアの機能になっていて、パフォーマンスもさほど悪いと感じません。安価に冗長構成が作れる、とてもいい時代になりました。
このたび、とあるサーバーを「RAID1(ミラーリング)環境で」構築することになり、予算の観点から専用のハードウェアを使わずに、単純にハードディスク2台をつなげるソフトウェア RAID で実現することになりました。その構築時の作業のメモです。なおサーバーそのものは Linux(CentOS) で、その Linux の標準機能として持っているソフトウェア RAID を使っています。またハードディスクは同じ容量の SATA ディスクが2台(/dev/sda, /dev/sdb)接続されているものと仮定します。
ではその導入手順の紹介です。普通の CentOS 導入と変わらない点はここでは省略して、RAID 環境を構築する際の要点だけを紹介します。CentOS(バージョン6)の導入手順はこちらを参照ください:
CentOS の導入
インストーラーを実行して、普通に進めていくと、ディスク構成の箇所がやってきます。ここで2台のハードディスクによる RAID を構築していくよう指定していくことになります。まずはインストール先デバイス、ここは普通に「基本ストレージデバイス」を選択します。

ディスクの中にデータが含まれているかもしれない、という警告です。まあ OS を普通にインストールするので「破棄」を選択。この辺りは普通のインストールとあまり変わらないですね。

インストールタイプの指定です。RAID 構成にする場合は「カスタムレイアウトを作成する」を選択する必要があります。

ケースバイケースですが、このタイミング OS をインストールするハードディスクを選択する画面が表示されることがあります。その場合は RAID の構成に使用する2台のハードディスクを指定して、右側の画面に映しておいてください。

この後に具体的なカスタム構成を指定していきます。まずは2つのハードディスク(sda, sdb)が認識されていることを確認し、またすでに何らかのパーティショニングや LVM(論理ボリュームマネージャ)の設定がされていた場合は「選択して削除ボタン」を繰り返して、論理ボリュームは削除し、2台のディスク全てを「空き」の状態にします。この図のような状態になったことを確認してください。

言い忘れましたが、今回の目標はミラーリング(同じ内容を複数台のハードディスクに書き込んで障害耐性を強化)を実現することで、具体的には以下のような RAID1 ディスク構成の3パーティションを作成して OS を導入することです:
(1)ブートイメージのパーティション(300MB)
(2)スワップディスクのパーティション(1GB)
(3)ルートパーティション(残り全部)
※実質的なファイルシステムは全て (3) のルートパーティションに構築することになりますが、別パーティションを作成したい場合は (3) と同様の手続きを繰り返すだけなので、さほど違いはないと思っています。
では、まずは1台目のディスク(/dev/sda)に (1) のブート用パーティションを作成します。「作成」ボタンをクリックして、「標準パーティション」を指定します。

追加パーティションを以下のように指定します:
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: sda のみにチェック
サイズ: 300
追加容量オプション: 固定容量
基本パーティションにする: チェック
注意点としては、このパーティションは最終的には /boot にマウントすることになるのですが、この段階ではマウントポイントを指定しない、ということです。

ブート用パーティションのサイズは 200MB でも大丈夫だと思いますが、念のため少し大きめに作成しておきます。
最後に「OK」をクリックして、1つ前の画面に戻ります。sda ドライブに sda1 という 300MB のパーティションが作成されたことを確認します。

再度「作成」ボタンをクリックし、全く同じ手順をもう一度実行して、今度は2台目のディスク(sdb)にも同様のパーティションを作成します。

この時点でこのようなパーティション構成になっています。2台のディスク両方に software RAID タイプの300MBのパーティションが作られています。この2つを RAID 構成でミラーリングすることになるわけです。

ここからはその RAID 用デバイスを作ります。「作成」ボタンをクリックし、次の画面では「RAIDデバイス」を選択して「作成」します。

sda1 と sdb1 をミラーリングする RAID デバイスを以下のように作成します:
マウントポイント: /boot
ファイルシステムタイプ: ext4
RAID デバイス: md1
RAID レベル: RAID1
RAID メンバー: sda1 と sdb1 両方にチェック
通常のパーティション作成時に指定するようなマウントポイントやファイルシステムタイプはここで指定することになります。このパーティションはブート用なのでマウントポイントを /boot にしています。ファイルシステムタイプは ext4 である必要はなく、ext3 とかでも構いませんが、特に理由がなければ ext4 をおススメします。そして RAID としてのデバイス名(md1)やそのレベル(RAID1)を指定し、このRAID デバイスに属してミラーリングすることになる物理デバイス(sda1 と sdb1)を指定します。この例であれば /dev/md1 という RAID デバイスを作成して /boot にマウントする、と指定していることになります。そしてデバイスの実体は /dev/sda1 と /dev/sdb1 にミラーリングしていることになります。

「OK」をクリックするとこの画面に戻り、RAID デバイス md1 が追加されたことが確認できます。これで上記の (1) のパーティショニングが完了したことになります。

残りの (2) と (3) のパーティショニングについても同様に行います。(2) はスワップ用に用意する 1GB のパーティションですが、こちらもまずは物理的なパーティションを2つ作成します。「作成」をクリックした後に「標準パーティション」を選択し、以下の内容でパーティションを2回追加します:
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
サイズ: 1024
追加容量オプション: 固定容量
基本パーティションにする: チェック

この手順を2度、 sda と sdb 両方に対して実行すると、このようなパーティション状態になります。

今作成したスワップパーティションについても RAID 構成にします。再度「作成」をクリックし、「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します:
マウントポイント: なし
ファイルシステムタイプ: swap
RAID デバイス: md2
RAID レベル: RAID1
RAID メンバー: sda2 と sdb2 両方にチェック

スワップディスクなのでファイルシステムタイプを "swap" にする必要があります。またマウントポイントは不要です。
これで RAID 構成になったスワップパーティション md2 が定義されました。後は (3) のルートパーティションについても同様に物理パーティションから作成します。

「作成」ボタンをクリックして「標準パーティション」を選択し、以下の内容でパーティションを作成します。
マウントポイント: (指定しない)
ファイルシステムタイプ: software RAID
使用可能なドライブ: 1つ目は sda のみにチェック、2つ目は sdb のみにチェック
サイズ: (残り容量すべて ただし1つ目と2つ目で同じサイズを指定する)
追加容量オプション: 固定容量
基本パーティションにする: チェック

ここでの注意点としてはパーティションのサイズです。全く同じ容量のハードディスク2台で RAID 構成を構築する場合は問題ないのですが、やむを得ず異なるサイズのハードディスク2台で構成する場合は、この時点での「残り容量」が異なるはずです。2つのパーティションは同じサイズにするため、サイズが異なる場合は残り容量の少ない方に合わせて同じサイズを指定する必要がある、ということに注意してください。
sda と sdb 双方でこのルート用のパーティションを追加します。このように sda3, sdb3 が定義されたパーティションになっていることを確認します。

最後に sda3, sdb3 をミラーリングする RAID デバイスを定義します。「作成」をクリックして「RAID デバイス」を選択した後で、以下の内容で RAID デバイスを定義します。ここはマウントポイント以外は (1) の時と同じです:
マウントポイント: /
ファイルシステムタイプ: ext4
RAID デバイス: md3
RAID レベル: RAID1
RAID メンバー: sda3 と sdb3 両方にチェック

最終的にこのようなパーティション構成になりました。この例ですと実際に使うパーティションは / の1つだけですが、/usr や /opt などに別のパーティションを用意することも(もちろん)可能です。その場合は同様に物理デバイスと RAID デバイスを追加していきます。

パーティション定義が完了したので「次へ」をクリックして定義内容をディスクに書き込みます。以下の様な警告メッセージが表示された場合は「フォーマット」をクリックします。

パーティション定義を変更する直前の、最後の確認メッセージです。変更して問題なければ「変更をディスクに書き込む」をクリックします。

定義内容に従ってパーティショニングが行われ、ファイルシステムも作成されます。

パーティショニングが終わった直後にブートローダーに関する指定画面が現れます。今のままですとブートローダーは物理デバイスである /dev/sda が指定されていますが、ここも RAID 構成用に変更しておきましょう。「デバイスの変更」ボタンをクリックします。

ブートローダーの導入先として RAID デバイスの /boot として指定した /dev/md1 を選択し、「OK」をクリックします。

このような画面になればブートローダーの変更もできました。これで RAID 用のパーティショニングで気をつける点は全てです。後は普通にインストール作業を進めます。

インストール中は特に違いはなく、普通っぽく進んでいきます。

インストールが完了したらマシンを再起動するようガイドされます。再起動すると RAID 構成の環境が立ち上がることになります。

実際に再起動した環境で Terminal を起動し、 "df -h" と "/etc/fstabs" を実行してみた時の様子です。パーティション/マウントの構成では /dev/sda? や /dev/sdb? は使われておらず、これらのミラーリングデバイスである /dev/md? がマウントされていることが分かります。これら /dev/md? は(上記で定義したように)ミラーリングのデバイスなので、これらに書き込まれた内容はソフトウェア RAID によって実際には2台の物理ディスクに反映され、一台に問題や障害が生じた場合でももう一台で運用を続けることができます。

今回は最初の段階からディスクが2台用意できていて、セットアップ時に RAID 構成を定義できる前提での手順を紹介しました。この前提があれば非常に簡単にソフトウェア RAID が実現できることが分かりました。ソフトウェアでコントロールしているとはいえ、コアの機能になっていて、パフォーマンスもさほど悪いと感じません。安価に冗長構成が作れる、とてもいい時代になりました。
コメント