GlusterFS分散型ストレージ構築デュアルマシンレプリケーションボリュームとKeepalivedを組み合わせたストレージ高可用性


GlusterFS分散型ストレージ高可用性シナリオ設計
1.GlusterFSレプリケーションボリュームの構築(少なくとも2つのストレージノードを使用)
2、Keepalived管理GlusterFS主従ストレージノードの配置
3、KeepalivedフローティングIP(VIP)を配置して外部にストレージサービスを提供する
4、ストレージの高可用性を実現する(即ち、2台のGlusterFSサーバーを使用して二重ノードレプリケーションボリュームを提供し、快速なフェイルオーバを提供し、ストレージの持続的高可用性を実現する)
5、重要データストレージのビジネスシーンに適用できる
一、環境準備
IP
Hostname
きおく
システム
VIP
172.16.10.10
data-node-01
/dev/sdb1
CentOS7
172.16.10.020説明:ストレージ・サービスの対外提供
172.16.10.11
data-node-02
/dev/sdb1
CentOS7
172.16.10.12
web-node-12
クライアント
/etc/hosts構成
172.16.10.10 data-node-01
172.16.10.11 data-node-02

GlusterFSストレージマウントポイントの確立
mkdir -p /glusterfs/storage1
echo "/dev/sdb1    /glusterfs/storage1    xfs    defaults    0 0" >> /etc/fstab
mount -a

二、GlusterFSサービス端ソフトウェアのインストール
1、glusterソースをインストールし、glusterfs及び関連パッケージをインストールする
yum install centos-release-gluster -y
yum install glusterfs glusterfs-server glusterfs-cli glusterfs-geo-replication glusterfs-rdma -y

2、クライアントはGlusterFSクライアントソフトウェアをインストールする
yum install glusterfs-fuse

3、Glusterdサービスを起動する
systemctl start glusterd

4、いずれかのノードに信頼ノードを追加する
gluster peer probe data-node-02
gluster peer probe data-node-01

gluster peer status

5、いずれかのノードで複製ボリュームを作成する
mkdir /glusterfs/storage1/rep_vol1
gluster volume create rep_vol1 replica 2 data-node-01:/glusterfs/storage1/rep_vol1 data-node-02:/glusterfs/storage1/rep_vol1

6、複製ボリュームの起動
gluster volume start rep_vol1

7、複製ボリュームの状態を表示する
gluster volume status
gluster volume info

8、クライアントテストマウントコピーボリューム
mount -t glusterfs data-node-01:rep_vol1 /data/

9、クライアントテストコピーボリュームデータストレージ
for i in `seq -w 1 3`;do cp -rp /var/log/messages /data/test-$i;done

[root@localhost ~]# ls /data/
111  1.txt  2.txt  anaconda-ks.cfg  test-1  test-2  test-3

三、Keepalivedのインストールと配置
1、Keepalivedを取り付ける
yum -y install keepalived

2、keepalivedサービスの起動
systemctl start keepalived

3、メインノードkeepalived配置
! Configuration File for keepalived

global_defs {
   notification_email {
       [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id GFS_HA_MASTER
   vrrp_skip_check_adv_addr
}

vrrp_sync_group GFS_HA_GROUP {
    group {
        GFS_HA_1
    }
}

vrrp_script monitor_glusterfs_status {
    script "/etc/keepalived/scripts/monitor_glusterfs_status.sh"
    interval 5
    fall 3
    rise 1
    weight 20
}

vrrp_instance GFS_HA_1 {
    state BACKUP
    interface ens34
    virtual_router_id 107
    priority 100
    advert_int 2
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 11112222
    }

    virtual_ipaddress {
        172.16.10.220/24 dev ens34
    }

    track_script {
        monitor_glusterfs_status
    }

    track_interface {
        ens34
    }
    notify_master "/etc/keepalived/scripts/keepalived_notify.sh master"
    notify_backup "/etc/keepalived/scripts/keepalived_notify.sh backup"
    notify_fault  "/etc/keepalived/scripts/keepalived_notify.sh fault"
    notify_stop   "/etc/keepalived/scripts/keepalived_notify.sh stop"
}

4、スペアノードkeepalived配置
! Configuration File for keepalived

global_defs {
   notification_email {
       [email protected]
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id GFS_HA_MASTER
   vrrp_skip_check_adv_addr
}

vrrp_sync_group GFS_HA_GROUP {
    group {
        GFS_HA_1
    }
}

vrrp_script monitor_glusterfs_status {
    script "/etc/keepalived/scripts/monitor_glusterfs_status.sh"
    interval 5
    fall 3
    rise 1
    weight 20
}

vrrp_instance GFS_HA_1 {
    state BACKUP
    interface ens34
    virtual_router_id 107
    priority 90
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass 11112222
    }

    virtual_ipaddress {
        172.16.10.220/24 dev ens34
    }

    track_script {
        monitor_glusterfs_status
    }

    track_interface {
        ens34
    }
    notify_master "/etc/keepalived/scripts/keepalived_notify.sh master"
    notify_backup "/etc/keepalived/scripts/keepalived_notify.sh backup"
    notify_fault  "/etc/keepalived/scripts/keepalived_notify.sh fault"
    notify_stop   "/etc/keepalived/scripts/keepalived_notify.sh stop"
}

5、keepalived vrrp監視スクリプト
#!/bin/bash
#check glusterfsd and glusterd process

systemctl status glusterd &>/dev/null
if [ $? -eq 0 ];then
    systemctl status glusterfsd &>/dev/null
    if [ $? -eq 0 ];then
        exit 0
    else
        exit 2
    fi
else
    systemctl start glusterd &>/dev/null
    systemctl stop keepalived &>/dev/null && exit 1
fi

6、keepalived通知スクリプト(Glusterdサービスの管理)
#!/bin/bash
#keepalived script for glusterd

master() {
    systemctl status glusterd
    if [ $? -ne 0 ];then
        systemctl start glusterd
    else
        systemctl restart glusterd
    fi
}

backup() {
    systemctl status glusterd
    if [ $? -ne 0 ];then
        systemctl start glusterd
    fi
}

case $1 in
    master)
        master
    ;;
    backup)
        backup
    ;;
    fault)
        backup
    ;;
    stop)
        backup
        systemctl restart keepalived
    ;;
    *)
        echo $"Usage: $0 {master|backup|fault|stop}"
esac

四、Keepalived自動引き継ぎGlusterFSサービス及びストレージの可用性をテストする
1、keepalivedサービスを再起動する
systemctl restart keepalived.service

2、VIPの管理状況を確認する
##  1 
[root@data-node-01 ~]# ip a show dev ens34
3: ens34:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b2:b5:2a brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.10/24 brd 172.16.10.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet 172.16.10.220/24 scope global secondary ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::ce9a:ee2e:7b6c:a6bb/64 scope link 
       valid_lft forever preferred_lft forever

##  2 
[root@data-node-02 ~]# ip a show dev ens34
3: ens34:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ba:42:cf brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.11/24 brd 172.16.10.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::e23:ce0:65c3:ffbf/64 scope link 
       valid_lft forever preferred_lft forever

3、クライアントにVIPを使用してGlusterFSから提供されたコピーボリュームをマウントし、使用可能かどうかをテストする
mount -t glusterfs 172.16.10.220:rep_vol1 /data/

[root@localhost ~]# ls /data/
111  1.txt  2.txt  anaconda-ks.cfg  test  test-1  test-2  test-3

[root@localhost ~]# mkdir /data/test
[root@localhost ~]# echo 1111 >/data/test/1.txt
[root@localhost ~]# ls /data/test
1.txt
[root@localhost ~]# cat /data/test/1.txt 
1111

GluserFSノードコピーボリュームの使用状況の表示
[root@data-node-02 ~]# ls /glusterfs/storage1/rep_vol1/
111  1.txt  2.txt  anaconda-ks.cfg  test  test-1  test-2  test-3

3.GlusterFSサービスのフェイルオーバーをテストする
プライマリノード(ノード1)をシャットダウンまたは再起動し、GlusterFSサービスとVIPがノード2に移行しているかどうかを確認します.
[root@data-node-01 ~]# reboot

[root@data-node-02 ~]# ip a show dev ens34
3: ens34:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:ba:42:cf brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.11/24 brd 172.16.10.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet 172.16.10.220/24 scope global secondary ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::e23:ce0:65c3:ffbf/64 scope link 
       valid_lft forever preferred_lft forever

[root@data-node-02 ~]# tail -f /var/log/messages     
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: Sync group GFS_HA_GROUP has only 1 virtual router(s) - removing
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) removing protocol VIPs.
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: Using LinkWatch kernel netlink reflector...
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Entering BACKUP STATE
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)]
Aug 27 22:56:19 data-node-02 Keepalived_vrrp[2563]: VRRP_Script(monitor_glusterfs_status) succeeded
Aug 27 22:56:19 data-node-02 kernel: nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
Aug 27 22:56:19 data-node-02 kernel: IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
Aug 27 22:56:19 data-node-02 kernel: IPVS: Connection hash table configured (size=4096, memory=64Kbytes)
Aug 27 22:56:19 data-node-02 kernel: IPVS: Creating netns size=2040 id=0
Aug 27 22:56:19 data-node-02 kernel: IPVS: ipvs loaded.
Aug 27 22:56:19 data-node-02 Keepalived_healthcheckers[2562]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 27 22:56:21 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Changing effective priority from 90 to 110
Aug 27 23:01:01 data-node-02 systemd: Started Session 3 of user root.
Aug 27 23:01:01 data-node-02 systemd: Starting Session 3 of user root.
Aug 27 23:03:09 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Transition to MASTER STATE
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Entering MASTER STATE
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) setting protocol VIPs.
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Sending/queueing gratuitous ARPs on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:11 data-node-02 systemd: Stopping GlusterFS, a clustered file-system server...
Aug 27 23:03:11 data-node-02 systemd: Starting GlusterFS, a clustered file-system server...
Aug 27 23:03:12 data-node-02 systemd: Started GlusterFS, a clustered file-system server.
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: VRRP_Instance(GFS_HA_1) Sending/queueing gratuitous ARPs on ens34 for 172.16.10.220
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220
Aug 27 23:03:16 data-node-02 Keepalived_vrrp[2563]: Sending gratuitous ARP on ens34 for 172.16.10.220

クライアントでストレージがまだ使用可能かどうかをテスト
[root@localhost ~]# df -Th
Filesystem             Type            Size  Used Avail Use% Mounted on
/dev/mapper/cl-root    xfs              40G  1.2G   39G   3% /
devtmpfs               devtmpfs        1.9G     0  1.9G   0% /dev
tmpfs                  tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs                  tmpfs           1.9G  8.6M  1.9G   1% /run
tmpfs                  tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1              xfs            1014M  139M  876M  14% /boot
tmpfs                  tmpfs           378M     0  378M   0% /run/user/0
172.16.10.220:rep_vol1 fuse.glusterfs   10G  136M  9.9G   2% /data


[root@localhost ~]# ls /data/
111  1.txt  2.txt  anaconda-ks.cfg  test  test-1  test-2  test-3

[root@localhost ~]# touch /data/test.log
[root@localhost ~]# ls -l /data/
total 964
drwxr-xr-x 3 root root   4096 Aug 27 21:58 111
-rw-r--r-- 1 root root     10 Aug 27 21:23 1.txt
-rw-r--r-- 1 root root      6 Aug 27 21:36 2.txt
-rw------- 1 root root   2135 Aug 27 21:44 anaconda-ks.cfg
drwxr-xr-x 2 root root   4096 Aug 27 22:59 test
-rw------- 1 root root 324951 Aug 27 21:23 test-1
-rw------- 1 root root 324951 Aug 27 21:23 test-2
-rw------- 1 root root 324951 Aug 27 21:23 test-3
-rw-r--r-- 1 root root      0 Aug 27 23:05 test.log

ノード1のステータスの表示
[root@data-node-01 ~]# ip a show dev ens34
3: ens34:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:b2:b5:2a brd ff:ff:ff:ff:ff:ff
    inet 172.16.10.10/24 brd 172.16.10.255 scope global ens34
       valid_lft forever preferred_lft forever
    inet6 fe80::ce9a:ee2e:7b6c:a6bb/64 scope link 
       valid_lft forever preferred_lft forever

keepalivedサービスの再起動
[root@data-node-01 ~]# systemctl start keepalived.service

keepalivedログの表示(プライマリ・スタンバイ・ステータス)
Aug 27 23:07:42 data-node-01 systemd: Starting LVS and VRRP High Availability Monitor...
Aug 27 23:07:43 data-node-01 Keepalived[2914]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
Aug 27 23:07:43 data-node-01 Keepalived[2914]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 27 23:07:43 data-node-01 Keepalived[2915]: Starting Healthcheck child process, pid=2916
Aug 27 23:07:43 data-node-01 systemd: Started LVS and VRRP High Availability Monitor.
Aug 27 23:07:43 data-node-01 Keepalived[2915]: Starting VRRP child process, pid=2917
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Registering Kernel netlink reflector
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Registering Kernel netlink command channel
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Registering gratuitous ARP shared channel
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: WARNING - default user 'keepalived_script' for script execution does not exist - please create.
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: SECURITY VIOLATION - scripts are being executed but script_security not enabled.
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Sync group GFS_HA_GROUP has only 1 virtual router(s) - removing
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: VRRP_Instance(GFS_HA_1) removing protocol VIPs.
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: Using LinkWatch kernel netlink reflector...
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: VRRP_Instance(GFS_HA_1) Entering BACKUP STATE
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: VRRP sockpool: [ifindex(3), proto(112), unicast(0), fd(10,11)]
Aug 27 23:07:43 data-node-01 Keepalived_vrrp[2917]: VRRP_Script(monitor_glusterfs_status) succeeded
Aug 27 23:07:43 data-node-01 kernel: nf_conntrack version 0.5.0 (16384 buckets, 65536 max)
Aug 27 23:07:43 data-node-01 kernel: IPVS: Registered protocols (TCP, UDP, SCTP, AH, ESP)
Aug 27 23:07:43 data-node-01 kernel: IPVS: Connection hash table configured (size=4096, memory=64Kbytes)
Aug 27 23:07:43 data-node-01 kernel: IPVS: Creating netns size=2040 id=0
Aug 27 23:07:43 data-node-01 Keepalived_healthcheckers[2916]: Opening file '/etc/keepalived/keepalived.conf'.
Aug 27 23:07:43 data-node-01 kernel: IPVS: ipvs loaded.
Aug 27 23:07:45 data-node-01 Keepalived_vrrp[2917]: VRRP_Instance(GFS_HA_1) Changing effective priority from 100 to 120

このことから、ノード1の障害が回復するとkeepalivedはスタンバイ状態に入り、GlusterFSサービスの監督管理を継続し、ノード2の障害が発生するとサービス、ストレージ、VIPをノード1に切り替え、外部にストレージサービスを提供し続け、ストレージの高可用性を実現する