CentOS7でGlusterFSの環境構築

0.事前情報
=======

用語
-------

* Brick
  - GlusterFSで使用するサーバ上のディレクトリ。
  - GlusterFSにはストレージとして用いられる。
  - GlusterFSで構築した、分散FSに保存されたファイルは物理的にはこのブリック内に保存される。

* Volume
  - 上記のBrickを論理的に一つにまとめて1ストレージとして扱うことができるもの。
  - Volumeには3種類ある
      * Distributed : 保存したファイルが、Volume内のBrickのいずれか一つに格納される。 
      * Replicated : 保存したファイルが、Volume内の全てのBrickに格納される。
      * Striped : 保存したファイルが、分割され、指定したストライプ数に分散され格納される。
  - 以下のサイトの図がわかりやすい
      * http://dev.classmethod.jp/cloud/aws/glusterfs-on-ec2/

導入環境
--------

* CentOS 7.1.1503 (64bit)
* Gluster-Server : ver 3.7.4-2.el7
* HDDを2枚持つ仮想マシン
  - sdbが追加したディスク
* gluster-01, gluster-02, gluster-03の3台で構成
* gluster-01のipアドレス: 10.255.10.11
* gluster-02のipアドレス: 10.255.10.12
* gluster-03のipアドレス: 10.255.10.13

注意
----

* 基本的にコマンドはルートで行う
* 断り書きがない限りはすべてのノードで同じ作業を行う

1.必要なもののインストール
=======================

2016/08/03追記；epelを入れなくてもGlusterFSがインストールできるようになりました。↓の2コマンドを打ち込むだけでOKです。

```
# yum install centos-release-gluster
# yum install glusterfs-server
```

* EPELのinstall

        # yum install epel-release -y

  - もしくは

            # wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
            # rpm -ivh epel-release-7-5.noarch.rpm


* Gluster serverのinsatall

        # cd /etc/yum.repos.d/
        # wget http://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo
        # yum install glusterfs-server -y
        # systemctl start glusterd
        # systemctl status glusterd    (起動しているか確認)
            glusterd.service - GlusterFS, a clustered file-system server
               Loaded: loaded (/usr/lib/systemd/system/glusterd.service; disabled)
               Active: active (running) since 月 2015-09-28 04:50:01 JST; 11s ago
              Process: 10023 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid (code=exited, status=0/SUCCESS)
             Main PID: 10024 (glusterd)
               CGroup: /system.slice/glusterd.service
                       mq10024 /usr/sbin/glusterd -p /var/run/glusterd.pid

             9月 28 04:50:01 gluster-02 systemd[1]: Started GlusterFS, a clustered file-....
            Hint: Some lines were ellipsized, use -l to show in full.

        # systemctl enable glusterd

2016/04/22追記: glusterfs-epel.repoのURLが変更されていたので修正しました。

2015/11/16追記: 11/10の更新でLATESTの中に、CentOSディレクトリが現在、消えているので注意してください。
最新版ではないですが、glusterfs-epel.repoをwgetで持ってくる場所を以下のコマンドに置き換えることで対応できます。

```
sudo wget http://download.gluster.org/pub/gluster/glusterfs/3.7/3.7.5/CentOS/glusterfs-epel.repo
```



2.各ノードの設定
=============

* firewalldを止める
    
        # systemctl stop firewalld

  - firewallを止めるのが嫌な場合は以下のポートを解放するとよいらしい(公式より)

      * 24007	(TCP): Gluster Daemon
      * 24008 (TCP): TCP for Infiniband management (optional unless you are using IB)
      * 24009 - 240xx (TCP): brick port(GlusterFS 3.3 & below)
      * 49152 - 491xx (TCP): brick port(GlusterFS 3.4 & later)
      * 38465 - 38467 (TCP): Gluster NFS Server
      * 111 (TCP and UDP): portmapper
      * 2049 (TCP): portmapper(GlusterFS 3.4 & later)

    - brick portはブリックごとに必要。1 volume, 2 brickならばポート番号は49152と49153を使用する。
    - コマンド例

            # firewall-cmd --add-port=24007-24099/tcp --zone=public --permanent
            # firewall-cmd --reload


* hostsファイルの編集(お好みで)

        # vi /etc/hosts

  - 10.255.10.12 gluster-02 　こんな感じで追加
  - 同様に他のノードに関しても追加
  - hostsの設定をせずに、IPアドレスでもできる

3.ストレージプールの作成
===================================

* gluster peerをすることでノード間を認識させ、ストレージプールを作成する
* gluster-01のみで行う

        [root@gluster-01 ~]# gluster peer probe gluster-02
        [root@gluster-01 ~]# gluster peer probe gluster-03

  - この時　peer probe: failed: Probe returned with unknown errno 107　というエラーが出ているときはポートが空いていない可能性大

* peerの確認

                [root@gluster-01 ~]# gluster peer status
                Number of Peers: 2

                Hostname: gluster-02
                Uuid: 91ef7964-2451-4ef1-aeb2-91e4e44e6186
                State: Peer in Cluster (Connected)

                Hostname: gluster-03
                Uuid: e8821d6c-8a10-4494-af79-8aab7a518c30
                State: Peer in Cluster (Connected)

4.GlusterFS用の領域の用意
================

* ルートパーティションでgluster volumeを作成しようとすると警告が出る
* どうしてもルートパーティションに作成したい場合は force を 最後につけることで作成できる
* 今回の構成では、2つディスクを用意しているため、ルートパーティションがあるディスクとは別のディスク(sdb)にGlusterFS用の領域を作成する

        # fdisk /dev/sdb

    - fdidkで打つもの(nでパーティションを新規作成,全てdefaultでいいのでenter4回, wで書き込み)
  

* ファイルシステム作成(xfsかext4じゃないとダメ)    

        # mkfs.xfs -i size=512 /dev/sdb1

* 作成したパーティションのマウント

        # mkdir -p /export/sdb1 
        # mount /dev/sdb1 /export/sdb1
        # mkdir -p /export/sdb1/brick
        # df
            ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
            /dev/mapper/centos-root    14571520 1172812 13398708    9% /
            devtmpfs                     936396       0   936396    0% /dev
            tmpfs                        942792       0   942792    0% /dev/shm
            tmpfs                        942792    8608   934184    1% /run
            tmpfs                        942792       0   942792    0% /sys/fs/cgroup
            /dev/sda1                    508588  130496   378092   26% /boot
            /dev/sdb1                  16765952   32944 16733008    1% /export/sdb1

        # echo "/dev/sdb1 /export/sdb1 xfs defaults 0 0"  >> /etc/fstab
        # mount -a

5.Gluster Volume(Replication)の作成・起動
======================================

## Gluster Volumeの作成

以下の作業はgluster-01のみで行う

        # gluster vol info
                No volumes present
        # gluster volume create gv0 replica 3 gluster-01:/export/sdb1/brick/gv0/ gluster-02:/export/sdb1/brick/gv0/ gluster-03:/export/sdb1/brick/gv0
            volume create: gv0: success: please start the volume to access data
        # gluster vol info
            Volume Name: gv0
            Type: Replicate
            Volume ID: b852413c-f62b-45e0-9daa-c4528cf454b5
            Status: Created
            Number of Bricks: 1 x 3 = 3
            Transport-type: tcp
            Bricks:
            Brick1: gluster-01:/export/sdb1/brick/gv0
            Brick2: gluster-02:/export/sdb1/brick/gv0
            Brick3: gluster-03:/export/sdb1/brick/gv0
            Options Reconfigured:
            performance.readdir-ahead: on

* gv0という名前でgluster-01,02,03ノードに、レプリケーションモードで使用するボリュームを作成した

## Gluster Volumeの起動

        # gluster volume start gv0
            volume start: gv0: success
        # gluster vol status
                Status of volume: gv0
                Gluster process                             TCP Port  RDMA Port  Online  Pid
                ------------------------------------------------------------------------------
                Brick gluster-01:/export/sdb1/brick/gv0      49152     0          Y       9799
                Brick gluster-02:/export/sdb1/brick/gv0      49152     0          Y       30121
                Brick gluster-03:/export/sdb1/brick/gv0      49152     0          Y       29985
                NFS Server on localhost                     N/A       N/A        N       N/A
                Self-heal Daemon on localhost               N/A       N/A        Y       9827
                NFS Server on gluster-03                     N/A       N/A        N       N/A
                Self-heal Daemon on gluster-03               N/A       N/A        Y       30012
                NFS Server on gluster-02                     N/A       N/A        N       N/A
                Self-heal Daemon on gluster-02               N/A       N/A        Y       30148

                Task Status of Volume gv0
                ------------------------------------------------------------------------------
                There are no active volume tasks

## 参考

* 分散ボリュームを作成したい場合

        # gluster volume create gv1 gluster-01:/export/sdb1/brick/gv1/ gluster-02:/export/sdb1/brick/gv1/
        # gluster volume start gv1

* ストライピングボリュームを作成したい場合

        # gluster volume create gv2 stripe 2 gluster-01:/export/sdb1/brick/gv2/ gluster-02:/export/sdb1/brick/gv2/
        # gluster volume start g2

* 追加情報
    - 同一ノード上で複数ブリック使用したい場合
      * 分散、ストライピング：使用可能
      * レプリケート： 使用可能、しかし非推奨であるため、force オプションをつける必要がある

6.glusterボリュームのマウント
==============================

## glusterfsでマウント(gluster-02から)

        # mount -t glusterfs gluster-01:/gv0 /mnt
        # df
        ファイルシス            1K-ブロック    使用   使用可 使用% マウント位置
        /dev/mapper/centos-root    14571520 1180396 13391124    9% /
        devtmpfs                     936396       0   936396    0% /dev
        tmpfs                        942792       0   942792    0% /dev/shm
        tmpfs                        942792    8616   934176    1% /run
        tmpfs                        942792       0   942792    0% /sys/fs/cgroup
        /dev/sda1                    508588  130496   378092   26% /boot
        /dev/sdb1                  16765952   33104 16732848    1% /export/sdb1
        gluster-01:/gv0             16765952   33152 16732800    1% /mnt

  - yum install でgluster-clientだけをインストールしたノードからでもマウントできる。

## nfsマウント

nfsクライアントとしてgluster-clientノードを用意する

* nfs server側で

        # gluster vol status
                Status of volume: gv0
                Gluster process                             TCP Port  RDMA Port  Online  Pid
                ------------------------------------------------------------------------------
                Brick gluster-01:/export/sdb1/brick/gv0      49152     0          Y       9799
                Brick gluster-02:/export/sdb1/brick/gv0      49152     0          Y       30121
                Brick gluster-03:/export/sdb1/brick/gv0      49152     0          Y       29985
                NFS Server on localhost                     N/A       N/A        N       N/A
                Self-heal Daemon on localhost               N/A       N/A        Y       9827
                NFS Server on gluster-03                     N/A       N/A        N       N/A
                Self-heal Daemon on gluster-03               N/A       N/A        Y       30012
                NFS Server on gluster-02                     N/A       N/A        N       N/A
                Self-heal Daemon on gluster-02               N/A       N/A        Y       30148

                Task Status of Volume gv0
                ------------------------------------------------------------------------------
                There are no active volume tasks

* glusterfsのnfsサーバは動いてない
  - GlusterFSでは自前のnfsサーバを使うためサービスとして動いているnfsサーバがあれば止める

* すべてのノードで必要なパッケージ

        # yum install nfs-utils

* rpcbindが動いていなかったらstartする

        # systemctl start rpcbind.service
        # systemctl status rpcbind.service
                rpcbind.service - RPC bind service
                   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; static)
                   Active: active (running) since 土 2015-09-26 04:28:37 JST; 5s ago
                  Process: 9872 ExecStart=/sbin/rpcbind -w ${RPCBIND_ARGS} (code=exited, status=0/SUCCESS)
                 Main PID: 9873 (rpcbind)
                   CGroup: /system.slice/rpcbind.service
                           mq9873 /sbin/rpcbind -w

        # systemctl enable rpcbind.service

* glusterdのリスタート

        # systemctl restart glusterd.service

* nfs Serveが起動しているか確認

        # gluster vol status
        Status of volume: gv0
        Gluster process                             TCP Port  RDMA Port  Online  Pid
        ------------------------------------------------------------------------------
        Brick gluster-01:/export/sdb1/brick/gv0      49152     0          Y       9799
        Brick gluster-02:/export/sdb1/brick/gv0      49152     0          Y       30121
        Brick gluster-03:/export/sdb1/brick/gv0      49152     0          Y       29985
        NFS Server on localhost                     2049      0          Y       9912
        Self-heal Daemon on localhost               N/A       N/A        Y       9920
        NFS Server on gluster-02                     2049      0          Y       30294
        Self-heal Daemon on gluster-02               N/A       N/A        Y       30302
        NFS Server on gluster-03                     2049      0          Y       30085
        Self-heal Daemon on gluster-03               N/A       N/A        Y       30093

        Task Status of Volume gv0
        ------------------------------------------------------------------------------
        There are no active volume tasks

* nfs client側で

        # mount -t nfs -o mountproto=tcp,mountvers=3 gluster-01:/gv0 /mnt/

  * うまくいかなかったらrpcbindが起動しているか確かめる

7.ノードの追加
================

* 現在Glusterでクラスタを組んでいるノードから、gluster peerしてあげる

8.ボリュームの拡張
===============

* ボリュームを拡張する時、レプリケーションで利用している場合と分散で利用している場合で若干異なる
* 利用するブリックを増やすことで拡張する

* レプリケーションしているときは、現在のレプリカ数の倍数のブリックを同時に追加する必要がある

        # gluster vol add-brick gv0 gluster04:/export/sdb1/brick/gv0 gluster05:/export/sdb1/brick/gv0 gluster06:/export/sdb1/brick/gv0

* 分散は特になし
  - ちなみに追加後データの再配置を行うことができる

            # gluster vol add-brick gv1 gluster04:/export/sdb1/brick/gv1
            # gluster vol rebalance gv1 start


# 参考

* http://www.tecmint.com/how-to-enable-epel-repository-for-rhel-centos-6-5/
* http://www.gluster.org/community/documentation/index.php/Basic_Gluster_Troubleshooting
  - ポートについてのTroubleshooting
* http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/
* https://access.redhat.com/documentation/en-US/Red_Hat_Storage/2.0/html/Administration_Guide/sect-User_Guide-Monitor_Workload-Displaying_Volume_Status.html
  - 手順書には書いていないが、Gluster Volumeの様々なステータスを見るコマンドが掲載されている