- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2018-01-28T21:41:47+09:00","default:nowsky","nowsky")
#author("2019-01-09T22:11:01+09:00","default:nowsky","nowsky")
*GlusterFS [#k20eee14]
RedHatにより開発されている分散ファイルシステムの一種。
ファイルシステムではあるがコアプログラムはアプリケーション層(ユーザ空間)で動作する。
ファイルシステムのマウントもFUSE・NFSなど様々な物が用意されている為、
用途・環境に併せてシステム構成を変更出来る。
GlusterFSは、RAID0/1/5相当の処理をアプリケーションとして実装しているが、
大容量ファイルの処理が早い為、10GigabitEthernetを積んでHCI環境で利用する場合が多い。
~
*参考サイト [#w627f265]
-[[GlusterFS:+https://www.gluster.org/]]
-[[CentOS7でGlusterFSの環境構築:+https://qiita.com/Yuki-Inamoto/items/2ea1efe862aeba34019c]]
~
* 構築環境 [#h28022db]
-&font(b){OS};:openSUSE Leap 42.3
-&font(b){Type};:3-Node Replicate
-&font(b){Volume};:volgfs
|LEFT:100|LEFT:120|LEFT:120|LEFT:120|c
|CENTER:~Parameter|CENTER:~Node-A|CENTER:~Node-B|CENTER:~Node-C|h
|&color(#2020ff){IP Address};|10.0.0.1|10.0.0.2|10.0.0.3|
|&color(#2020ff){Brick HDD};|/dev/sdb|/dev/sdb|/dev/sdb|
|&color(#2020ff){Brick DIR};|/brick|/brick|/brick|
|&color(#2020ff){Brick FS};|xfs|xfs|xfs|
|&color(#2020ff){Mount SYS};|FUSE|FUSE|FUSE|
|&color(#2020ff){Volume DIR};|/gluster|/gluster|/gluster|
|&color(#2020ff){Volume FS};|glusterfs|glusterfs|glusterfs|
~
* インストール [#b3191049]
-&size(16){&font(b){1. リポジトリ追加};};
openSUSEでGlusterFSをインストールする場合、ファイルシステムリポジトリを追加する必要がある。
その為、リポジトリを追加した後にGlusterFSのプログラムをインストールする。
また、GlusterFSをネイティブマウントを行う為に、FUSEもインストールする。
# zypper addrepo https://download.opensuse.org/repositories/filesystems/openSUSE_Leap_42.3/filesystems.repo
# zypper refresh
# zypper install glusterfs fuse
-&size(16){&font(b){2. サービス起動};};
GlusterFSはファイルシステムだが、前途の通りアプリケーションの一種なのでデーモンを起動する。
デフォルトでは自動起動が無効化されている為、デーモンの自動起動も設定する。
# systemctl unmask glusterd
# systemctl enable glusterd
# systemctl start glusterd
# ps -ef | grep glusterd
-&size(16){&font(b){3. ログローテート};};
デフォルトではログローテート設定が無いので手動作成する。
ローテートオプションについては環境に合わせて設定する。
# vi /etc/logrotate.d/glusterfs
---
/var/log/glusterfs/*.log
/var/log/glusterfs/bricks/*.log
{
weekly
compress
rotate 4
missingok
ifempty
create 600 root root
sharedscripts
postrotate
systemctl restart glusterd.service > /dev/null
endscript
}
-&size(16){&font(b){4. Brickの準備};};
GlusterFSの一時ファイルを格納するBrick領域を準備する。
Brick領域のファイルシステムは、&color(#ff0000){[xfs]};または&color(#ff0000){[ext4]};しか利用出来ない。
オフィシャルでは&color(#ff0000){&font(b){xfsを推奨};};しているので今回はxfsでフォーマットする。
Brick領域のパーティションはrootパーティション[/]以外、
物理HDDもrootパーティションを格納しているHDD以外にしないと、
GlusterVolume作成時に警告が出るが、強制実行オプションで無視する事も出来る。
# fdisk /dev/sdb
# mkfs.xfs -i size=512 /dev/sdb1
# mkdir /brick
# mount -p /dev/sdb1 /brick
# blkid /dev/sdb1
# echo "UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX /brick xfs defaults 1 2" >> /etc/fstab
~
* ピアリング [#j1463b89]
-&size(16){&font(b){1. iptables};};
GlusterFSはファイル同期にTCP/IPを使う為、下記リストの通信許可が必要となる。
ただし、利用するポートは種類が多くiptablesで確実に制御するのは難しい為、
セキュリティ上の問題が無ければ&color(#ff0000){ホスト単位};で通信許可する方が良い。
|CENTER:50|RIGHT:100|LEFT:300|c
|CENTER:~Protocol|CENTER:~Port|CENTER:~Description|h
|&color(#ff2020){TCP};|111|portmap/rpcbind|
|&color(#2020ff){UDP};|111|portmap/rpcbind|
|&color(#ff2020){TCP};|2049|NFS|
|&color(#2020ff){UDP};|2049|NFS|
|&color(#ff2020){TCP};|24007|GlusterFS Daemon|
|&color(#ff2020){TCP};|24008|GlusterFS Management|
|&color(#ff2020){TCP};|24009~Brick|GlusterFS versions earlier than 3.4|
|&color(#ff2020){TCP};|38465~38467|Required for GlusterFS NFS service|
|&color(#ff2020){TCP};|49152~Brick|GlusterFS versions 3.4 and later|
#region(&color(#ff0000){補足事項};)
上記の通信許可リストの内、BrickPort(~Brick)は&color(#ff0000){ノードが格納するBrick数に&font(b){比例};};して範囲で許可する必要がある。
その為、BrickPortはGlusterVolumeの設計によって可変する為、基本は8ポート分くらい多めに見積もってポート開放する。
決め打ちで許可を行う場合は下記を参考に通信許可するポート範囲を決める。
|RIGHT:80|CENTER:50|RIGHT:170|RIGHT:170|c
|CENTER:~Node/Brick|CENTER:~Protocol|CENTER:~Port [First~v3.4]|CENTER:~Port [v3.4~Latest]|h
|&color(#2020ff){1PC/1Brick};|TCP|24009|49152|
|&color(#2020ff){1PC/2Brick};|TCP|24009~24010|49152~49153|
|&color(#2020ff){1PC/3Brick};|TCP|24009~24011|49152~49154|
|&color(#ff2020){2PC/1Brick};|TCP|24009|49152|
|&color(#ff2020){2PC/2Brick};|TCP|24009~24010|49152~49153|
|&color(#ff2020){2PC/3Brick};|TCP|24009~24011|49152~49154|
iptablesでポート範囲指定の通信許可を行う場合の設定例を記載。
8Brick(1PC/8Port)分を確保する場合は下記のようになる。
# iptables -I INPUT -s ${srcIP} -p tcp --dport 111 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p udp --dport 111 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p tcp --dport 2049 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p udp --dport 2049 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p tcp --dport 24007:24008 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p tcp --dport 24009:24017 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p tcp --dport 38465:38467 -j ACCEPT
# iptables -I INPUT -s ${srcIP} -p tcp --dport 49152:49160 -j ACCEPT
#endregion
-&size(16){&font(b){2. GlusterPeer設定};};
GlusterFSのストレージプールを作成する為、クラスタに参加するノードを設定する。
ピア設定はクラスタ内のノード1台で設定すれば全台に自動反映される。
下記は『Node-A:10.0.0.1』で実行する場合のピア接続コマンドとなる。
# gluster peer status
# gluster peer probe 10.0.0.2
# gluster peer probe 10.0.0.3
# gluster pool list
---
UUID Hostname State
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 10.0.0.2 Connected
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX 10.0.0.3 Connected
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX localhost Connected
~
* ファイルシステム [#t20d3b2a]
-&size(16){&font(b){1. ボリューム作成};};
本来、Brickはマウントポイント直下ではなく、サブディレクトリ上に作成する必要があるが、
今回は『1Volume/1Brick/3Node-Replica』の構成なのでサブディレクトリを作成せず、
マウントポイントをそのままBrick領域として利用する為、&color(#ff0000){[force]オプションを付けて強制作成する。};
#region(&color(#ff0000){コマンド};)
&font(b){・ボリューム作成};
# gluster vol create volgfs replica 3 10.0.0.1:/brick 10.0.0.2:/brick 10.0.0.3:/brick force
---
volume create: volgfs: success: please start the volume to access data
&font(b){・ボリューム開始};
# gluster vol start volgfs
---
volume start: volgfs: success
&font(b){・ステータス確認};
# gluster vol status
---
Status of volume: volgfs
Gluster process Port Online Pid
-------------------------------------------------------------------------
Brick 10.0.0.1:/brick 49152 Y XXXXX
Brick 10.0.0.2:/brick 49152 Y XXXXX
Brick 10.0.0.3:/brick 49152 Y XXXXX
Self-heal Daemon on localhost N/A Y XXXXX
Self-heal Daemon on 10.0.0.2 N/A Y XXXXX
Self-heal Daemon on 10.0.0.3 N/A Y XXXXX
-------------------------------------------------------------------------
#endregion
-&size(16){&font(b){2. ファイルシステムのマウント};};
GlusterFSはマウント先ノードが停止していた際、自動的に&color(#ff0000){他ノードを再マウントするフォールバック機能};がある。
NFS/FUSE両方とも利用する事が出来るが、NFSでマウントしてフォールバックすると、
ローカルファイルシステムを経由してフォールバック先へアクセスする為&color(#ff0000){アクセス速度が遅くなる。};
今回はマウント先を直接変更出来る、FUSEマウントを利用してネイティブフォールバックを行い、
Replica構成でも一定のアクセス速度を保てるようにする。
#region(&color(#ff0000){コマンド};)
&font(b){・Node-A};
# mkdir /gluster
# mount -t glusterfs 10.0.0.1:/volgfs /gluster -o backup-volfile-servers=10.0.0.2:10.0.0.3
# echo "10.0.0.1:/volgfs /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.2:10.0.0.3 0 0" >> /etc/fstab
&font(b){・Node-B};
# mkdir /gluster
# mount -t glusterfs 10.0.0.2:/volgfs /gluster -o backup-volfile-servers=10.0.0.3:10.0.0.1
# echo "10.0.0.2:/volgfs /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.3:10.0.0.1 0 0" >> /etc/fstab
&font(b){・Node-C};
# mkdir /gluster
# mount -t glusterfs 10.0.0.3:/volgfs /gluster -o backup-volfile-servers=10.0.0.1:10.0.0.2
# echo "10.0.0.3:/volgfs /gluster glusterfs defaults,_netdev,backup-volfile-servers=10.0.0.1:10.0.0.2 0 0" >> /etc/fstab
#endregion
~
* チューニング [#g0eb423b]
-&size(16){&font(b){1. パフォーマンス設定};};
GlusterFSの高速化と可用性向上の為パフォーマンスチューニングを行う。
突き詰めたチューニングを行う場合、kernelチューニングも必要になるが、
kernelチューニングをすると他への影響が出る場合もあるので、今回はGlusterFSのみ設定する。
--[[Managing GlusterFS Volumes:+http://docs.gluster.org/en/latest/Administrator%20Guide/Managing%20Volumes/]]
--[[SCSK GlusterFS紹介:+https://www.scsk.jp/lib/product/oss/pdf/oss_12.pdf]]
・スプリットブレイン時、ノードが55%以上参加するクラスタをMasterとして稼働
# gluster vol set all cluster.server-quorum-ratio 55%
・Quorumの算出方法をクラスタ内のノード数に設定
# gluster vol set volgfs cluster.server-quorum-type server
・Quorumのデフォルト値をノード過半数に設定
# gluster vol set volgfs cluster.quorum-type auto
・死活監視の間隔を5秒に設定
# gluster vol set volgfs network.ping-timeout 5
・GlusterFSのNFSマウント機能を停止
# gluster vol set volgfs nfs.disable true
・GlusterFSのキャッシュメモリを512MBに変更
# gluster vol set volgfs performance.cache-size 512MB
・GlusterFSの最大ファイルキャッシュサイズを64MBに設定
# gluster vol set volgfs performance.cache-max-file-size 64MB
・GlusterFSの最小ファイルキャッシュサイズを1KBに設定
# gluster vol set volgfs performance.cache-min-file-size 1KB
-&size(16){&font(b){2. パフォーマンス設定};};
GlusterFSのNFSマウント機能を停止した時、
バージョンによっては下記の様なエラーが大量に出力される場合がある。
0-management: readv on /var/run/gluster/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.socket failed (Invalid argument)
古いバージョンの[[バグ:+http://www.petasan.org/forums/?view=thread&id=126]]が原因だが、設定変更でログ出力を抑制する事が出来る。
今回の設定例ではGlusterFSのNFSを停止している為、下記のエラーログ抑制を行い上記のログ出力を停止する。
# gluster volume set all nfs.disable true
# systemctl stop glusterd
# rm /var/log/glusterfs/etc-glusterfs-glusterd.vol.log
# systemctl start glusterd
-&size(16){&font(b){3. ウェルノウンポート衝突};};
--[[Red Hat Bugzilla -Bug 762989:+https://bugzilla.redhat.com/show_bug.cgi?id=762989]]
--[[CLIENT_PORT_CIELING (sic):+http://lists.gluster.org/pipermail/gluster-devel/2009-February/034349.html]]
>GlusterFSがBrickに接続する際、&color(#0000ff){宛先ポートはTCP:49152から昇順};にアクセスするが、
ローカルポートは&color(#ff0000){TCP:1024から&font(b){開いている番号の降順};};に利用する。
その為、GlusterFS環境下でIMAPS(TCP:993)やPOP3S(TCP:995)を構築するとポート番号の衝突が多々発生する。
この場合、GlusterFSの&color(#0000ff){「開いている番号を降順に利用」};する仕様を応用し、
GlusterFSが起動する前に、IMAPS/POP3Sのサービスを起動する事で回避出来る。
#region(&color(#ff0000){コマンド};)
-GlusterFS
# vi /usr/lib/systemd/system/glusterd.service
---
[Unit]
After=network.target rpcbind.service postfix.service dovecot.service
Before=network-online.target
-Postfix
# vi /usr/lib/systemd/system/postfix.service
---
[Unit]
After=var-run.mount nss-lookup.target network.target time-sync.target
Before=glusterd.service
-Dovecot
# vi /usr/lib/systemd/system/dovecot.service
---
[Unit]
After=local-fs.target network.target
Before=glusterd.service
#endregion
-&size(16){&font(b){4. ブリック追加・削除};};
ブリックを追加・削除する際は、ノードをクラスタに追加した後にボリューム操作を実行する。
この時、追加先のボリュームでノード数固定(replica-3など)をしている場合、
先にノード数を変更した後にブリック操作を行う。
#region(&color(#ff0000){コマンド};)
・volgfsに、 "10.0.0.4:/brick" を追加
# gluster vol add-brick volgfs replica 4 10.0.0.4:/brick
・volgfsから "10.0.0.4:/brick" を削除
# gluster vol remove-brick volgfs replica 3 10.0.0.4:/brick
・ボリューム操作後のリバランス
# gluster vol rebalance volgfs start
#endregion