drbd+keepalived nfs高可用方案實踐

實驗環境

系統CentOS 6.5 X64
Ip:172.16.25.162  172.16.25.163
epel源
每臺主機有/dev/sdb1: 1073 MB掛載點/test供drbd使用
先升級nfs先關組件:
    yum updatenfs-utilsnfs-utils-lib nfs4-acl-tools
    yum updaterpcbind

1、安裝配置

安裝配置drbd:api

[root@master~]#wget http://oss.linbit.com/drbd/8.3/drbd-8.3.16.tar.gz
[root@master~]#tar zxvf drbd-8.3.16.tar.gz
[root@master~]#./configure --prefix=/usr/local/drbd--with-km     #--with-km是啓用內核模塊
[root@master~]#make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64   #KDIR隨系統而變
[root@master~]#make install
[root@master~]#mkdir -p /usr/local/drbd/var/run/drbd
[root@master~]#cp /usr/local/drbd/etc/rc.d/init.d/drbd  /etc/rc.d/init.d/
[root@master~]#chkconfig --add drbd; chkconfigdrbd on
[root@master~]#cp drbd/drbd.ko/lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
[root@master~]#modprobe drbd
[root@master~]#lsmod |grepdrbd      #驗證drbd模塊是否加載成功
  1. 準備底層存儲設備:網絡

    一塊硬盤、軟raid、LVM邏輯卷、甚至另外一個drbd設備(drbd疊加)併發

  2. 準備網絡配置:框架

    推薦(不是必須)在專用的、直連的、千兆的網絡上運行drbd。若是經過交換機運行drbd,建議設置一個熱備的交換機同時the Linux bonding driver (in active-backup mode) is recommendedide

    注意三點:測試

    1) Our two DRBD hosts each have a currently unused network interface, eth1,with IP addresses 10.1.1.31 and 10.1.1.32 assigned to it, respectively.
    2) No other services are using TCP ports 7788 through 7799 on eitherhost.
    3) The local firewall configuration allows both inbound and outboundTCP connections between the ui

  3. 配置drbd3d

    drbd全部配置均在/etc/drbd.conf,默認的,該配置文件只是一個‘框架’,有以下兩行
    include"/etc/drbd.d/global_common.conf";
    include"/etc/drbd.d/*.res";日誌

    /etc/drbd.d/global_common.conf包含drbdglobal和common段的設置,*.res文件每一個包含一個resource段的配置。code

    注意:確保每一個節點上drbd的配置文件保持一致

    實驗環境配置文件

    global {
        usage-count yes;
    }
    common {
        protocol C;       # A 數據一旦寫入磁盤併發送到網絡中就認爲完成了寫入操做                
                          # B 收到接收確認就認爲完成了寫入操做
                          # C 收到寫入確認就認爲完成了寫入操做
    }
    resource r0 {
        on master {       #master爲主機名,配置文件裏必須和uname–n輸出的一致,不一致會致使no resources defined!
        device   /dev/drbd1;
        disk     /dev/sdb1;address  172.16.25.162:7789;
        meta-disk internal;}on slave {device   /dev/drbd1;
        disk     /dev/sdb1;
        address  172.16.25.163:7789;
        meta-disk internal;
        }
    }
  4. 初始化resource

    建立設備元數據,該步驟只在設備初始化時執行一次,在兩臺server分別執行
    [root@master~]#drbdadm create-md r0(resource名稱)

    一臺報錯:drbdadm create-md r0: exited with code 40
    解決方法dd if=/dev/zero of=/dev/sdb1 bs=1M count=10(count數量不限,主要是爲了清除/dev/sdb1上的分區信息)。成功截圖以下
    image

  5. 啓動drbd

    [root@master~]#/etc/init.d/drbd start

    剛啓動時,兩臺機器上drbd狀態均爲secondary

    在drbd主上執行drbdsetup/dev/drbd0 primary -o,將drbd狀態改成primary(無此步,會致使格式化/dev/drbd0時報錯)。執行過此命令之後,能夠經過drbdadmprimary/secondary r0來切換主被動狀態

  6. 掛載drbd設備

    如今能夠把主機上的DRBD設備掛載到一個目錄上進行使用.備機的DRBD設備沒法被掛載,由於它是用來接收主機數據的,由DRBD負責操做.

    在drbd primary節點(不然格式化會報錯Wrong medium type while trying to determine filesystem size)

    [root@master ~]#mkfs.ext4/dev/drbd1

    [root@master~]#mount /dev/drbd1 /test

    2、使用管理

  7. 狀態查看

    ~]# drbd-overview ` 
    或者
    ~]# cat /proc/drbd
    version: 8.3.16 (api:88/proto:86-97)
    
    GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build byroot@master, 2015-03-29 15:25:43
       1: cs:Connectedro:Secondary/Secondary ds:Inconsistent/Inconsistent Cr-----
        ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0ua:0 ap:0 ep:1 wo:f oos:1044124

    cs: connect state ro:表示角色信息 ds: 磁盤狀態信息Inconsistent/UpToDatens/nr:網絡發送/接收的數據包信息dw/dr:設備讀寫信息

    「/proc/drbd」中顯示了drbd當前的狀態。第一行的Secondary/Secondary 表示兩臺主機的狀態,都是」備機」狀態.ds是磁盤狀態,都是」不一致」狀態. 這是因爲DRBD沒法判斷哪一方爲主機,以哪一方的磁盤數據做爲標準數據.因此,咱們須要初始化一個主機。在master server執行

    [root@master ~]#drbdsetup /dev/drbd1 primary –o
    或者
    [root@master ~]#drbdadm primary r0

    再看兩臺的/proc/drbd
    image

    image
    倒數第二行能夠看到正在從主向備同步數據

    日誌變化(/var/logs/message)

    主機:
    image
    備機:
    image

  8. DRBD的主備機切換

    有時,你須要將DRBD的主備機互換一下.能夠執行下面的操做:
    在主機上,先要卸載掉DRBD設備.

    [root@master /]# umount /mnt/drbd1

    將主機降級爲」備機」

    [root@master /]# drbdadm secondary r0
    [root@master /]# cat /proc/drbd
    version: 8.0.4 (api:86/proto:86)
    SVN Revision: 2947 build by root@g105-1, 2007-07-28 07:13:14
    1: cs:Connectedst:Secondary/Secondaryds:UpToDate/UpToDate C r---
    ns:0 nr:5 dw:5 dr:0 al:0 bm:0 lo:0 pe:0ua:0 ap:0
    resync: used:0/31 hits:0 misses:0starving:0 dirty:0 changed:0
    act_log: used:0/127 hits:0 misses:0starving:0 dirty:0 changed:0

    如今,兩臺主機都是」備機」
    在備機slave上,將它升級爲」主機」

    [root@slave /]# drbdadm primary r0
    [root@slave /]# cat /proc/drbd
    version: 8.0.4 (api:86/proto:86)
    SVN Revision: 2947 build by root@g105-2, 2007-07-28 07:13:14
    1: cs:Connectedst:Primary/Secondaryds:UpToDate/UpToDate C r---
    ns:0 nr:5 dw:5 dr:0 al:0 bm:0 lo:0 pe:0ua:0 ap:0
    resync: used:0/31 hits:0 misses:0starving:0 dirty:0 changed:0
    act_log: used:0/127 hits:0 misses:0starving:0 dirty:0 changed:0

    如今,slave成爲了」主機」.你能夠把它的/dev/drbd1進行掛載和使用了.一樣,數據會被同步到master的/dev/drbd0上

###3、配合keepalived實現自動fail-over
Keepalived配置文件(主機):

! Configuration File for keepalived
    global_defs {
        notification_email {
            acassen@firewall.loc
            failover@firewall.loc
            sysadmin@firewall.loc
        }
        notification_email_from Alexandre.Cassen@firewall.loc
        smtp_server 192.168.200.1
        smtp_connect_timeout 30
        router_id LVS_DEVEL
    }
    vrrp_scriptchk_nfs {
        script "/etc/keepalived/check_nfs.sh"
        interval 5
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        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 {
        172.16.200.234/24
    }
}

備機

! Configuration File for keepalived
global_defs {
    notification_email {
        acassen@firewall.loc
        failover@firewall.loc
        sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.200.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    }
vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    priority 90
    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 {
        172.16.200.234/24
    }
}

4、系列驗證明驗

nfs服務端配置:/test *(sync,rw,no_root_squash)
  1. 自動切換測試:

    關閉主上keepalived,會按照預期流程走。關閉主上nfs----卸載資源設備----主drbd降級----備drdb升級----備掛載資源設備----備啓動nfs服務。可是在客戶端看來,切換時間過長,切換後打開文件約有1.5分的延時,如圖
    image

  2. 連續寫測試:

    1. 在nfs客戶段執行for i in {1..500};do dd if=/dev/zero of=/ljk/$i.filebs=1M count=1;done

      (/ljk爲客戶端掛載點,用dd向掛載點內寫入500個1M的文件)。執行過程當中在主關閉keepalived,驗證寫入過程是否會中斷

      經驗證,寫入過程沒有中斷,但中會出現一段時間的延時(一樣比正常慢了1.5分左右)

    2. 客戶端從其餘目錄向掛載點拷貝文件,中途開啓原主的keepalived(vip自動切回主,產生一次切換動做)

      正常拷貝:time cp -av/data0/songjian/dhmh/* /ljk/用時1m57s

      有切換動做拷貝:在下圖所示文件處產生停頓,最終用時3m43
      image
      檢查切換過程產生中斷可能受影響的文件和原文件是否一致,經md5sum驗證,切換過程當中受影響複製產生延遲的文件內容未受影響
      image

      經驗證,拷貝過程不中斷,而且文件狀態亦爲受到切換動做的影響

    3. 連續讀測試

      客戶端掛載點向其餘目錄拷貝文件,以下圖文件出產生延時
      image
      Md5sum驗證文件一致性ok,以下圖
      image

    疑問:關於切換動做致使的延遲時間問題,是哪裏致使了切換過程當中出現延時;是否文件量越大延遲時間越長;在nfs客戶端測試

    在不一樣數量、大小的文件中打開統一文件測試延時

    FilesystemSizeUsedAvailUse% Mounted on
    172.16.25.234:/test  1004M197M 757M  21% /ljk
    197M小文件,切換後隨即打開文件延時1m47s
    172.16.25.234:/test  1004M 461M  492M  49% /ljk
    461M小文件,切換後隨即打開文件延時2m16s
    172.16.25.234:/test  1004M 641M  313M  68% /ljk
    641M小文件,切換後隨即打開文件延時2m45s
    192.168.0.234:/test           3.0G 2.5G  393M  87% /ljk
    2.5G中大文件,切換後隨即打開文件延時1m45
    一樣在641M小文件的前提:切換動做後,隔一段(3分鐘)再打開文件,無延時
    另外,在nfs server上主備切換後,在新的nfs server打開文件無延時,故可排除drbd層面的緣由。

    關於延時最終結論:nfs服務從主切換到備,從系統日誌

    May 22 00:10:58 slave kernel: NFSD: Using/var/lib/nfs/v4recovery as the NFSv4 state recovery directory
    May 22 00:10:58 slave kernel: NFSD: starting 90-second grace period

    看出至關於一次nfs服務重啓操做,有一個90s的平滑重啓過程,延時時間與文件數量及大小無關。

    也再一次驗證了drbd提供的數據一致×××(包括文件的打開和修改狀態等),在客戶端看來,真個切換過程就是‘一次nfs重啓’(主nfs停,備nfs啓)。

附件:keepalived狀態改變時所觸動的腳本

相關文章
相關標籤/搜索