#author("2018-01-28T21:41:47+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