DRBD+HEARTBEAT+NFS實現高可用性羣集

一,DBRB概述

      Distributed Replicated Block Device(DRBD)是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。

DRBD Logo

DRBD Logo

      數據鏡像:實時、透明、同步(所有服務器都成功後返回)、異步(本地服務器成功後返回)

DRBD的核心功能通過Linux的內核實現,最接近系統的IO棧,但它不能神奇地添加上層的功能比如檢測到EXT3文件系統的崩潰。

DRBD的位置處於文件系統以下,比文件系統更加靠近操作系統內核及IO棧。

工具:

drbdadm:高級管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta發送指令,

drbdsetup:配置裝載進kernel的DRBD模塊,平時很少直接用

drbdmeta:管理META數據結構,平時很少直接用。

在DRBD中,資源是特指某複製的存儲設備的所有方面。包括資源名稱、DRBD設備(/dev/drbdm,這裏m是設備最小號,最大號可到147)、磁盤配置(使本地數據可以爲DRBD所用)、網絡配置(與對方通信)

每個資源有個角色,是Primary或Secondary,下面簡稱“主”和“備”

主角色的DRBD設備可以不受限制的讀和寫,比如創建和映射文件系統、對於塊設備的raw或直接IO訪問。

備角色的DRBD設備接受來自對方的所有修改,但是不能被應用程序讀寫,甚至只讀也不行。

角色可以改變。

DRBD功能

單主模式:典型的高可靠性集羣方案。

復主模式:需要採用共享cluster文件系統,如GFS和OCFS2。用於需要從2個節點併發訪問數據的場合,需要特別配置。

複製模式:3種模式:

協議A:異步複製協議。本地寫成功後立即返回,數據放在發送buffer中,可能丟失。

協議B:內存同步(半同步)複製協議。本地寫成功並將數據發送到對方後立即返回,如果雙機掉電,數據可能丟失。

協議C:同步複製協議。本地和對方寫成功確認後返回。如果雙機掉電或磁盤同時損壞,則數據可能丟失。

一般用協議C。選擇協議將影響流量,從而影響網絡時延。

有效的同步:按線性而不是當初寫的順序同步塊。同步損壞時間內的不一致數據。

在線的設備檢驗:一端順序計算底層存儲,得到一個數字,傳給另一端,另一端也計算,如果不一致,則稍後進行同步。建議一週或一月一次。

複製過程的一致性檢驗:加密後,對方若不一致則要求重傳。防止網卡、緩衝等問題導致位丟失、覆蓋等錯誤。

Split brain:當網絡出現暫時性故障,導致兩端都自己提升爲Primary。兩端再次連通時,可以選擇email通知,建議手工處理這種情況。

當數據寫在緩衝區裏,沒有真正寫到磁盤上時,系統崩潰會導致數據丟失。而disk flush是指將數據真正寫到磁盤上後才返回。

有些帶電池的硬盤控制器,如帶電池的帶點出Dell PERC Raid卡,不但自帶緩存而且自帶電池,會在系統意外斷電或者崩潰後將最後的數據寫入磁盤,對這類控制器,可以使用disk flush,從而在保證性能的前提下提高了數據的安全性。

磁盤錯誤處理策略:

傳遞給上層:可能造成文件系統remounting成只讀,不推薦。

對上層屏蔽:用另一端的相應塊進行讀寫,應用不中斷。可以在任何方便的時候再切換。

不一致的(inconsistent)數據:不能以任何方式訪問和使用的數據。如正在同步時的目標節點數據,這些數據不能識別,不能mount,甚至不能通過磁盤的自動檢測。

過期的(outdated)數據:在備機上的數據,與主機一致,但不需要同步。如主備機網絡中斷後,備機上的數據就是過期的。

DRBD有接口允許應用程序在網絡中斷時將備機數據標識爲過期的。DRBD拒絕將這個節點提升爲主角色。這些管理接口在Heartbeat框架上得到完整實現。

一旦過期資源的複製鏈接恢復,他的過期標誌自動清除,接着進行後臺同步。

工作原理
在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣.因爲數據同時存在於本地主機和遠程主機上,

切換時,遠程主機只要使用它上面的那份備份數據,就可以繼續進行服務了.

DRBD的工作原理如下圖:

+--------+ | 文件系統 | +--------+

|

V

+--------+| 塊設備層 | | (/dev/drbd1) +--------+

| |

V V

| 本地硬盤 | | (/dev/hdb1) | | 遠程主機硬盤 | | (/dev/hdb1) |

二,heartbeat概述

Heartbeat

     Heartbeat 項目是 Linux-HA 工程的一個組成部分,它實現了一個高可用集羣系統。心跳服務和集羣通信是高可用集羣的兩個關鍵組件,在 Heartbeat 項目裏,由 heartbeat 模塊實現了這兩個功能。下面描述了 heartbeat 模塊的可靠消息通信機制,並對其實現原理做了一些介紹。

      heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括兩個部分,心跳監測部分和資源接管部分,心跳監測可以通過網絡鏈路和串口進行,而且支持冗 餘鏈路,它們之間相互發送報文來告訴對方自己當前的狀態,如果在指定的時間內未受到對方發送的報文,那麼就認爲對方失效,這時需啓動資源接管模塊來接管運 行在對方主機上的資源或者服務。

      高可用集羣是指一組通過硬件和軟件連接起來的獨立計算機,它們在用戶面前表現爲一個單一系統,在這樣的一組計算機系統內部的一個或者多個節點停止工作,服務會從故障節點切換到正常工作的節點上運行,不會引起服務中斷。從這個定義可以看出,集羣必須檢測節點和服務何時失效,何時恢復爲可用。這個任務通常由一組被稱爲“心跳”的代碼完成。在Linux-HA裏這個功能由一個叫做heartbeat的程序完成。

三,NFS概述

NFS簡介
NFS是Network File System的簡寫,即網絡文件系統.

網絡文件系統是FreeBSD支持的文件系統中的一種,也被稱爲NFS. NFS允許一個系統在網絡上與他人共享目錄和文件。通過使用NFS,用戶和程序可以像訪問本地文件一樣訪問遠端系統上的文件。

     以下是NFS最顯而易見的好處:

1.本地工作站使用更少的磁盤空間,因爲通常的數據可以存放在一臺機器上而且可以通過網絡訪問到。

2.用戶不必在每個網絡上機器裏頭都有一個home目錄。Home目錄 可以被放在NFS服務器上並且在網絡上處處可用。

3.諸如軟驅,CDROM,和 Zip(是指一種高儲存密度的磁盤驅動器與磁盤)之類的存儲設備可以在網絡上面被別的機器使用。這可以減少整個網絡上的可移動介質設備的數量。

NFS組成
NFS至少有兩個主要部分:一臺服務器和一臺(或者更多)客戶機。客戶機遠程訪問存放在服務器上的數據。爲了正常工作,一些進程需要被配置並運行。
實際應用
NFS 有很多實際應用。下面是比較常見的一些:

1.多個機器共享一臺CDROM或者其他設備。這對於在多臺機器中安裝軟件來說更加便宜跟方便。

2.在大型網絡中,配置一臺中心 NFS 服務器用來放置所有用戶的home目錄可能會帶來便利。這些目錄能被輸出到網絡以便用戶不管在哪臺工作站上登錄,總能得到相同的home目錄。

3.幾臺機器可以有通用的/usr/ports/distfiles 目錄。這樣的話,當您需要在幾臺機器上安裝port時,您可以無需在每臺設備上下載而快速訪問源碼。

四,案例拓撲

     2012-10-19_104438

[root@node1 ~]# vim /etc/hosts兩邊同做

[root@node1 ~]#hwclock -s //同步始終

[root@node1 ~]# hostname node1.a.com

2012-10-17_230952
[root@node1 ~]# fdisk /dev/sda
Command (m for help): p
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Selected partition 4
First cylinder (1354-2610, default 1354):
First cylinder (1354-2610, default 1354):
Using default value 1354
Last cylinder or +size or +sizeM or +sizeK (1354-2610, default 2610):
2012-10-17_225257
Command (m for help): n
First cylinder (1354-2610, default 1354):
Using default value 1354
Last cylinder or +size or +sizeM or +sizeK (1354-2610, default 2610): +1g
Command (m for help): p
Command (m for help): w
[root@node1 ~]# partprobe /dev/sda
[root@node1 ~]# cat /proc/partitions
2012-10-17_225942
[root@node1 ~]# rpm -ivh drbd83-8.3.8-1.el5.centos.i386.rpm
[root@node1 ~]# rpm -ivh kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
[root@node1 ~]# vim /etc/drbd.conf
:r /usr/share/doc/drbd83-8.3.8/drbd.conf
保存(一地要做)
2012-10-17_232913
[root@node1 ~]# cd /etc/drbd.d/
[root@node1 drbd.d]# cp global_common.conf global_common.conf .bak
[root@node1 drbd.d]# vim global_common.conf
2012-10-17_234734 此處yes一定改爲NO

2012-10-17_234742

全部刪除後重做
[root@node1 drbd.d]# vim web.res
2012-10-17_235835
拷貝到另一臺
[root@node1 drbd.d]# scp * node2.a.com:/etc/drbd.d/
[root@node1 drbd.d]# scp /etc/drbd.conf node2.a.com:/etc/
[root@node1 drbd.d]# drbdadm create-md web

第二臺同樣

[root@node1 drbd.d]# modprobe drbd
[root@node1 drbd.d]# service drbd start
必須同時啓動
[root@node1 drbd.d]# cat /proc/drbd
2012-10-18_105239
[root@node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary web指定node1爲資源主節點
[root@node1 drbd.d]# cat /proc/drbd

2012-10-18_113706
[root@node1 drbd.d]# mkfs -t ext3 -L drbdweb /dev/drbd0
[root@node1 drbd.d]# mkdir /mnt/1 && mount /dev/drbd0 /mnt/1
[root@node1 drbd.d]# df -h
2012-10-18_113553
[root@node1 drbd.d]# service drbd status

NFS

[root@node1 drbd.d]# vim /etc/exports
image
[root@node1 drbd.d]# service portmap start && chkconfig portmap on
[root@node1 drbd.d]# service nfs start && chkconfig nfs on
[root@node1 drbd.d]# vim /etc/init.d/nfs
2012-10-18_115111
兩臺服務器NFS配置須一致
安裝所需的文件(node1和node2上都需執行的)
#ll
total 3088
drwxr-xr-x 2 root root    4096 Aug 30 21:14 Desktop
-rw------- 1 root root    1175 Aug 30 04:50 anaconda-ks.cfg
-rw-r--r-- 1 root root  221868 Oct 17 21:50 drbd83-8.3.8-1.el5.centos.i386.rpm
-rw-r--r-- 1 root root 1637238 Oct 12 14:09 heartbeat-2.1.4-9.el5.i386.rpm
-rw-r--r-- 1 root root  293349 Oct 12 14:09 heartbeat-devel-2.1.4-9.el5.i386.rpm
-rw-r--r-- 1 root root  230890 Oct 12 14:09 heartbeat-gui-2.1.4-9.el5.i386.rpm
-rw-r--r-- 1 root root  111742 Oct 12 14:09 heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
-rw-r--r-- 1 root root   92070 Oct 12 14:09 heartbeat-pils-2.1.4-10.el5.i386.rpm
-rw-r--r-- 1 root root  179199 Oct 12 14:09 heartbeat-stonith-2.1.4-10.el5.i386.rpm
-rw-r--r-- 1 root root   35236 Aug 30 04:50 install.log
-rw-r--r-- 1 root root    3995 Aug 30 04:49 install.log.syslog
-rw-r--r-- 1 root root  125974 Oct 17 21:50 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
-rw-r--r-- 1 root root   56817 Oct 12 14:09 libnet-1.1.4-3.el5.i386.rpm
-rw-r--r-- 1 root root   92071 Oct 12 14:09 perl-MailTools-1.77-1.el5.noarch.rpm
安裝heartbeat
[root@node1 ~]#  yum localinstall *.rpm --nogpgcheck -y
[root@node1 drbd.d]# cd /usr/share/doc/heartbeat-2.1.4/
[root@node1 heartbeat-2.1.4]# cp authkeys ha.cf haresources /etc/ha.d/
[root@node1 heartbeat-2.1.4]# cd /etc/ha.d/
[root@node1 ha.d]# vim ha.cf
24 debugfile /var/log/ha-debug
29 logfile /var/log/ha-log
34 logfacility local0
48 keepalive 2
56 deadtime 10
76 udpport 694
121 bcast eth0 //此行可以添加在任意一行
157 auto_failback off
211 node director1.a.com
212 node director2.a.com

[root@node1 ha.d]# echo "director1.a.com IPaddr::192.168.1.1/24/eth0 drbddisk::web Filesystem::/dev/drbd0::/web::ext3 killnfsd">>/etc/ha.d/haresources
[root@node1 ha.d]# vim authkeys
23 auth 1
24 1 crc
[root@node1 ha.d]# cd /etc/ha.d/resource.d/
[root@node1 resource.d]#  echo "killall -9 nfsd ; /etc/init.d/nfs restart ; exit 0" >>/etc/ha.d/resource.d/killnfsd
[root@node1 resource.d]# chmod 600 /etc/ha.d/authkeys
[root@node1 resource.d]# chmod 755 /etc/ha.d/resource.d/killnfsd
[root@node2 resource.d]# service heartbeat start
node2同樣
測試

再來一臺
root@station ~]# mkdir /mnt/nfs
[root@station ~]# mount 192.168.145.88:/web /mnt/nfs
[root@station ~]# vim /mnt/test.sh
2012-10-18_151123
[root@station ~]# cd /mnt/nfs/
[root@station nfs]# bash /mnt/test.sh 
2012-10-18_151326
斷掉
[root@node1 ha.d]# service heartbeat status
heartbeat OK [pid 2557 et al] is running on node1.a.com [node1.a.com]...
[root@node1 ha.d]# service heartbeat stop
測試客戶機圖

斷一下後又開始

2012-10-18_170404

 

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