UbuntuでGlusterFSをデプロイする:低コストで高機能な分散ストレージソリューション

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

ディスク容量不足とシステムダウンの不安

約半年前、私はあるECサイトのWebサーバークラスターを管理していました。すべてが順調にいっていた金曜日の夜、システムが警告を発しました。メインサーバーのディスク使用率が98%に達したのです。さらに恐ろしいことに、そこは約500GBもの商品画像やユーザーデータが保存されている唯一の場所でした。

当時の選択肢は2つでした。1つはサーバーを停止してディスクをアップグレードすることですが、これには少なくとも30分のダウンタイムが伴います。もう1つは外付けドライブをマウントする方法ですが、既存のコードが分散ストレージに対応していませんでした。その夜の冷や汗をかくような経験を経て、データを単一の物理ディスクに依存することがいかに致命的なミスであるかを痛感しました。

なぜ伝統的なストレージ構成は「急所」になりやすいのか?

単一のUbuntu Serverのみを使用している場合、遅かれ早かれ次のような問題に直面することになります。

  • 単一障害点 (SPOF): ディスクの故障やサーバーのハードウェアトラブルが発生すると、データは失われ、アプリケーションは即座に停止します。
  • 拡張の困難さ: 容量が限界に達した際、より大きなディスクを購入して数百GBのデータを移行するのは非常に時間がかかり、ミスも発生しやすくなります。
  • I/Oボトルネック: 1台のディスクには読み書きの限界があります。同時アクセス数が1万人に達すると、ディスクの処理能力が追いつかなくなります。

GlusterFS:コストとパフォーマンスのバランスの最適解

私は多くの選択肢を検討しました:

  • NFS: 設定は簡単ですが、依然として集中管理型です。NFSサーバーがダウンすれば、システム全体が停止します。
  • Ceph: 大規模なクラウドシステムには非常に強力ですが、リソース消費が激しく(安定稼働に最低16-32GBのRAMが必要)、小規模なチームには設定が複雑すぎます。
  • GlusterFS: これこそが「理想の解決策」でした。複数のサーバーのディスクを1つの論理パーティションとして統合し、レプリケーション(複製)をサポートすることで、データの可用性を常に確保できます。

ステージング環境でのテスト後、GlusterFSを本番環境に導入しました。結果は非常に良好で、システムは6ヶ月間スムーズに稼働し続けています。容量の拡張も、サービスを止めることなく新しいノードをクラスターに追加するだけで完了します。

3ノード構成のGlusterFSクラスター構築手順

スプリットブレイン(ノード間の通信断絶によるデータ不整合)を避けるため、2ノードではなく3ノード構成にすることを強くお勧めします。以下は、私が実際に構築したモデルです。

  • srv-01: 192.168.1.10
  • srv-02: 192.168.1.11
  • srv-03: 192.168.1.12

ステップ1:ノードの識別設定

サーバー同士が互いの名前で通信できるように、3台すべてのマシンの /etc/hosts ファイルを編集します。

sudo nano /etc/hosts

ファイルの末尾に以下の内容を追加します:

192.168.1.10 srv-01
192.168.1.11 srv-02
192.168.1.12 srv-03

ステップ2:GlusterFSのインストール

最新の安定版をインストールするため、3台すべてのノードで以下のコマンドを実行します:

sudo apt update
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:gluster/glusterfs-9 -y
sudo apt update
sudo apt install glusterfs-server -y

システム起動時にサービスが自動的に開始されるように設定します:

sudo systemctl enable --now glusterd

ステップ3:ノード間の信頼関係の設定

srv-01 で、他の2つのノードをクラスターに追加するコマンドを実行します:

sudo gluster peer probe srv-02
sudo gluster peer probe srv-03

sudo gluster peer status コマンドで確認します。ステータスが Connected と表示されていれば、通信は正常です。

ステップ4:Brick(データ保存領域)の作成

GlusterFSにおいて「Brick」とは、単なるストレージディレクトリを指します。最高のパフォーマンスを得るには、専用のディスクを使用し、XFS形式でフォーマットすることをお勧めします。この例では、メインドライブ上にディレクトリを作成します:

# 3台すべてのノードで実行
sudo mkdir -p /gluster/data

ステップ5:分散ボリュームの初期化

vol_shared という名前のボリュームを replica 3 モードで作成します。これは、アップロードした各ファイルが自動的に3台のサーバーすべてにコピーされることを意味します。srv-01 で以下のコマンドを実行します:

sudo gluster volume create vol_shared replica 3 srv-01:/gluster/data srv-02:/gluster/data srv-03:/gluster/data force
sudo gluster volume start vol_shared

クライアントをストレージクラスターに接続する

Webサーバーやアプリケーションサーバーからこの共有領域を使用するために、クライアントパッケージをインストールします:

sudo apt install glusterfs-client -y

ネットワークドライブをマウントします:

sudo mkdir /mnt/storage
sudo mount -t glusterfs srv-01:/vol_shared /mnt/storage

ここで素晴らしいのは、例え srv-01 のIP経由でマウントしていても、そのサーバーがダウンした場合、クライアントは自動的に srv-02srv-03 を見つけ出してデータを取得することです。このプロセスは瞬時に行われ、アプリケーションは通常通り動作し続けます。

6ヶ月間の運用で得た「血肉となる」経験

システムを安定して稼働させるために、以下の3つの重要なポイントに注意してください:

  1. 内部ネットワーク: GlusterFSは常にデータを同期するため、帯域を大量に消費します。最低でも1GbpsのLANを使用してください。100Mbps의ネットワークでは、大きなファイルを書き込む際にシステムがラグ(遅延)を起こす可能性があります。
  2. 容量の監視: GlusterFSは、あるノードが一杯になったときに自動的に完璧な容量バランスを調整するわけではありません。常に各Brickの空き容量を同程度に保つようにしてください。
  3. 再起動時の自動マウント: サーバー再起動後の接続切れを防ぐため、/etc/fstab に以下の行を追加するのを忘れないでください:
    srv-01:/vol_shared /mnt/storage glusterfs defaults,_netdev 0 0

GlusterFSは、高価なSANソリューションにコストをかけずに、画像、動画、ログファイルなどの集中管理ストレージが必要な場合に最適な選択肢です。皆さんの導入が成功することを祈っています!

Share: