GlusterFS

RedHatにより開発されている分散ファイルシステムの一種。
ファイルシステムではあるがコアプログラムはアプリケーション層(ユーザ空間)で動作する。
ファイルシステムのマウントもFUSE・NFSなど様々な物が用意されている為、
用途・環境に併せてシステム構成を変更出来る。
 
GlusterFSは、RAID0/1/5相当の処理をアプリケーションとして実装しているが、
大容量ファイルの処理が早い為、10GigabitEthernetを積んでHCI環境で利用する場合が多い。

参考サイト

構築環境

  • OS:openSUSE Leap 42.3
  • Type:3-Node Replicate
  • Volume:volgfs
     
    ParameterNode-ANode-BNode-C
    IP Address10.0.0.110.0.0.210.0.0.3
    Brick HDD/dev/sdb/dev/sdb/dev/sdb
    Brick DIR/brick/brick/brick
    Brick FSxfsxfsxfs
    Mount SYSFUSEFUSEFUSE
    Volume DIR/gluster/gluster/gluster
    Volume FSglusterfsglusterfsglusterfs

インストール

  • 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
     
  • 2. サービス起動
    GlusterFSはファイルシステムだが、前途の通りアプリケーションの一種なのでデーモンを起動する。
    デフォルトでは自動起動が無効化されている為、デーモンの自動起動も設定する。
    # systemctl unmask glusterd
    # systemctl enable glusterd
    # systemctl start glusterd
    # ps -ef | grep glusterd
     
  • 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
    }
     
  • 4. Brickの準備
    GlusterFSの一時ファイルを格納するBrick領域を準備する。
    Brick領域のファイルシステムは、[xfs]または[ext4]しか利用出来ない。
    オフィシャルでは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

ピアリング

  • 1. iptables
    GlusterFSはファイル同期にTCP/IPを使う為、下記リストの通信許可が必要となる。
    ただし、利用するポートは種類が多くiptablesで確実に制御するのは難しい為、
    セキュリティ上の問題が無ければホスト単位で通信許可する方が良い。
    ProtocolPortDescription
    TCP111portmap/rpcbind
    UDP111portmap/rpcbind
    TCP2049NFS
    UDP2049NFS
    TCP24007GlusterFS Daemon
    TCP24008GlusterFS Management
    TCP24009~BrickGlusterFS versions earlier than 3.4
    TCP38465~38467Required for GlusterFS NFS service
    TCP49152~BrickGlusterFS versions 3.4 and later
     
     補足事項
     
  • 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

ファイルシステム

  • 1. ボリューム作成
    本来、Brickはマウントポイント直下ではなく、サブディレクトリ上に作成する必要があるが、
    今回は『1Volume/1Brick/3Node-Replica』の構成なのでサブディレクトリを作成せず、
    マウントポイントをそのままBrick領域として利用する為、[force]オプションを付けて強制作成する。
     
     コマンド
     
  • 2. ファイルシステムのマウント
    GlusterFSはマウント先ノードが停止していた際、自動的に他ノードを再マウントするフォールバック機能がある。
    NFS/FUSE両方とも利用する事が出来るが、NFSでマウントしてフォールバックすると、
    ローカルファイルシステムを経由してフォールバック先へアクセスする為アクセス速度が遅くなる。
    今回はマウント先を直接変更出来る、FUSEマウントを利用してネイティブフォールバックを行い、
    Replica構成でも一定のアクセス速度を保てるようにする。
     
     コマンド

チューニング

  • 1. パフォーマンス設定
    GlusterFSの高速化と可用性向上の為パフォーマンスチューニングを行う。
    突き詰めたチューニングを行う場合、kernelチューニングも必要になるが、
    kernelチューニングをすると他への影響が出る場合もあるので、今回はGlusterFSのみ設定する。
    • Managing GlusterFS Volumes
    • SCSK GlusterFS紹介
      ・スプリットブレイン時、ノードが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
       
  • 2. パフォーマンス設定
    GlusterFSのNFSマウント機能を停止した時、
    バージョンによっては下記の様なエラーが大量に出力される場合がある。
    0-management: readv on /var/run/gluster/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.socket failed (Invalid argument)
     
    古いバージョンのバグが原因だが、設定変更でログ出力を抑制する事が出来る。
    今回の設定例ではGlusterFSのNFSを停止している為、下記のエラーログ抑制を行い上記のログ出力を停止する。
    # gluster volume set all nfs.disable true
    # systemctl stop glusterd
    # rm /var/log/glusterfs/etc-glusterfs-glusterd.vol.log
    # systemctl start glusterd
     
  • 3. ウェルノウンポート衝突

GlusterFSがBrickに接続する際、宛先ポートはTCP:49152から昇順にアクセスするが、
ローカルポートはTCP:1024から開いている番号の降順に利用する。
その為、GlusterFS環境下でIMAPS(TCP:993)やPOP3S(TCP:995)を構築するとポート番号の衝突が多々発生する。
この場合、GlusterFSの「開いている番号を降順に利用」する仕様を応用し、
GlusterFSが起動する前に、IMAPS/POP3Sのサービスを起動する事で回避出来る。
 

 コマンド
 
  • 4. ブリック追加・削除
    ブリックを追加・削除する際は、ノードをクラスタに追加した後にボリューム操作を実行する。
    この時、追加先のボリュームでノード数固定(replica-3など)をしている場合、
    先にノード数を変更した後にブリック操作を行う。
     
     コマンド