Keepalived+drbd+nfs実現nfs高可用性

22244 ワード

前言


  Centos7.5 Keepalive+drbd+nfs練習ノート

ホストの準備


drbdサービスホストには、使用可能なパーティションまたはディスクが必要です.
ホスト名
IP
test(導入およびnfsクライアント)
192.168.0.35
drbd-0001
192.168.0.81
drbd-0002
192.168.0.82

testホストansibleの配備


ansible環境導入
[root@test ~]# yum -y install ansible
[root@test ~]# vim /etc/hosts
192.168.0.81 drbd-0001
192.168.0.82 drbd-0002
[root@test ~]# vim /etc/ansible/ansible.cfg 
[defaults]
inventory      = /etc/ansible/hosts
host_key_checking = False
[root@test ~]# vim /etc/ansible/hosts 
[drbd]
drbd-000[1:2]
[root@test ~]# ssh-copy-id drbd-0001
[root@test ~]# ssh-copy-id drbd-0002

ansible環境検出
[root@test ~]# ansible drbd -m ping
drbd-0001 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}
drbd-0002 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

drbd導入


使用可能なディスクの確認
[root@test ~]# ansible drbd -m shell -a 'ls /dev/vdb'
drbd-0002 | SUCCESS | rc=0 >>
/dev/vdb

drbd-0001 | SUCCESS | rc=0 >>
/dev/vdb

ディスクパーティションvdb 1は、データディスクvdb 2としてメタデータとして格納される
[root@test ~]# ansible drbd -m shell -a 'parted /dev/vdb mklabel GPT ;parted /dev/vdb mkpart primary 1M 90%;parted /dev/vdb mkpart primary 90% 100%'
[root@test ~]# ansible drbd -m shell -a 'lsblk'
drbd-0001 | SUCCESS | rc=0 >>
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0   10G  0 disk 
├─vdb1 253:17   0    9G  0 part 
└─vdb2 253:18   0 1023M  0 part 

drbd-0002 | SUCCESS | rc=0 >>
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   40G  0 disk 
└─vda1 253:1    0   40G  0 part /
vdb    253:16   0   10G  0 disk 
├─vdb1 253:17   0    9G  0 part 
└─vdb2 253:18   0 1023M  0 part 

構成/etc/hostsここでホスト名はdrbdホスト名と一致する必要があります
[root@test ~]# vim hosts
::1	localhost	localhost.localdomain	localhost6	localhost6.localdomain6
127.0.0.1	localhost	localhost.localdomain	localhost4	localhost4.localdomain4
192.168.0.81 drbd-0001
192.168.0.82 drbd-0002
[root@test ~]# ansible drbd -m copy -a 'src=hosts dest=/etc/hosts'

drbd 84とkmod-drbd 84のインストール
[root@test ~]# ansible drbd -m yum -a 'name=drbd84-utils,kmod-drbd84 state=installed'

ロードモジュール
[root@test ~]# ansible drbd -m shell -a 'modprobe drbd'
drbd-0002 | FAILED | rc=1 >>
modprobe: FATAL: Module drbd not found.non-zero return code

drbd-0001 | FAILED | rc=1 >>
modprobe: FATAL: Module drbd not found.non-zero return code

上記のエラーが発生した場合は、カーネルアップグレードパッケージを再インストールし、モジュールを再ロードする必要があります.
[root@test ~]# ansible drbd -m yum -a 'name=kernel-devel,kernel,kernel-headers state=installed'
[root@test ~]# ansible drbd -m shell -a 'reboot'
[root@test ~]# ansible drbd -m shell -a 'modprobe drbd'
[root@test ~]# ansible drbd -m shell -a 'lsmod | grep drbd'
drbd-0001 | SUCCESS | rc=0 >>
drbd                  397041  0 
libcrc32c              12644  1 drbd

drbd-0002 | SUCCESS | rc=0 >>
drbd                  397041  0 
libcrc32c              12644  1 drbd

/dev/vdb 1にファイルシステムメタデータディスクを作成するファイルシステムを作成できません
[root@test ~]# ansible drbd -m shell -a 'mkfs.ext4 /dev/vdb1'

drbdプロファイルの編集
[root@test ~]# vim global_common.conf
global {
    usage-count no;        
}
common {
    protocol C;                     #c ( )
    disk {
 	    on-io-error detach;
    }
    syncer {
	    rate 100M;                  # 
    }
}
resource data {                     # data
    on drbd-0001 {                  # 
  	    device /dev/drbd1;          # drbd 
	    disk /dev/vdb1;             # 
	    address 192.168.0.81:7899;
	    meta-disk /dev/vdb2[0];     # 
    }
    on drbd-0002 {              
	    device /dev/drbd1;      
	    disk /dev/vdb1;
	    address 192.168.0.82:7899;
	    meta-disk /dev/vdb2[0];
    }
}
[root@test ~]# ansible drbd -m copy -a 'src=global_common.conf dest=/etc/drbd.d/global_common.conf'

リソース名dataのメタデータの作成
[root@test ~]# ansible drbd -m shell -a 'drbdadm create-md data'

リソース名dataのメタデータの起動
[root@test ~]# ansible drbd -m shell -a 'drbdadm up data'

drbd-0001ノードで情報を表示する場合、両方ともスレーブ状態
[root@test ~]# ansible drbd-0001 -m shell -a 'cat /proc/drbd'
drbd-0001 | SUCCESS | rc=0 >>
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:9435904

drbd-0001をプライマリとして同期データを設定する
[root@test ~]# ansible drbd-0001 -m shell -a 'drbdadm -- --overwrite-data-of-peer primary data'

データの同期
[root@test ~]# ansible drbd-0001 -m shell -a 'drbdadm -- --overwrite-data-of-peer primary data'
[root@test ~]# ansible drbd-0001 -m shell -a 'cat /proc/drbd'drbd-0001 | SUCCESS | rc=0 >>
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:1028096 nr:0 dw:0 dr:1030168 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8408064
	[=>..................] sync'ed: 11.0% (8208/9212)M
	finish: 0:03:31 speed: 39,680 (39,540) K/sec

データ同期が完了するとdrbd-0001がメインとなり、データ同期が完了すると構成が完了する
[root@test ~]# ansible drbd-0001 -m shell -a 'cat /proc/drbd'
drbd-0001 | SUCCESS | rc=0 >>
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-11-03 01:26:55

 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:9436160 nr:0 dw:0 dr:9438232 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

テストdrbd構成仮想ディスク/dev/drbd 1をマウント/dataしてテストファイルを作成する
[root@test ~]# ansible drbd-0001 -m shell -a 'mkdir /data;mount /dev/drbd1 /data;touch /data/a.txt'

drbd-0002ノードでdrbdサービスを閉じ、/dev/vdb 1をマウントしてテストファイルが存在するかどうかを確認します.
[root@test ~]# ansible drbd-0002 -m shell -a 'drbdadm down data;mkdir /data ;mount /dev/vdb1 /data;ls /data'
drbd-0002 | SUCCESS | rc=0 >>
a.txt
lost+found

drbdノードのdrbdサービスのリカバリ
[root@test ~]# ansible drbd-0002 -m shell -a 'umount /data;drbdadm up data'

keepavle+nfs導入


keepalivedとnfs-utilsをインストールします.192.168.0.210はvipです.
[root@test ~]# ansible drbd -m yum -a 'name=keepalived,nfs-utils state=installed'

keepalivedプロファイルdrbd-0001を編集するには
[root@drbd-0001 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id drbd1
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_service {
   script "ss -nualpt | grep 2049" 
   interval 2
   weight -50
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 105
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_service
    }
    notify_master /etc/keepalived/notify_master.sh
    notify_backup /etc/keepalived/notify_backup.sh
    notify_stop /etc/keepalived/notify_stop.sh
    virtual_ipaddress {
        192.168.0.210 dev eth0 label eth0:1
    }
}

drbd-0002の構成は
[root@drbd-0002 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id drbd2
   vrrp_skip_check_adv_addr
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script check_service {
   script "ss -nualpt | grep 2049 "
   interval 2
   weight -50
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 95
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        check_service
    }
    notify_master /etc/keepalived/notify_master.sh
    notify_backup /etc/keepalived/notify_backup.sh
    notify_stop /etc/keepalived/notify_stop.sh
    virtual_ipaddress {
        192.168.0.210 dev eth0 label eth0:1
    }
}

nfsファイルの構成
[root@test ~]# vim exports
/data 192.168.0.0/24(ro)
[root@test ~]# ansible drbd -m copy -a 'src=exports dest=/etc/'


スクリプトファイルの設定
[root@test ~]# vim notify_master.sh 
#!/bin/bash
drbdadm primary data
mount /dev/drbd1 /data
systemctl start nfs
[root@test ~]# vim notify_backup.sh 
#!/bin/bash
systemctl stop nfs
umount /data
drbdadm secondary data
[root@test ~]# vim notify_stop.sh 
#!/bin/bash
systemctl stop nfs
umount /data
drbdadm secondary data
systemctl restart nfs
[root@test ~]# ansible drbd -m copy -a 'src=notify_master.sh dest=/etc/keepalived/'
[root@test ~]# ansible drbd -m copy -a 'src=notify_backup.sh dest=/etc/keepalived/'
[root@test ~]# ansible drbd -m copy -a 'src=notify_stop.sh dest=/etc/keepalived/'
[root@test ~]# ansible drbd -m shell -a 'chmod +x /etc/keepalived/noti*' 

サービスデバッグの開始


drbd主従検査
[root@test ~]# ansible drbd -m shell -a 'cat /proc/drbd'

nfsサービスの開始
ansible drbd -m shell -a 'systemctl start nfs'

keepaliveの起動
[root@test ~]# ansible drbd -m shell -a 'systemctl start keepalived'

nfsクライアントマウント
[root@test ~]# mkdir /data
[root@test ~]# mount 192.168.0.210:/data /data/

プライマリノードでkeepaliveサービスまたはnfsサービステストを停止