環境構成
今回は3台のサーバーでGlusterFSクラスタを構築し、Dockerボリュームプラグインとして利用します。各ノードの役割とIPアドレスは以下の通りです。
- マスターノード: 192.168.1.10 (gfs-master)
- ワーカーノード1: 192.168.1.11 (gfs-node01)
- ワーカーノード2: 192.168.1.12 (gfs-node02)
- クライアント: 192.168.1.100 (client01)
全てのノードでhostsファイルに以下のエントリを追加します。
192.168.1.10 gfs-master 192.168.1.11 gfs-node01 192.168.1.12 gfs-node02
インストール手順
CentOS 7/8環境へのインストールはyumリポジトリ経由で簡単に行えます。3台全てのサーバーで以下のコマンドを実行してください。
yum install -y centos-release-gluster yum install -y glusterfs-server glusterfs-fuse glusterfs-rdma
クラスタ設定
インストール完了後、各ノードでglusterdサービスを起動し、自動起動を有効化します。
systemctl start glusterd systemctl enable glusterd
マスターノード(gfs-master)から他のノードをクラスタに参加させます。
[root@gfs-master ~]# gluster peer probe gfs-node01 peer probe: success. [root@gfs-master ~]# gluster peer probe gfs-node02 peer probe: success. [root@gfs-master ~]# gluster peer status Number of Peers: 2 Hostname: gfs-node01 Uuid: a1b2c3d4-e5f6-7890-abcd-ef1234567890 State: Peer in Cluster (Connected) Hostname: gfs-node02 Uuid: b2c3d4e5-f6g7-8901-bcde-f23456789012 State: Peer in Cluster (Connected)
ボリューム作成準備
各ノードにストレージ用ディレクトリを作成します。
[root@gfs-master ~]# mkdir -p /data/gluster/brick0 [root@gfs-node01 ~]# mkdir -p /data/gluster/brick0 [root@gfs-node02 ~]# mkdir -p /data/gluster/brick0
レプリケーションボリュームの作成
3台のサーバーでレプリケーションボリュームを作成します。ボリューム名は「gv0」とします。
[root@gfs-master ~]# gluster volume create gv0 replica 3 gfs-master:/data/gluster/brick0 gfs-node01:/data/gluster/brick0 gfs-node02:/data/gluster/brick0 force volume create: gv0: success: please start the volume to access data
作成したボリュームを確認します。
[root@gfs-master ~]# gluster volume info gv0 Volume Name: gv0 Type: Replicate Volume ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Status: Created Number of Bricks: 1 x 3 = 3 Transport-type: tcp Bricks: Brick1: gfs-master:/data/gluster/brick0 Brick2: gfs-node01:/data/gluster/brick0 Brick3: gfs-node02:/data/gluster/brick0
ボリュームを起動します。
[root@gfs-master ~]# gluster volume start gv0 volume start: gv0: success
GlusterFSボリュームタイプの種類
GlusterFSでは7種類のボリュームタイプを利用できます。それぞれの特徴を解説します。
1. 分散ボリューム (DHT)
デフォルトのモードで、ファイルをハッシュアルゴリズムでランダムに分散配置します。
gluster volume create vol_dht gfs-master:/export/brick1 gfs-node01:/export/brick1
2. レプリケーションボリューム (AFR)
replicaパラメータで指定した数だけファイルを複製します。
gluster volume create vol_replica replica 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1
3. ストライピングボリューム
stripeパラメータでファイルを分割して複数ノードに配置します(RAID 0のような動作)。
gluster volume create vol_stripe stripe 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1
4. 分散レプリケーションボリューム
分散とレプリケーションを組み合わせたタイプ。最低4台のサーバーが必要です。
gluster volume create vol_dht_replica replica 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1 gfs-node02:/export/brick2 gfs-node03:/export/brick2
5. 分散ストライピングボリューム
分散とストライピングを組み合わせたタイプ。最低4台のサーバーが必要です。
gluster volume create vol_dht_stripe stripe 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1 gfs-node02:/export/brick2 gfs-node03:/export/brick2
6. ストライプリプリケーションボリューム
ストライピングとレプリケーションを組み合わせたタイプ。最低4台のサーバーが必要です。
gluster volume create vol_stripe_replica stripe 2 replica 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1 gfs-node02:/export/brick2 gfs-node03:/export/brick2
7. 分散ストライプリプリケーションボリューム
3つの機能を組み合わせたタイプ。最低8台のサーバーが必要です。
gluster volume create vol_all stripe 2 replica 2 transport tcp gfs-master:/export/brick1 gfs-node01:/export/brick1 gfs-node02:/export/brick2 gfs-node03:/export/brick2 gfs-node04:/export/brick3 gfs-node05:/export/brick3 gfs-node06:/export/brick4 gfs-node07:/export/brick4
パフォーマンスチューニング
ボリュームのパフォーマンスを最適化するための設定例です。
# クォータ機能の有効化 gluster volume quota gv0 enable # ルートディレクトリの使用容量制限を80GBに設定 gluster volume quota gv0 limit-usage / 80GB # 読み取りキャッシュサイズを4GBに設定 gluster volume set gv0 performance.cache-size 4GB # 非同期書き込みを有効化 gluster volume set gv0 performance.flush-behind on # I/Oスレッド数を32に設定 gluster volume set gv0 performance.io-thread-count 32 # ライトバックキャッシュを有効化 gluster volume set gv0 performance.write-behind on
クライアント環境の構築
クライアントマシン(client01)でGlusterFSをマウントします。まず必要なパッケージをインストールします。
[root@client01 ~]# yum install -y glusterfs-fuse [root@client01 ~]# mkdir -p /mnt/gluster [root@client01 ~]# mount -t glusterfs gfs-master:gv0 /mnt/gluster
マウントを確認します。
[root@client01 ~]# df -h | grep gluster gfs-master:gv0 441G 18G 424G 4% /mnt/gluster
パフォーマンステスト
各ボリュームタイプのパフォーマンスをddコマンドでテストします。
分散ボリュームでのテスト
[root@client01 ~]# dd if=/dev/zero of=/mnt/gluster/test1.img bs=1G count=1 oflag=direct 1073741824 bytes (1.1 GB) copied, 8.5 s, 126 MB/s
レプリケーションボリュームでのテスト
[root@client01 ~]# dd if=/dev/zero of=/mnt/gluster/test2.img bs=1G count=1 oflag=direct 1073741824 bytes (1.1 GB) copied, 25.2 s, 42.6 MB/s
ストライピングボリュームでのテスト
[root@client01 ~]# dd if=/dev/zero of=/mnt/gluster/test3.img bs=1G count=1 oflag=direct 1073741824 bytes (1.1 GB) copied, 8.3 s, 129 MB/s
分散レプリケーションボリュームでのテスト
[root@client01 ~]# dd if=/dev/zero of=/mnt/gluster/test4.img bs=100M count=10 oflag=direct 1048576000 bytes (1.0 GB) copied, 16.8 s, 62.4 MB/s
fioを使用した詳細テスト
4Kランダム書き込みテスト:
[root@client01 ~]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randwrite -size=10G -filename=/mnt/gluster/randwrite.test -name="GlusterFS 4K Random Write" -iodepth=32 -runtime=60
4Kランダム読み取りテスト:
[root@client01 ~]# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=randread -size=10G -filename=/mnt/gluster/randread.test -name="GlusterFS 4K Random Read" -iodepth=8 -runtime=60
運用管理コマンド
ボリュームの一覧表示
[root@gfs-master ~]# gluster volume list
ボリュームの削除
[root@gfs-master ~]# gluster volume stop gv0 [root@gfs-master ~]# gluster volume delete gv0
削除後は各brick内の.glusterfsと.trashcanディレクトリを手動で削除する必要があります。
ノードの切り離し
[root@gfs-master ~]# gluster peer detach gfs-node02
アクセス制御
[root@gfs-master ~]# gluster volume set gv0 auth.allow 192.168.1.*,10.0.0.*
ボリュームの拡張
[root@gfs-master ~]# gluster peer probe gfs-node03 [root@gfs-master ~]# gluster volume add-brick gv0 gfs-node03:/data/gluster/brick0
ボリュームの縮小
データ移行を伴う縮小:
[root@gfs-master ~]# gluster volume remove-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 start [root@gfs-master ~]# gluster volume remove-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 status
データ移行なしの即時削除:
[root@gfs-master ~]# gluster volume remove-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 commit
Brickの置換
[root@gfs-master ~]# gluster volume replace-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 start [root@gfs-master ~]# gluster volume replace-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 status [root@gfs-master ~]# gluster volume replace-brick gv0 gfs-node02:/data/gluster/brick0 gfs-node03:/data/gluster/brick0 commit
リバランシング
[root@gfs-master ~]# gluster volume rebalance gv0 start [root@gfs-master ~]# gluster volume rebalance gv0 status [root@gfs-master ~]# gluster volume rebalance gv0 stop
分散レプリケーションボリュームのベストプラクティス
分散レプリケーションボリュームを構築する際の注意点:
- Brickサーバーの数はレプリカ数の倍数である必要があります
- サーバーリストの順番に従って、隣接するサーバー同士がレプリカを形成します
例: 8台のサーバーでレプリカ数2の場合、サーバー1-2、3-4、5-6、7-8のペアがレプリカになります。レプリカ数4の場合、サーバー1-4、5-8のグループがレプリカになります。
最適化パラメータ
主要なパフォーマンス関連パラメータ一覧:
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
| auth.allow | IPアクセス制御 | *(全許可) |
| cluster.min-free-disk | 最小空きディスク容量閾値 | 10% |
| performance.cache-size | 読み取りキャッシュサイズ | 32MB |
| performance.io-thread-count | I/Oスレッド数 | 16 |
| performance.write-behind | ライトバックキャッシュ | on |
| nfs.disabled | NFSサービス無効化 | off |
監視とメンテナンス
日常的な監視項目:
# ノード状態の確認 gluster peer status # ボリューム状態の確認 gluster volume status gv0 # ヘルスチェックと修復 gluster volume heal gv0 full gluster volume heal gv0 info gluster volume heal gv0 info healed gluster volume heal gv0 info split-brain # クォータ情報の確認 gluster volume quota gv0 list
障害対応手順
ディスク障害
RAID構成がある場合はディスク交換後に自動同期されます。RAIDがない場合は、当該brickをボリュームから削除し、新しいディスクで再追加します。
サーバー障害
同一スペックの代替サーバーを準備し、以下の手順で復旧します:
- IPアドレスとホスト名を元サーバーと同じに設定
- GlusterFSを同じバージョンでインストール
- 障害サーバーのUUIDを確認(他の健全ノードで「gluster peer status」実行)
- 新サーバーの/var/lib/glusterd/glusterd.infoを障害サーバーのUUIDで更新
- クラスターに参加させる
- データ同期を実行: gluster volume heal gv0 full
企業での活用シーン
GlusterFSは以下のような用途に最適です:
- 大容量ファイルのストレージ(動画、画像、バックアップデータ)
- クラウドストレージ基盤
- 仮想化環境の共有ストレージ
- HPC(高性能計算)のストレージ層
- ログデータの長期保管
なお、小ファイル(特に数百万以上)の取り扱いはパフォーマンスが低下するため、専用のストレージソリューションとの併用を検討してください。