GlusterFS

#サーバー側
>## インストール
>
```shell-session: 
wget -P /etc/yum.repos.dhttp://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo
sed -i 's/^enabled=1/enabled=0/g' /etc/yum.repos.d/glusterfs-epel.repo
yum install --enablerepo=glusterfs-epel glusterfs{-fuse,-server}
chkconfig glusterd on
service glusterd start
```

>## データー領域(ブリック)の作成
>Red Hat Storageの場合、ストレージブリックのファイルシステムはLVM + XFSじゃないとサポートされない。
>#### LVM作成
>
```shell-session:
pvcreate {DEVICE-PATH}
vgcreate {VG-NAME} {DEVICE-PATH}
lvcreate -L 100G -n {LV-NAME} {VG-NAME}
```

>#### ファイルシステムのフォーマット
>>xfsかext4どちらか選択
>>#####xfsフォーマット
>>>
```shell-session:
yum install xfsprogs
mkfs.xfs -i size=512 {DEVICE-PATH}
mkdir -p {PATH}
vi /etc/fstab
    /dev/{VG-NAME}/{LV-NAME} {PATH} xfs  defaults 1 2
mount -a
```
>>
>>#####ext4フォーマット
>>>
```shell-session:
mkfs.ext4 -I 512     {DEVICE-PATH}
mkdir -p {PATH}
vi /etc/fstab
		/dev/mapper/{VG-NAME}-{LV-NAME} {PATH} ext4 defaults 1 2
mount -a
```

>## peer
>
```shell-session:
gluster peer probe {GLUSTERIP|HOST}
gluster peer status
```

>## volume
>
>### Distributed Volume
>>* ファイル分散方式でGlusterFSデフォルトの構成
>>* ファイルはいずれかのサーバーに格納
>>* サーバーに障害が発生した場合は、そのサーバー内に保存されているファイルだけが参照できない
>>
```shell-session:
gluster volume create {VOLNAME} \
{GLUSTERIP|HOST}:{PATH} \
{GLUSTERIP|HOST}:{PATH}
```
>
>### Striped Volume
>>* RAID 0 方式
>>* ひとつのファイルをサーバー間で分割(ストライプサイズ：デフォルト128KB)格納
>>* サーバーに障害が発生した場合は、全てのファイルにアクセスできなくなる
>>
```shell-session:
gluster volume create {VOLNAME} \
stripe  {COUNT} \
{GLUSTERIP|HOST}:{PATH} \
{GLUSTERIP|HOST}:{PATH}
```
>
>### Replicated Volume
>>* RAID 1 方式
>>* ひとつのファイルをサーバー間でミラーリングする
>>* サーバーに障害が発生した場合は、片方のサーバーからファイルにアクセスできる
>>
```shell-session:
gluster volume create {VOLNAME} \
replica {REPLICA_COUNT} \
{GLUSTERIP|HOST}:{PATH} \
{GLUSTERIP|HOST}:{PATH}
```
>
>## 起動
>
```shell-session:
gluster volume start {VOLNAME}
```

>## 確認
>
```shell-session:
gluster volume info
gluster volume status
```

>## nfsインストール(nfsマウントする場合のみ)
>
```shell-session:
yum install nfs-utils rpcbind
chkconfig rpcbind on
service rpcbind start
service nfs stop
```

#クライアント側
>## インストール
>
```shell-session:
wget -P /etc/yum.repos.dhttp://download.gluster.org/pub/gluster/glusterfs/LATEST/EPEL.repo/glusterfs-epel.repo
sed -i 's/^enabled=1/enabled=0/g' /etc/yum.repos.d/glusterfs-epel.repo
yum install --enablerepo=glusterfs-epel glusterfs-fuse
```
>
>## マウント
>>
```shell-session:
mkdir -p {MOUNT_PATH}
```
>>
>>glusterfs/nfsどちらか選択
>### glusterfsによるマウント
>>>
```shell-session:
mount -t glusterfs {GLUSTERIP|HOST}:/{VOLNAME} {MOUNT_PATH}
```
>>
>### nfsによるマウント
>>>OS 標準の nfs でなはくgluster専用の nfs を使うため、nfsは起動してはいけない。
>>>
```shell-session:
mount -t nfs -o mountproto=tcp,vers=3 {GLUSTERIP|HOST}:/{VOLNAME} /{MOUNT_PATH}
```

### GlusterFS用チューニング

```bash:kernel_tuner.sh
#!/bin/sh

#--- memo --
# 参考：https://sites.google.com/site/glusterfstech/install

#--- vm.swappiness [デフォルト:60]
# 0にすると物理メモリを使いきるまでswapしなくなる。

#--- vm.dirty_background_ratio [デフォルト:10]
#メモリに対してdirtyデータが指定の%になるとバックグラウンドでpdflushが動作
#値を小さくすればこまめに掃除をし、メモリが空く可能性がある。

#--- kernel.sched_wakeup_granularity_ns [デフォルト:2000000]

#--- /sys/block/sda/queue/scheduler [デフォルト:cfq]
#------ noop
#------ anticipatory
#------ cfq
# 全てのプロセスに均等にI/Oを割り当てる。
# 多数のプロセスが細かいI/Oを大量に発生させる場合はこれが良い。
#------ deadline
# I/O待ち時間の限界点（deadline）を設けて、
# それが近付いたものを優先的に処理していく。
# 少数のプロセスが大量のI/Oを発生させる環境に適している。

#--- /sys/block/sda/queue/nr_requests [デフォルト:128]
# 数値を増やすことによりより多くのI/O要求を受け付けられるようになるが､
# I/Oﾃﾞﾊﾞｲｽの種類によってはQueueが長過ぎる状態となり､
# 逆にﾊﾟﾌｫｰﾏﾝｽが悪化する場合もある

function set_sysctl(){

    local SYSCTL_NAME=$1
    local SYSCTL_NEW=$2

    SYSCTL_OLD=$(sysctl -n "${SYSCTL_NAME}")
    sysctl -w ${SYSCTL_NAME}=${SYSCTL_NEW}
    local MESSAGE="${SYSCTL_NAME} ${SYSCTL_OLD} >> ${SYSCTL_NEW}"
    logging "${MESSAGE}"

}

function logging(){

    local MESSAGGE=$1
    echo "${MESSAGE}"
    logger -ip local0.info ${MESSAGE}

}

function set_sys(){

    local SCHEDULER_NEW="deadline"
    local NR_REQUESTS_NEW=256

    for IOSCHED_PATH in $(ls -d /sys/block/*/queue/iosched 2>/dev/null); do

        if [ -z ${IOSCHED_PATH} ]
        then
            continue
        else

            QUEUE_DIR=$(dirname ${IOSCHED_PATH})
            SCHEDULER_PATH="${QUEUE_DIR}/scheduler"
            NR_REQUESTS_PATH="${QUEUE_DIR}/nr_requests"


            if [ -f ${SCHEDULER_PATH} ]
            then
                SCHEDULER_OLD=$(cat "${SCHEDULER_PATH}")
                echo "${SCHEDULER_NEW}" > ${SCHEDULER_PATH}
                MESSAGE="${SCHEDULER_PATH} ${SCHEDULER_OLD} >> ${SCHEDULER_NEW}"
                logging "${MESSAGE}"
            fi

            if [ -f ${NR_REQUESTS_PATH} ]
            then
                NR_REQUESTS_OLD=$(cat ${NR_REQUESTS_PATH})
                echo "${NR_REQUESTS_NEW}" > ${NR_REQUESTS_PATH}
                MESSAGE="${NR_REQUESTS_PATH} ${NR_REQUESTS_OLD} >> ${NR_REQUESTS_NEW}"
                logging "${MESSAGE}"

            fi
        fi

    done


}

set_sysctl "vm.swappiness" "10"
set_sysctl "vm.dirty_background_ratio" "1"
set_sysctl "kernel.sched_wakeup_granularity_ns" "15"
set_sys
```