使用DRBD+KEEPALIVED來實現NFS高可用


一 DRBD介紹

DRBD(Distributed ReplicatedBlock Device)是一種基於軟件的,無共享,分布式塊設備復制的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等)進行鏡像。
也就是說當某一個應用程序完成寫操作后,它提交的數據不僅僅會保存在本地塊設備上,DRBD也會將這份數據復制一份,通過網絡傳輸到另一個節點的塊設備上,這樣,兩個節點上的塊設備上的數據將會保存一致,這就是鏡像功能。

DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群,其實現方式是通過網絡來鏡像整個設備。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像,與心跳連接結合使用,可以把它看作是一種網絡RAID,它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。

DRBD工作在內核當中,類似於一種驅動模塊。DRBD工作的位置在文件系統的buffer cache和磁盤調度器之間,通過tcp/ip發給另外一台主機到對方的tcp/ip最終發送給對方的drbd,再由對方的drbd存儲在本地對應磁盤 上,類似於一個網絡RAID-1功能。在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣。本地(主節點)與遠程主機(備節點)的數據可以保 證實時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,可以繼續使用。

1 DRBD底層設備支持
DRBD需要構建在底層設備之上,然后構建出一個塊設備出來。對於用戶來說,一個DRBD設備,就像是一塊物理的磁盤,可以在上面內創建文件系統。
DRBD所支持的底層設備有以下這些類:
1)一個磁盤,或者是磁盤的某一個分區;
2)一個soft raid 設備;
3)一個LVM的邏輯卷;
4)一個EVMS(Enterprise Volume Management System,企業卷管理系統)的卷;
5)其他任何的塊設備。

2 DRBD工作原理
DRBD是一種塊設備,可以被用於高可用(HA)之中,它類似於一個網絡RAID-1功能,當你將數據寫入本地 文件系統時,數據還將會被發送到網絡中另一台主機上,以相同的形式記錄在一個文件系統中。 本地(主節點)與遠程主機(備節點)的數據可以保證實時同步.當本地系統出現故障時,遠程主機上還會 保留有一份相同的數據,可以繼續使用.在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣.因為數據同時存在於本地主機和遠程主機上,切換時,遠程主機只要使用它上面的那份備份數據,就可以繼續進行服務了。

3 DRBD工作機制
DRBD Primary負責接收數據,把數據寫到本地磁盤並發送給另一台主機DRBD Secondary,另一個主機再將數據存到自己的磁盤中。
目前,DRBD每次只允許對一個節點進行讀寫訪問,但這對於通常的故障切換高可用集群來說已經足夠用了,以后的版本將支持兩個節點進行讀寫存取。
DRBD協議說明:
1)數據一旦寫入磁盤並發送到網絡中就認為完成了寫入操作。
2)收到接收確認就認為完成了寫入操作。
3)收到寫入確認就認為完成了寫入操作。

二 DRBD的模式

DRBD有2中模式,一種是DRBD的主從模式,另一種是DRBD的雙主模式:

1 DRBD的主從模式
這種模式下,其中一個節點作為主節點,另一個節點作為從節點。其中主節點可以執行讀、寫操作;從節點不可以掛載文件系統,因此,也不可以執行讀寫操作。
在這種模式下,資源在任何時間只能存儲在主節點上。這種模式可用在任何的文件系統上(EXT3、EXT4、XFS等等)。默認這種模式下,一旦主節點發生故障,從節點需要手工將資源進行轉移,且主節點變成從節點和從節點變成主節點需要手動進行切換。不能自動進行轉移,因此比較麻煩。
為了解決手動將資源和節點進行轉移,可以將DRBD做成高可用集群的資源代理(RA),這樣一旦其中的一個節點宕機,資源會自動轉移到另一個節點,從而保證服務的連續性。

2 DRBD的雙主模式
這是DRBD8.0之后的新特性,在雙主模式下,任何資源在任何特定的時間都存在兩個主節點。這種模式需要一個共享的集群文件系統,利用分布式的鎖機制進行管理,如GFS和OCFS2。
部署雙主模式時,DRBD可以是負載均衡的集群,這就需要從兩個並發的主節點中選取一個首選的訪問數據。這種模式默認是禁用的,如果要是用的話必須在配置文件中進行聲明。

三 DRBD的同步協議

DRBD的復制功能就是將應用程序提交的數據一份保存在本地節點,一份復制傳輸保存在另一個節點上。但是DRBD需要對傳輸的數據進行確認以便保證另一個節點的寫操作完成,就需要用到DRBD的同步協議,DRBD同步協議有三種:

1 協議A:異步復制協議
一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。
數據在本地完成寫操作且數據已經發送到TCP/IP協議棧的隊列中,則認為寫操作完成。如果本地節點的寫操作完成,此時本地節點發生故障,而數據還處在TCP/IP隊列中,則數據不會發送到對端節點上。因此,兩個節點的數據將不會保持一致。這種協議雖然高效,但是並不能保證數據的可靠性。

2 協議B:內存同步(半同步)復制協議
一旦本地磁盤寫入已完成且復制數據包達到了對等節點則認為寫在主節點上被認為是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因為在傳輸中的數據
可能不會被提交到磁盤數據在本地完成寫操作且數據已到達對端節點則認為寫操作完成。如果兩個節點同時發生故障,即使數據到達對端節點,這種方式同樣也會導致在對端節點和本地節點的數據不一致現象,也不具有可靠性。

3 協議C:同步復制協議
只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。
只有當本地節點的磁盤和對端節點的磁盤都完成了寫操作,才認為寫操作完成。這是集群流行的一種方式,應用也是最多的,這種方式雖然不高效,但是最可靠。

以上三種協議中,一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,在生產環境使用時須慎重選項使用哪一種協議。

四 實驗環境

[root@primary ~]# systemctl stop firewalld
[root@primary ~]# systemctl disable firewalld
[root@primary ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@primary ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@primary ~]# cat <<EOF | tee -a /etc/hosts
192.168.1.1 primary
192.168.1.2 secondary

[root@secondary ~]# systemctl stop firewalld
[root@secondary ~]# systemctl disable firewalld
[root@secondary ~]# sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
[root@secondary ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)
[root@secondary ~]# cat <<EOF | tee -a /etc/hosts
192.168.1.1 primary
192.168.1.2 secondary

五 安裝配置

1 安裝drbd及配置
1.1 安裝drbd
[root@primary ~]# yum install kernel-devel kernel kernel-headers -y
[root@primary ~]# reboot
[root@primary ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
[root@primary ~]# yum install drbd84-utils kmod-drbd84 -y
[root@primary ~]# modprobe drbd               #加載模塊
[root@primary ~]# lsmod | grep drbd
drbd                  397041  0 
libcrc32c              12644  2 xfs,drbd

[root@secondary ~]# yum install kernel-devel kernel kernel-headers -y
[root@secondary ~]# reboot
[root@secondary ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
[root@secondary ~]# yum install drbd84-utils kmod-drbd84 -y
[root@secondary ~]# modprobe drbd
[root@secondary ~]# lsmod | grep drbd
drbd                  397041  0 
libcrc32c              12644  2 xfs,drbd
1.2 配置文件(分別在兩台機器上配置)
[root@primary ~]# cat /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf";
include "drbd.d/*.res";
[root@primary ~]# cp /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak
[root@primary ~]# vim /etc/drbd.d/global_common.conf
global {
  usage-count no;#不讓linbit公司收集目前drbd的使用情況
  # minor-count dialog-refresh disable-ip-verification
}

common {
  protocol C; #A/B/C復制模式,默認C,數據可靠性高

  handlers {#信息處理的一些策略
    # These are EXAMPLE handlers only.
    # They may have severe implications,
    # like hard resetting the node under certain circumstances.
    # Be careful when chosing your poison.

    # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
    # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
    # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
    # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
    # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
    # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
    # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
    # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
  }

  startup {
        wfc-timeout          240;
        degr-wfc-timeout     240;
        outdated-wfc-timeout 240;
  }

  disk {
        on-io-error detach; ###同步IO錯誤的做法:分離該磁盤
  }

  net {
        cram-hmac-alg md5; ##設置加密算法md5
        shared-secret "testdrbd"; ##加密密碼
  }

  syncer {
        rate 30M; ##傳輸速率
  }
}
[root@primary ~]# vim /etc/drbd.d/r0.res
resource r0 {
on primary {
  device     /dev/drbd0;           //這是Primary機器上的DRBD虛擬塊設備,事先不要格式化
  disk       /dev/sdb1;
  address    192.168.1.1:7898;
  meta-disk  internal;
 }
on secondary {
  device     /dev/drbd0;          //這是Secondary機器上的DRBD虛擬塊設備,事先不要格式化
  disk       /dev/sdb1;
  address    192.168.1.2:7898;     //DRBD監聽的地址和端口。端口可以自己定義
  meta-disk  internal;
 }
}
1.3 在兩台機器上添加DRBD磁盤

在Primary機器上添加一塊20G的硬盤作為DRBD,分區為/dev/sdb1,不做格式化,並在本地系統創建/data目錄,不做掛載操作

[root@primary ~]# fdisk /dev/sdb
依次輸入"n->p->1->回車->回車->w"

在Secondary機器上添加一塊20G的硬盤作為DRBD,分區為/dev/sdb1,不做格式化,並在本地系統創建/data目錄,不做掛載操作

[root@secondary ~]# fdisk /dev/sdb
依次輸入"n->p->1->回車->回車->w"

1.4 在兩台機器上分別創建DRBD設備並激活r0資源(下面操作在兩台機器上都要執行)
[root@primary ~]# mknod /dev/drbd0 b 147 0
[root@primary ~]# drbdadm create-md r0
initializing activity log
initializing bitmap (640 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
success
[root@primary ~]# drbdadm create-md r0
You want me to create a v08 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/sdb1 at byte offset 21473783808

Do you really want to overwrite the existing meta-data?
[need to type 'yes' to confirm] yes                       //此處輸入yes

initializing activity log
initializing bitmap (640 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.

[root@secondary ~]# mknod /dev/drbd0 b 147 0
[root@secondary ~]# drbdadm create-md r0
initializing activity log
initializing bitmap (640 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
success
[root@secondary ~]# drbdadm create-md r0
You want me to create a v08 style flexible-size internal meta data block.
There appears to be a v08 flexible-size internal meta data block
already in place on /dev/sdb1 at byte offset 21473783808

Do you really want to overwrite the existing meta-data?
[need to type 'yes' to confirm] yes                       //此處輸入yes

initializing activity log
initializing bitmap (640 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.

1.5 啟動drbd服務(注意:需要主從共同啟動方能生效)
[root@primary ~]# systemctl start drbd
[root@primary ~]# systemctl enable drbd

[root@secondary ~]# systemctl start drbd
[root@secondary ~]# systemctl enable drbd

1.6 查看狀態(兩台機器上都執行查看)
[root@primary ~]# cat /proc/drbd 
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
 0: 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:20969820

[root@secondary ~]# cat /proc/drbd 
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
 0: 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:20969820

1.7 將Primary主機配置為DRBD的主節點
[root@primary ~]# drbdsetup /dev/drbd0 primary --force

1.8 掛載DRBD
[root@primary ~]# mkfs.ext4 /dev/drbd0
[root@primary ~]# mkdir /data
[root@primary ~]# mount /dev/drbd0 /data

1.9 測試主節點宕機手動切換節點
[root@primary ~]# cd /data/
[root@primary data]# touch haha
[root@primary data]# cd ..
[root@primary /]# umount /data/
[root@primary /]# drbdsetup /dev/drbd0 secondary

下面是在Secondary 備份節點上操作記錄,先進行提權操作,即將Secondary手動升級為DRBD的主節點
[root@secondary ~]# drbdsetup /dev/drbd0 primary
[root@secondary ~]# mkdir /data
[root@secondary ~]# mount /dev/drbd0 /data
[root@secondary ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   48G  1.7G   47G   4% /
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    488M     0  488M   0% /dev/shm
tmpfs                    488M  6.7M  481M   2% /run
tmpfs                    488M     0  488M   0% /sys/fs/cgroup
/dev/sda1                197M  132M   65M  67% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/drbd0                20G   45M   19G   1% /data
[root@secondary ~]# cd /data/
[root@secondary data]# ls
haha

在Secondary節點上繼續寫入數據,然后模擬Secondary節點故障,Primary節點再提權升級為DRBD主節點
[root@secondary data]# touch heihei
[root@secondary data]# ls
haha  heihei
[root@secondary data]# cd ..
[root@secondary /]# umount /data/
[root@secondary /]# drbdsetup /dev/drbd0 secondary

主節點操作
[root@primary /]# drbdsetup /dev/drbd0 primary
[root@primary /]# mount /dev/drbd0 /data
[root@primary /]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   48G  1.7G   47G   4% /
devtmpfs                 476M     0  476M   0% /dev
tmpfs                    488M     0  488M   0% /dev/shm
tmpfs                    488M  6.7M  481M   2% /run
tmpfs                    488M     0  488M   0% /sys/fs/cgroup
/dev/sda1                197M  132M   66M  67% /boot
tmpfs                     98M     0   98M   0% /run/user/0
/dev/drbd0                20G   45M   19G   1% /data
[root@primary /]# cd data/
[root@primary data]# ls
haha  heihei

到此,DRBD的主從環境的部署工作已經完成。不過上面是記錄的是主備手動切換,至於保證DRBD主從結構的智能切換,實現高可用,還需里用到Keepalived。
2 安裝nfs及配置
[root@primary ~]# yum install rpcbind nfs-utils -y
[root@primary ~]# vim /etc/exports
/data 192.168.1.0/24(rw,sync,no_root_squash)
[root@primary ~]# systemctl start rpcbind
[root@primary ~]# systemctl start nfs
[root@primary ~]# systemctl enable rpcbind
[root@primary ~]# systemctl enable nfs

[root@secondary ~]# yum install rpcbind nfs-utils -y
[root@secondary ~]# vim /etc/exports
/data 192.168.1.0/24(rw,sync,no_root_squash)
[root@secondary ~]# systemctl start rpcbind
[root@secondary ~]# systemctl start nfs
[root@secondary ~]# systemctl enable rpcbind
[root@secondary ~]# systemctl enable nfs

3 安裝keepalived及配置
3.1 安裝keepalived
[root@primary ~]# yum install keepalived -y

[root@secondary ~]# yum install keepalived -y

3.2 配置文件
primary

[root@primary ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }

  notification_email_from keepalived@localhost
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id DRBD_HA_MASTER
}

vrrp_script chk_nfs {
        script "/etc/keepalived/check_nfs.sh"
        interval 5
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth1
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        track_script {
            chk_nfs
        }
    notify_stop /etc/keepalived/notify_stop.sh        
    notify_master /etc/keepalived/notify_master.sh    
    virtual_ipaddress {
        192.168.1.20
    }
}

secondary

[root@secondary ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
  notification_email {
    root@localhost
    }

  notification_email_from keepalived@localhost
  smtp_server 127.0.0.1
  smtp_connect_timeout 30
  router_id DRBD_HA_BACKUP
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    notify_master /etc/keepalived/notify_master.sh
    notify_backup /etc/keepalived/notify_backup.sh

    virtual_ipaddress {
        192.168.1.20
    }
}

3.3 檢測監本

此腳本只在Primary機器上配置

[root@primary ~]# vim /etc/keepalived/check_nfs.sh
#!/bin/bash

# 檢查nfs可用性:進程和是否能夠掛載
systemctl status nfs &>/dev/null
if [ $? -ne 0 ];then
    # 如果服務狀態不正常,先嘗試重啟服務
    systemctl restart nfs
    systemctl status nfs &>/dev/null
    if [ $? -ne 0 ];then
        # 若重啟nfs服務后,仍不正常
        # 卸載drbd設備
        umount /dev/drbd0
        # 將drbd主降級為備
        drbdadm secondary r0
        # 關閉keepalived
        systemctl stop keepalived
    fi
fi

[root@primary ~]# chmod 0755 /etc/keepalived/check_nfs.sh

此腳本只在Primary機器上配置

[root@primary ~]# mkdir /etc/keepalived/logs
[root@primary ~]# vim /etc/keepalived/notify_stop.sh
#!/bin/bash

time=`date "+%F  %H:%M:%S"`
echo -e "$time  ------notify_stop------\n" >> /etc/keepalived/logs/notify_stop.log
systemctl stop nfs &>> /etc/keepalived/logs/notify_stop.log
/bin/umount /data &>> /etc/keepalived/logs/notify_stop.log
/sbin/drbdadm secondary r0 &>> /etc/keepalived/logs/notify_stop.log
echo -e "\n" >> /etc/keepalived/logs/notify_stop.log

[root@primary ~]# chmod 0755 /etc/keepalived/notify_stop.sh

此腳本在兩台機器上都要配置

[root@primary ~]# vim /etc/keepalived/notify_master.sh
[root@secondary ~]# vim /etc/keepalived/notify_master.sh
#!/bin/bash

time=`date "+%F  %H:%M:%S"`
echo -e "$time    ------notify_master------\n" >> /etc/keepalived/logs/notify_master.log
/sbin/drbdadm primary r0 &>> /etc/keepalived/logs/notify_master.log
/bin/mount /dev/drbd0 /data &>> /etc/keepalived/logs/notify_master.log
systemctl restart nfs &>> /etc/keepalived/logs/notify_master.log
echo -e "\n" >> /etc/keepalived/logs/notify_master.log

[root@primary ~]# chmod 0755 /etc/keepalived/notify_master.sh
[root@secondary ~]# chmod 0755 /etc/keepalived/notify_master.sh

此腳本只在Secondary機器上配置

[root@secondary ~]# mkdir /etc/keepalived/logs
[root@secondary ~]# vim /etc/keepalived/notify_backup.sh
#!/bin/bash

time=`date "+%F  %H:%M:%S"`
echo -e "$time    ------notify_backup------\n" >> /etc/keepalived/logs/notify_backup.log
systemctl stop nfs &>> /etc/keepalived/logs/notify_backup.log
/bin/umount /dev/drbd0 &>> /etc/keepalived/logs/notify_backup.log
/sbin/drbdadm secondary r0 &>> /etc/keepalived/logs/notify_backup.log
echo -e "\n" >> /etc/keepalived/logs/notify_backup.log

[root@secondary ~]# chmod 0755 /etc/keepalived/notify_backup.sh

3.4 啟動keepalived
[root@primary ~]# systemctl start keepalived
[root@primary ~]# systemctl enable keepalived

[root@secondary ~]# systemctl start keepalived
[root@secondary ~]# systemctl enable keepalived

3.5 在遠程客戶機上掛載NFS
[root@emm ~]# yum install rpcbind nfs-utils -y
[root@emm ~]# systemctl start rpcbind
[root@emm ~]# mount -t nfs 192.168.1.20:/data /data
[root@emm ~]# vim /etc/fstab
192.168.1.20:/data    /data    nfs    defaults    0 0

安裝過程使用的部分命令

ansible backup -m shell -a "hostnamectl set-host backup"
ansible backup -m shell -a "hostnamectl set-hostname backup"
vim /etc/hosts
ansible all -m copy -a "src=/etc/hosts dest=/etc/hosts"
ansible all -m shell -a "hostname -i"
vim  ifcfg-eth1.j2 
vim setip.yml
ansible-playbook setip.yml 
vim setip.yml 
ansible-playbook setip.yml 
ip l s mtu 1450 dev eth1
ip a a  192.168.1.100/16 brd 192.168.255.255 dev eth1
ifup eth1
ip l set up dev eth1
ansible all -m service -a "name=firewalld state=stopped enabled=false"
ansible all -m yum -a "name=kernel-devel,kernel,kernel-headers"
ansible all -m shell -a "sed -i s/=enforcing/=disabled/g /etc/selinux/config"
ansible all -m shell -a "reboot"
ssh root@192.168.1.1 "dhclient eth0"
ansible -m ping
ansible all -m ping
ansible all -m shell -a "rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm"
echo "安裝drdb模塊"
ansible all -m yum -a "name=drbd84-utils,kmod-drbd84"
echo "加載drdb模塊"
ansible all -m shell -a "modprobe drbd"
vim hosts
ansible all -m ping
ansible all -m shell -a "dhclient eth0"
ansible all -m shell -a "reboot"
ansible all -m shell -a "dhclient eth0"
ansible all -m shell -a "modprobe drbd"
ansible all -m service -a "name=drbd stated=started"
ansible all -m service -a "name=drbd state=started"
ansible all -m shell -a "cat /proc/drbd "
ansible all -m yum -a "name=rpcbind,nfs-utils"
ansible all -m service -a "name=rpcbind state=started enabled=true"
ansible all -m service -a "name=nfs state=started enabled=true"
ansible all -m yum -a "name=keepalived state=installed"
ansible all -m service -a "name=keepalived state=started enabled=true"
yum install rpcbind nfs-utils -y
systemctl start rpcbind
mount -t nfs 192.168.1.20:/data /data
mkdir /data
mount -t nfs 192.168.1.20:/data /data
ansible all -m shell -a "echo '/data 192.168.1.0/16(rw,sync,no_root_squash)' >>/etc/exports"
ansible all -m service -a "name=nfs state=restarted"
mount -t nfs 192.168.1.20:/data /data
[root@manage mansible]# ls
ansible.cfg  hosts  ifcfg-eth1.j2  setip.yml  testnfsalive.sh
[root@manage mansible]# cat *
ansible.cfg    
[defaults]
inventory=hosts
host_key_checking=False

hosts
    
[master]
192.168.1.1
[backup]
192.168.1.2

[nfs:children]
master
backup

[nfs:vars]
ansible_ssh_user=root
ansible_ssh_pass=Abcabc123
    
ifcfg-eth1.j2
    
DEVICE=eth1
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
IPADDR={{ipinfo['stdout']}}
NETMASK=255.255.0.0
IPV6INIT=no
MTU=1450


setip.yml 

---
- hosts: all
  remote_user: root
  tasks:
  - name: register ip
    shell: hostname -i
    register: ipinfo
  - name: cpIpconf
    template: src=ifcfg-eth1.j2 dest=/etc/sysconfig/network-scripts/ifcfg-eth1
#    notify:
#    #    - up eth1
#    #
#    #  handlers:
#    #  - name: up eth1
#    #    shell: /usr/sbin/ifup eth1 
#    #
  - name: up eth1
    shell: ifup eth1


testnfsalive.sh
#!/bin/bash

while  [ 1 -eq 1 ]
do
echo `date`
echo `date` >>/data/date
sleep 1
done


    

關於腦裂(split-brain)處理

實際上是指在某種情況下,造成drbd的兩個節點斷開了連接,都以primary的身份來運行。當drbd某primary節點連接對方節點准備發送信息的時候如果發現對方也是primary狀態,那么會會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息:“Split-Brain detected,dropping connection!”

當發生split brain之后,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。 drbdmon 查看狀態 drbdadmin status

處理

查看日志發現腦裂

tail -n 12 /var/log/messages

Sep 21 11:19:53 lab4 kernel: block drbd0: Split-Brain detected but unresolved, dropping connection! 
Sep 21 11:19:53 lab4 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0 
Sep 21 11:19:53 lab4 kernel: block drbd0: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0) 
Sep 21 11:19:53 lab4 kernel: block drbd0: conn( WFReportParams -> Disconnecting ) 
Sep 21 11:19:53 lab4 kernel: block drbd0: error receiving ReportState, l: 4! 
Sep 21 11:19:53 lab4 kernel: block drbd0: meta connection shut down by peer. 
Sep 21 11:19:53 lab4 kernel: block drbd0: asender terminated 
Sep 21 11:19:53 lab4 kernel: block drbd0: Terminating drbd0_asender 
Sep 21 11:19:53 lab4 kernel: block drbd0: Connection closed 
Sep 21 11:19:53 lab4 kernel: block drbd0: conn( Disconnecting -> StandAlone ) 
Sep 21 11:19:53 lab4 kernel: block drbd0: receiver terminated 
Sep 21 11:19:53 lab4 kernel: block drbd0: Terminating drbd0_receiver

保留主節點數據,丟棄從節點數據.

主節點執行:

​ #設置主節點

drbdadm primary r0

mount /dev/drbd0 /data

ls -lh /data 查看文件情況

從節點執行:

​ #設置自己為從節點

drbdadm secondary r0

drbdadm -- --discard-my-data connect r0 #丟棄自己數據

drbdadm connect r0 手動連接主資源節點

經過測試 故障切換大概10s左右不可用時間.

該內容來自大神博客:https://www.mrlapulga.com/?p=365

參考

https://blog.csdn.net/sfdst/article/details/77879684

https://blog.csdn.net/tjiyu/article/details/52723125


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM