DRBD使用gfs2,cman實現雙主集羣文件存儲方案

DRBD簡介

   DRBD (Distributed Replicated Block Device) 是 Linux 平臺上的分散式儲存系統。其中包含了核心模組,數個使用者  空間管理程式及 shell scripts,通常用於高可用性(high availability, HA)叢集。DRBD 類似磁盤陣列的RAID 1(鏡像),只不過 RAID 1 是在同一臺電腦內,而 DRBD 是透過網絡。

DRBD 是以 GPL2 授權散佈的自由軟件。 --- 此處摘自 wikipedia

規劃:

   ip                   主機名                 存儲磁盤     drbd設備

   172.16.43.1   slave1.king.com  /dev/sda3   /dev/drbd0

   172.16.43.2   slave2.king.com  /dev/sda3   /dev/drbd0

一. 實現基本DRBD功能

以下操作沒有特殊說明,皆爲雙個節點都要操作

   i) 主機互信(雙節點之間)

# 確保 hostname 與 uname -n 一致
sed -i 's@^\(HOSTNAME=\).*@\slave1.king.com@' /etc/sysconfig/network
hostname slave1.king.com
uname -n
# 確保 /etc/hosts 文件中添加兩節點非DNS解析信息
172.16.43.1  slave1.king.com
172.16.43.2  slave2.king.com
# 雙機互信
ssh-keygen -t rsa -P ''
ssh-copy-id -i .ssh/id_rsa.pub [email protected]

   ii) drbd配置安裝

# 下載drbd rpm包(注意drbd-kmdl版本號前一半與操作系統要相對應)
drbd-8.4.3-33.el6.x86_64.rpm
drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
rpm -ivh *.rpm

       1 配置/etc/drbd.d/global-common.conf

global {
    usage-count no;
    # minor-count dialog-refresh disable-ip-verification
}
common {
    protocol C;
    handlers {
        # 當承載drbd的物理文件損壞時處理
        # echo b > /proc/sysrq-trigger
        # 立即重啓機器,而且不會將緩衝區同步到硬盤,也不會卸載已掛載的硬盤
        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";
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        # 當同步過程中主設備失去聯繫處理
        # echo b > /proc/sysrq-trigger
        # 立即重啓機器,而且不會將緩衝區同步到硬盤,也不會卸載已掛載的硬盤
        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";
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        # 當同步過程中發生io錯誤處理
        # echo o > /proc/sysrq-trigger
        # 關閉系統
        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 120;
        #degr-wfc-timeout 120;
    }
    disk {
        # 當磁盤io異常,將分離當前設備
        on-io-error detach;
        #fencing resource-only;
    }
    net {
        # 消息驗證校驗碼
        cram-hmac-alg "sha1";
        shared-secret "9bb9f0ea87ca30cfbc094c7dad12d1ea";
        # openssl dgst sha1 install.log 對任意文件進行信息摘要取得交換碼
    }
    syncer {
        # drbd設備同步速率
        rate 1000M;
    }
}

       2. 格式化磁盤

fdisk /dev/sda

       3、定義一個資源/etc/drbd.d/web.res,內容如下:

resource web {
    device    /dev/drbd0;
    disk      /dev/sda3;
    meta-disk internal;
    on master1.king.com {
        address   172.16.43.1:7789;
    }
    on master2.king.com {
        address   172.16.43.2:7789;
    }
}

       4. 同步以上操作或文件,並初始化資源及啓動服務

drbdadm create-md web
service drbd start
# 此處只能提升一個節點爲主資源
drbdadm primary --force web
# 查看信息等待同步完成
drbd-overview
#0:web  Connected Primary/Secondary UpToDate/UpToDate C r----

        5. 掛載使用

mke2fs -j -L DRBD /dev/drbd0 # 僅在一個節點執行
mkdir /mnt/drbd
mount /dev/drbd0 /mnt/drbd
# 如果之前提升二個節點都爲主資源時,在這個 /mnt/drbd
# 目錄下同時讀寫可能會有IO異常,導致drbd設備失效
# 爲了解決這個問題則使用 gfs + cman 實現分佈式文件鎖方案

二) gfs集羣文件系統(重點)

       1. 在 /etc/drbd.d/global-common.conf文件common 中添加      

# 在配置文件的 net 選項中
allow-two-primaries yes;

       2. 安裝 cman 底層消息通訊 + 全局鎖功能

ccs_tool create gfscluster
ccs_tool addnode -n 1 -v 1 slave1.king.com
ccs_tool addnode -n 2 -v 1 slave2.king.com
# 查看節點
ccs_tool lsnode
#Cluster name: gfscluster, config_version: 3
.
#Nodename          Votes Nodeid Fencetype
#slave1.king.com     1    1 
#slave2.king.com     1    2

       3. 啓動cman之前禁用 NetworkManager

chkconfig NetworkManager off
service cman restart

       4. 準備新磁盤

fdisk /dev/sda
partx -a /dev/sda

       5. 再次啓動 drbd 服務

# 如果之前做過 ii) 步實驗的話,請確定彈出的信息
drbdadm create-md web
service drbd start
#
# 提升第一節點爲主資源
[slave1: ~] drbdadm primary --force web
#
# 此處可以提升二個節點爲主資源(分別執行)
# 請注意請確保一個主已經同步完成
# 0:web/0  Connected Primary/Secondary UpToDate/UpToDate C r-----
# 再提升一下個爲主節點
[slave2: ~] drbdadm primary --force web

       6. 格式化gfs2並多處掛載    

# 將drbd格式化爲gfs2 (這一步只需要一個節點操作即可)
mkfs.gfs2 -j 2 -p lock_dlm -t gfscluster:gfslocktable /dev/drbd0
#
# 多處掛載使用
mount /dev/drbd0 /gfs

    iv) 測試

wKioL1NWuofilHA1AAUtEucpflg450.jpg

   v) 總結

   基於drbd的單,雙主配置到此爲止,有些童鞋會問雙主模型用在什麼情況下,它的用法恰恰在不需要集羣的場景.例如兩臺httpd服務器做負載均衡,兩臺httpd都需要

訪問一個共享儲存,無論那一臺httpd服務器都可以上傳修改共享存儲的數據,這是單主的drbd所不能實現的.當然這裏的gfs也可以做集羣lvm,在下一篇中我們將繼續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章