天天看點

DRBD項目實施之NFS高可用架構(NFS+Heartbeat+Drbd)

    由于目前線上的兩台NFS伺服器,一台為主,一台為備。主到備的資料同步,靠rsync來做。由于資料偏重于圖檔業務,并且還是千萬級的碎圖檔。在目前的業務架構下,NFS服務是存在單點的,并且資料的同步也不能做完全實時性,進而導緻不能確定一緻性。是以,出于對業務線上率和資料安全的保障,目前需要一套新的架構來解決 NFS 服務單點和資料實時同步的問題。

       然後,就沒有然後了。

       下面是一個醜到爆的新方案架構圖,已經在公司測試環境的部署,并且進行了不完全充分的測試。

架構拓撲:

<a href="http://s3.51cto.com/wyfs02/M00/57/2D/wKioL1STyX6CnrLpAACcVZFTQ74844.jpg" target="_blank"></a>

簡單描述:

       兩台 NFS 伺服器,通過 em1 網卡與内網的其他業務伺服器進行通信,em2網卡主要負責兩台 NFS 伺服器之間心跳通信,em3網卡主要負責drbd資料同步的傳輸。

       前面的2台圖檔伺服器通過 NFS 叢集提供出來的一個VIP 192.168.0.219 來使用 NFS 叢集服務。

一、項目基礎設施及資訊介紹

1、裝置資訊

1

2

3

4

5

6

7

8

<code>現有的兩台 NFS 存儲伺服器的硬體配置資訊:</code>

<code>       </code><code>CPU:  Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz</code>

<code>       </code><code>MEM: 16G</code>

<code>       </code><code>Raid: RAID 1</code>

<code>       </code><code>Disk: SSD 200G x 2</code>

<code>       </code><code>網卡:內建的 4 個千兆網卡 Link is up at 1000 Mbps, full duplex </code>

<code>前端兩台靜态圖檔伺服器硬體配置資訊:</code>

<code>       </code><code>略</code>

2、網絡

9

10

<code>浮動 VIP : 192.168.0.219    </code><code># 漂浮在M1和M2上,負責對外提供服務</code>

<code>現有的兩台 NFS 存儲伺服器的網絡配置資訊:</code>

<code>主機名:M1.redhat.sx</code>

<code>       </code><code>em1:192.168.0.210    内網</code>

<code>       </code><code>em2:172.16.0.210      心跳線</code>

<code>       </code><code>em3:172.16.100.210     DRBD千兆資料傳輸</code>

<code>主機名:M2.redhat.sx</code>

<code>       </code><code>em1:192.168.0.211    内網</code>

<code>       </code><code>em2:172.16.0.211      心跳線</code>

<code>       </code><code>em3:172.16.100.211     DRBD千兆資料傳輸</code>

3、系統環境 

<code>核心版本:2.6.32-504.el6.x86_64</code>

<code>系統版本:CentOS 6.5</code>

<code>系統位數:x86_64</code>

<code>防火牆規則清空</code>

<code>selinux關閉</code>

4、軟體版本

<code>heartbeat-3.0.4-2.el6.x86_64</code>

<code>drbd-8.4.3</code>

<code>rpcbind-0.2.0-11.el6.x86_64</code>

<code>nfs-utils-1.2.3-54.el6.x86_64</code>

二、基礎服務配置

這裡僅以 M1 服務的配置為例,M2 伺服器配置與此相同。

1、配置時間同步

M1端:

<code>[root@M1 ~]</code><code># ntpdate pool.ntp.org </code>

<code>12 Nov 14:45:15 ntpdate[27898]: adjust </code><code>time</code> <code>server 42.96.167.209 offset 0.044720 sec</code>

M2端:

<code>[root@M2 ~]</code><code># ntpdate pool.ntp.org </code>

<code>12 Nov 14:45:06 ntpdate[24447]: adjust </code><code>time</code> <code>server 42.96.167.209 offset 0.063174 sec</code>

2、配置/etc/hosts檔案

<code>[root@M1 ~]</code><code># cat /etc/hosts </code>

<code>127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 </code>

<code>::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 </code>

<code>192.168.0.210 M1.redhat.sx </code>

<code>192.168.0.211 M2.redhat.sx</code>

<code>[root@M2 ~]</code><code># cat /etc/hosts </code>

3、增加主機間路由

首先先驗證 M1 和 M2 的伺服器 IP 是否合乎規劃

<code>[root@M1 ~]</code><code># ifconfig|egrep 'Link encap|inet addr'                    #  驗證現有 IP 資訊</code>

<code>em1 Link encap:Ethernet HWaddr B8:CA:3A:F1:00:2F </code>

<code>inet addr:192.168.0.210 Bcast:192.168.0.255 Mask:255.255.255.0 </code>

<code>em2 Link encap:Ethernet HWaddr B8:CA:3A:F1:00:30 </code>

<code>inet addr:172.16.0.210 Bcast:172.16.0.255 Mask:255.255.255.0 </code>

<code>em3 Link encap:Ethernet HWaddr B8:CA:3A:F1:00:31 </code>

<code>inet addr:172.16.100.210 Bcast:172.16.100.255 Mask:255.255.255.0 </code>

<code>lo Link encap:Local Loopback </code>

<code>inet addr:127.0.0.1 Mask:255.0.0.0</code>

<code>[root@M2 ~]</code><code># ifconfig|egrep 'Link encap|inet addr' </code>

<code>em1 Link encap:Ethernet HWaddr B8:CA:3A:F1:DE:37 </code>

<code>inet addr:192.168.0.211 Bcast:192.168.0.255 Mask:255.255.255.0 </code>

<code>em2 Link encap:Ethernet HWaddr B8:CA:3A:F1:DE:38 </code>

<code>inet addr:172.16.0.211 Bcast:172.16.0.255 Mask:255.255.255.0 </code>

<code>em3 Link encap:Ethernet HWaddr B8:CA:3A:F1:DE:39 </code>

<code>inet addr:172.16.100.211 Bcast:172.16.100.255 Mask:255.255.255.0 </code>

檢視現有路由,然後增加相應的心跳線和drbd資料傳輸線路的端到端的靜态路由條目。目的是為了讓心跳檢測和資料同步不受幹擾。

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

<code>[root@M1 network-scripts]</code><code># route -n </code>

<code>Kernel IP routing table </code>

<code>Destination Gateway Genmask Flags Metric Ref Use Iface </code>

<code>172.16.100.0 0.0.0.0 255.255.255.0 U 0 0 0 em3 </code>

<code>172.16.0.0 0.0.0.0 255.255.255.0 U 0 0 0 em2 </code>

<code>192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 em1 </code>

<code>169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1 </code>

<code>169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 em2 </code>

<code>169.254.0.0 0.0.0.0 255.255.0.0 U 1004 0 0 em3 </code>

<code>0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 em1</code>

<code>[root@M1 network-scripts]</code><code># /sbin/route add -host 172.16.0.211 dev em2 </code>

<code>[root@M1 network-scripts]</code><code># /sbin/route add -host 172.16.100.211 dev em3 </code>

<code>[root@M1 network-scripts]</code><code># echo '/sbin/route add -host 172.16.0.211 dev em2' &gt;&gt; /etc/rc.local </code>

<code>[root@M1 network-scripts]</code><code># echo '/sbin/route add -host 172.16.100.211 dev em3' &gt;&gt; /etc/rc.local </code>

<code>[root@M1 network-scripts]</code><code># tail -2 /etc/rc.local </code>

<code>/sbin/route</code> <code>add -host 172.16.0.211 dev em1 </code>

<code>/sbin/route</code> <code>add -host 172.16.100.211 dev em1</code>

<code>172.16.0.211 0.0.0.0 255.255.255.255 UH 0 0 0 em2 </code>

<code>172.16.100.211 0.0.0.0 255.255.255.255 UH 0 0 0 em3 </code>

<code>[root@M1 network-scripts]</code><code># traceroute 172.16.0.211 </code>

<code>traceroute</code> <code>to 172.16.0.211 (172.16.0.211), 30 hops max, 60 byte packets </code>

<code>1 172.16.0.211 (172.16.0.211) 0.820 ms 0.846 ms 0.928 ms</code>

<code>[root@M1 network-scripts]</code><code># traceroute 172.16.100.211 </code>

<code>traceroute</code> <code>to 172.16.100.211 (172.16.100.211), 30 hops max, 60 byte packets </code>

<code>1 172.16.100.211 (172.16.100.211) 0.291 ms 0.273 ms 0.257 ms</code>

<code>[root@M2 network-scripts]</code><code># route -n </code>

<code>0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 em1 </code>

<code>[root@M2 network-scripts]</code><code># /sbin/route add -host 172.16.0.210 dev em2 </code>

<code>[root@M2 network-scripts]</code><code># /sbin/route add -host 172.16.100.210 dev em3 </code>

<code>[root@M2 network-scripts]</code><code># echo '/sbin/route add -host 172.16.0.210 dev em2' &gt;&gt; /etc/rc.local </code>

<code>[root@M2 network-scripts]</code><code># echo '/sbin/route add -host 172.16.100.210 dev em3' &gt;&gt; /etc/rc.local </code>

<code>[root@M2 network-scripts]</code><code># tail -2 /etc/rc.local </code>

<code>/sbin/route</code> <code>add -host 172.16.0.210 dev em1 </code>

<code>/sbin/route</code> <code>add -host 172.16.100.210 dev em1 </code>

<code>172.16.0.210 0.0.0.0 255.255.255.255 UH 0 0 0 em2 </code>

<code>172.16.100.210 0.0.0.0 255.255.255.255 UH 0 0 0 em3 </code>

<code>[root@M2 network-scripts]</code><code># traceroute 172.16.0.210 </code>

<code>traceroute</code> <code>to 172.16.0.210 (172.16.0.210), 30 hops max, 60 byte packets </code>

<code>1 172.16.0.210 (172.16.0.210) 0.816 ms 0.843 ms 0.922 ms</code>

<code>[root@M2 network-scripts]</code><code># traceroute 172.16.100.210 </code>

<code>traceroute</code> <code>to 172.16.100.210 (172.16.100.210), 30 hops max, 60 byte packets </code>

<code>1 172.16.100.210 (172.16.100.210) 0.256 ms 0.232 ms 0.215 ms</code>

三、部署 heartbeat 服務

此處僅示範 M1 服務端的安裝,M2 的不做複述。 

1、安裝heartbeat軟體

<code>[root@M1 ~]</code><code># cd /etc/yum.repos.d/ </code>

<code>[root@M1 yum.repos.d]</code><code># wget http://mirrors.163.com/.help/CentOS6-Base-163.repo</code>

<code>[root@M1 yum.repos.d]</code><code># rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm</code>

<code>[root@M1 yum.repos.d]</code><code># sed -i 's@#baseurl@baseurl@g' *</code>

<code>[root@M1 yum.repos.d]</code><code># sed -i 's@mirrorlist@#mirrorlist@g' *</code>

<code>[root@M1 yum.repos.d]</code><code># yum install heartbeat -y     # 該指令有時可能需要執行2次</code>

2、配置heartbeat服務

<code>[root@M1  yum.repos.d]</code><code># cd /usr/share/doc/heartbeat-3.0.4/ </code>

<code>[root@M1 heartbeat-3.0.4]</code><code># ll |egrep 'ha.cf|authkeys|haresources' </code>

<code>-rw-r--r--. 1 root root 645 Dec 3 2013 authkeys              </code><code># heartbeat服務的認證檔案</code>

<code>-rw-r--r--. 1 root root 10502 Dec 3 2013 ha.cf                 </code><code># heartbeat服務主配置檔案</code>

<code>-rw-r--r--. 1 root root 5905 Dec 3 2013 haresources       </code><code># heartbeat資源檔案</code>

<code>[root@M1 heartbeat-3.0.4]</code><code># cp ha.cf authkeys haresources /etc/ha.d/ </code>

<code>[root@M1 heartbeat-3.0.4]</code><code># cd /etc/ha.d/</code>

<code>[root@M1 ha.d]</code><code># ls </code>

<code>authkeys ha.cf harc haresources rc.d README.config resource.d shellfuncs</code>

注意:主備節點兩端的配置檔案(ha.cf,authkeys,haresource)完全相同,下面是各個節點的檔案内容

針對heartbeat的配置,主要就是修改ha.cf、authkeys、haresources這三個檔案,下面我列出這三個檔案的配置資訊,大家僅作參考!

a、ha.cf 檔案

<code>[root@M1 ~]</code><code># cat /etc/ha.d/ha.cf </code>

<code>debugfile </code><code>/var/log/ha-debug</code>

<code>logfile </code><code>/var/log/ha-log</code>

<code>logfacility     local0</code>

<code>keepalive 2</code>

<code>deadtime 10</code>

<code>warntime 6</code>

<code>#initdead 120</code>

<code>udpport 694</code>

<code>#bcast em2</code>

<code>mcast em2 225.0.0.192 694 1 0</code>

<code>auto_failback on</code>

<code>respawn hacluster </code><code>/usr/lib64/heartbeat/ipfail</code>

<code>node    M1.redhat.sx</code>

<code>node    M2.redhat.sx</code>

<code>ping</code> <code>192.168.0.1</code>

b、authkeys 檔案

<code>[root@M1 ha.d]</code><code># cat authkeys </code>

<code>auth 1                    </code><code># 采用何種加密方式</code>

<code>1 crc                       </code><code># 無加密</code>

<code>#2 sha1 HI!            # 啟用sha1的加密方式</code>

<code>#3 md5 Hello!       # 采用md5的加密方式</code>

<code>[root@M1 ha.d]</code><code># chmod 600 authkeys    # 該檔案必須設定為600權限,不然heartbeat啟動會報錯</code>

c、haresources 檔案

<code>[root@M1 ha.d]</code><code># cat haresources </code>

<code>M1.redhat.sx IPaddr::192.168.0.219</code><code>/24/em1</code>

<code>#NFS IPaddr::192.168.0.219/24/em1 drbddisk::data Filesystem::/dev/drbd0::/data::ext4 rpcbind nfsd</code>

注意:這個裡的nfsd并不是heartbeat自帶的,需要自己編寫。

           針對該腳本的編寫需要滿足一下需求:

           1、有可執行權限

           2、必須存放在/etc/ha.d/resource.d或/etc/init.d目錄下

           3、必須有start、stop這兩個功能

           具體腳本資訊,下文會寫。

4、啟動heartbeat

<code>[root@M1 ha.d]</code><code># /etc/init.d/heartbeat start </code>

<code>Starting High-Availability services: INFO: Resource is stopped </code>

<code>Done.</code>

<code>[root@M1 ha.d]</code><code># chkconfig heartbeat off</code>

說明:關閉開機自啟動。當服務重新開機時,需要人工去啟動。

5、測試heartbeat

在此步測試之前,請先在 M2 上操作如上步驟!

a、正常狀态

<code>[root@M1 ha.d]</code><code># ip a|grep em1 </code>

<code>2: em1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP qlen 1000 </code>

<code>inet 192.168.0.210</code><code>/24</code> <code>brd 192.168.0.255 scope global em1 </code>

<code>inet 192.168.0.219</code><code>/24</code> <code>brd 192.168.0.255 scope global secondary em1    </code><code>#  之前在heartbeat資源檔案中定義的 VIP</code>

<code>[root@M2 ha.d]</code><code># ip a|grep em1 </code>

<code>inet 192.168.0.211</code><code>/24</code> <code>brd 192.168.0.255 scope global em1</code>

說明:M1主節點擁有vip位址,M2節點沒有。

b、模拟主節點當機後的狀态

<code>[root@M1 ha.d]</code><code># /etc/init.d/heartbeat stop </code>

<code>Stopping High-Availability services: Done. </code>

<code>inet 192.168.0.210</code><code>/24</code> <code>brd 192.168.0.255 scope global em1</code>

<code>inet 192.168.0.211</code><code>/24</code> <code>brd 192.168.0.255 scope global em1 </code>

<code>inet 192.168.0.219</code><code>/24</code> <code>brd 192.168.0.255 scope global secondary em1</code>

說明:M1當機後,VIP位址漂移到M2節點上,M2節點成為主節點

c、模拟主節點故障恢複後的狀态

<code>Done. </code>

說明:M1節點恢複之後,又搶占回了VIP資源

四、DRBD安裝部署

1、新添加(初始)硬碟

過程略

2、安裝drbd

針對drbd的安裝,我們不僅可以使用yum的方式,還可以使用編譯安裝的方式。由于我在操作的時候,無法從目前yum源取得drbd的rpm包,是以我就采用了編譯的安裝方式。

<code>[root@M1 ~]</code><code># yum -y install gcc gcc-c++ kernel-devel kernel-headers flex make</code>

<code>[root@M1 ~]</code><code># cd /usr/local/src</code>

<code>[root@M1 src]</code><code># wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz </code>

<code>[root@M1 src]</code><code># tar zxf drbd-8.4.3.tar.gz </code>

<code>[root@M1 src]</code><code># cd drbd-8.4.3 </code>

<code>[root@M1 ha.d]</code><code># ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat </code>

<code>[root@M1 ha.d]</code><code># make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/</code>

<code>[root@M1 ha.d]</code><code># make install</code>

<code>[root@M1 ha.d]</code><code># mkdir -p /usr/local/drbd/var/run/drbd </code>

<code>[root@M1 ha.d]</code><code># cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/ </code>

<code>[root@M1 ha.d]</code><code># chmod +x /etc/init.d/drbd </code>

<code>[root@M1 ha.d]</code><code># modprobe drbd      # 執行指令加載drbd子產品到核心</code>

<code>[root@M1 ha.d]</code><code># lsmod|grep drbd     # 檢查drbd是否被正确的加載到核心</code>

<code>drbd 310236 3 </code>

<code>libcrc32c 1246 1 drbd</code>

3、配置DRBD

有關DRBD涉及到的配置檔案主要是global_common.conf和使用者自定義的資源檔案(當然,該資源檔案可以寫到global_common.conf中)。

注意:M1和M2這兩個主備節點的以下配置檔案完全一樣

36

37

38

39

40

41

42

43

<code>[root@M1 ~]</code><code># cat /usr/local/drbd/etc/drbd.d/global_common.conf </code>

<code>global {</code>

<code>        </code><code>usage-count no; </code>

<code>} </code>

<code>common { </code>

<code>        </code><code>protocol C; </code>

<code>        </code><code>disk { </code>

<code>                </code><code>on-io-error detach;        </code><code># 配置I/O錯誤處理政策為分離</code>

<code>                </code><code>no-disk-flushes; </code>

<code>                </code><code>no-md-flushes; </code>

<code>        </code><code>} </code>

<code>        </code><code>net { </code>

<code>                </code><code>cram-hmac-alg </code><code>"sha1"</code><code>;         </code><code># 設定加密算法 </code>

<code>                </code><code>shared-secret </code><code>"allendrbd"</code><code>;    </code><code># 設定加密密鑰</code>

<code>                </code><code>sndbuf-size 512k;</code>

<code>                </code><code>max-buffers 8000;</code>

<code>                </code><code>unplug-watermark 1024;</code>

<code>                </code><code>max-epoch-size 8000;</code>

<code>                </code><code>after-sb-0pri disconnect;</code>

<code>                </code><code>after-sb-1pri disconnect;</code>

<code>                </code><code>after-sb-2pri disconnect;</code>

<code>                </code><code>rr-conflict disconnect;</code>

<code>        </code><code>syncer { </code>

<code>                </code><code>rate 1024M;             </code><code># 設定主備節點同步時的網絡速率</code>

<code>                </code><code>al-extents 517;</code>

<code>        </code><code>}</code>

<code>}</code>

<code>[root@M1 ~]</code><code># cat /usr/local/drbd/etc/drbd.d/drbd.res</code>

<code>resource drbd {              </code><code># 定義一個drbd的資源名</code>

<code>        </code><code>on M1.redhat.sx {                                 </code><code># 主機說明以on開頭,後面跟主機名稱</code>

<code>                </code><code>device </code><code>/dev/drbd0</code><code>;                      </code><code># drbd裝置名稱</code>

<code>                </code><code>disk </code><code>/dev/mapper/VolGroup-lv_drbd</code><code>; </code><code># drbd0 使用的是邏輯卷/dev/mapper/VolGroup-lv_drbd</code>

<code>                </code><code>address 172.16.100.210:7789;      </code><code># 設定DRBD監聽位址與端口</code>

<code>                </code><code>meta-disk internal;                      </code><code># 設定中繼資料盤為内部模式</code>

<code>        </code><code>on M2.redhat.sx { </code>

<code>                </code><code>device </code><code>/dev/drbd0</code><code>; </code>

<code>                </code><code>disk </code><code>/dev/mapper/VolGroup-lv_drbd</code><code>; </code>

<code>                </code><code>address 172.16.100.211:7789; </code>

<code>                </code><code>meta-disk internal; </code>

4、初始化meta分區

<code>[root@M1 drbd]</code><code># drbdadm create-md drbd </code>

<code>Writing meta data... </code>

<code>initializing activity log </code>

<code>NOT initializing bitmap </code>

<code>New drbd meta data block successfully created.</code>

5、啟動drbd服務

此處,我們可以看下M1 和M2 啟動drbd服務前後,drbd裝置發生的變化

<code>[root@M1 drbd]</code><code># cat /proc/drbd       # 啟動前 drbd 裝置資訊</code>

<code>version: 8.4.3 (api:1</code><code>/proto</code><code>:86-101) </code>

<code>GIT-</code><code>hash</code><code>: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected], 2014-11-11 16:20:26 </code>

<code>[root@M1 drbd]</code><code># drbdadm up all      # 啟動drbd,這裡也可以使用腳本去啟動</code>

<code>[root@M1 drbd]</code><code># cat /proc/drbd        # 啟動後 drbd 裝置資訊</code>

<code>0: cs:Connected ro:Secondary</code><code>/Secondary</code> <code>ds:Inconsistent</code><code>/Inconsistent</code> <code>C r----- </code>

<code>ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:133615596</code>

<code>[root@M2 ~]</code><code># cat /proc/drbd </code>

<code>GIT-</code><code>hash</code><code>: 89a294209144b68adb3ee85a73221f964d3ee515 build by [email protected], 2014-11-11 16:25:08 </code>

<code>[root@M2 ~]</code><code># drbdadm up all </code>

6、初始化裝置同步,并确立主節點(覆寫備節點,保持資料一緻)

<code>[root@M1 drbd]</code><code># drbdadm -- --overwrite-data-of-peer primary drbd </code>

<code>[root@M1 drbd]</code><code># cat /proc/drbd </code>

<code>0: cs:SyncSource ro:Primary</code><code>/Secondary</code> <code>ds:UpToDate</code><code>/Inconsistent</code> <code>C r---n- </code>

<code>ns:140132 nr:0 dw:0 dr:144024 al:0 bm:8 lo:0 pe:17 ua:26 ap:0 ep:1 wo:d oos:133477612 </code>

<code>[&gt;....................] </code><code>sync</code><code>'ed: 0.2% (130348</code><code>/130480</code><code>)M </code>

<code>finish: 0:16:07 speed: 137,984 (137,984) K</code><code>/sec</code>

<code>0: cs:SyncTarget ro:Secondary</code><code>/Primary</code> <code>ds:Inconsistent</code><code>/UpToDate</code> <code>C r----- </code>

<code>ns:0 nr:461440 dw:461312 dr:0 al:0 bm:28 lo:2 pe:75 ua:1 ap:0 ep:1 wo:d oos:133154284 </code>

<code>[&gt;....................] </code><code>sync</code><code>'ed: 0.4% (130032</code><code>/130480</code><code>)M </code>

<code>finish: 0:19:13 speed: 115,328 (115,328) want: 102,400 K</code><code>/sec</code>

同步完畢之後狀态:

<code>[root@M1 ~]</code><code># cat /proc/drbd </code>

<code>0: cs:Connected ro:Primary</code><code>/Secondary</code> <code>ds:UpToDate</code><code>/UpToDate</code> <code>C r----- </code>

<code>ns:133615596 nr:0 dw:0 dr:133616260 al:0 bm:8156 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

<code>0: cs:Connected ro:Secondary</code><code>/Primary</code> <code>ds:UpToDate</code><code>/UpToDate</code> <code>C r----- </code>

<code>ns:0 nr:133615596 dw:133615596 dr:0 al:0 bm:8156 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

7、挂載drbd分區到data資料目錄

<code>[root@M1 drbd]</code><code># mkfs.ext4 /dev/drbd0 </code>

<code>mke2fs 1.41.12 (17-May-2010) </code>

<code>Filesystem label= </code>

<code>OS </code><code>type</code><code>: Linux </code>

<code>Block size=4096 (log=2) </code>

<code>Fragment size=4096 (log=2) </code>

<code>Stride=0 blocks, Stripe width=0 blocks </code>

<code>8355840 inodes, 33403899 blocks </code>

<code>1670194 blocks (5.00%) reserved </code><code>for</code> <code>the super user </code>

<code>First data block=0 </code>

<code>Maximum filesystem blocks=4294967296 </code>

<code>1020 block </code><code>groups</code> 

<code>32768 blocks per group, 32768 fragments per group </code>

<code>8192 inodes per group </code>

<code>Superblock backups stored on blocks: </code>

<code>32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, </code>

<code>4096000, 7962624, 11239424, 20480000, 23887872 </code>

<code>Writing inode tables: </code><code>done</code> 

<code>Creating journal (32768 blocks): </code><code>done</code> 

<code>Writing superblocks and filesystem accounting information: </code><code>done</code> 

<code>This filesystem will be automatically checked every 21 mounts or </code>

<code>180 days, whichever comes first. Use tune2fs -c or -i to override.</code>

<code>[root@M1 drbd]</code><code># mount /dev/drbd0 /data/</code>

<code>[root@M1 drbd]</code><code># df -h</code>

<code>Filesystem Size Used Avail Use% Mounted on </code>

<code>/dev/mapper/VolGroup-lv_root</code> 

<code>50G 5.6G 42G 12% / </code>

<code>tmpfs 7.8G 0 7.8G 0% </code><code>/dev/shm</code> 

<code>/dev/sda1</code> <code>477M 46M 406M 11% </code><code>/boot</code> 

<code>/dev/drbd0</code> <code>126G 60M 119G 1% </code><code>/data</code>

8、測試主節點寫入,備節點是否能同步

<code>[root@M1 drbd]</code><code># dd if=/dev/zero of=/data/test bs=1G count=1 </code>

<code>1+0 records </code><code>in</code> 

<code>1+0 records out </code>

<code>1073741824 bytes (1.1 GB) copied, 1.26333 s, 850 MB</code><code>/s</code> 

<code>ns:135840788 nr:0 dw:2225192 dr:133617369 al:619 bm:8156 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

<code>[root@M1 drbd]</code><code># umount /data/</code>

<code>[root@M1 drbd]</code><code># drbdadm down drbd    # 關閉名字為drbd的資源</code>

<code>[root@M2 ~]</code><code># cat /proc/drbd                   # 主節點關閉資源之後,檢視備節點的資訊,可以看到主節點的角色已經變為UnKnown</code>

<code>0: cs:WFConnection ro:Secondary</code><code>/Unknown</code> <code>ds:UpToDate</code><code>/DUnknown</code> <code>C r----- </code>

<code>ns:0 nr:136889524 dw:136889524 dr:0 al:0 bm:8156 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

<code>[root@M2 ~]</code><code># drbdadm primary drbd       # 确立自己的角色為primary,即主節點</code>

<code>[root@M2 ~]</code><code># mount /dev/drbd0 /data</code>

<code>[root@M2 ~]</code><code># cd /data </code>

<code>[root@M2 data]</code><code># ls                                     # 發現資料還在</code>

<code>lost+found </code><code>test</code> 

<code>[root@M2 data]</code><code># du -sh test </code>

<code>1.1G </code><code>test</code>

<code>[root@M2 data]</code><code># cat /proc/drbd                # 檢視目前 drbd 裝置資訊</code>

<code>0: cs:WFConnection ro:Primary</code><code>/Unknown</code> <code>ds:UpToDate</code><code>/DUnknown</code> <code>C r----- </code>

<code>ns:0 nr:136889524 dw:136889548 dr:1045 al:3 bm:8156 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:24</code>

五、NFS安裝部署

該操作依舊僅以M1為例,M2操作亦如此。

1、安裝nfs

<code>[root@M1 drbd]</code><code># yum install nfs-utils rpcbind -y</code>

<code>[root@M2 ~]</code><code># yum install nfs-utils rpcbind -y</code>

2、配置 nfs 共享目錄

<code>[root@M1 drbd]</code><code># cat /etc/exports </code>

<code>/data</code> <code>192.168.0.0</code><code>/24</code><code>(rw,</code><code>sync</code><code>,no_root_squash,anonuid=0,anongid=0)</code>

<code>[root@M2 ~]</code><code># cat /etc/exports </code>

3、啟動 rpcbind 和 nfs 服務

<code>[root@M1 drbd]</code><code># /etc/init.d/rpcbind start;chkconfig rpcbind off </code>

<code>[root@M1 drbd]</code><code># /etc/init.d/nfs start;chkconfig nfs off </code>

<code>Starting NFS services: [ OK ] </code>

<code>Starting NFS quotas: [ OK ] </code>

<code>Starting NFS mountd: [ OK ] </code>

<code>Starting NFS daemon: [ OK ] </code>

<code>Starting RPC idmapd: [ OK ]</code>

<code>[root@M2 drbd]</code><code># /etc/init.d/rpcbind start;chkconfig rpcbind off </code>

<code>[root@M2 drbd]</code><code># /etc/init.d/nfs start;chkconfig nfs off </code>

<code>Starting RPC idmapd: [ OK ]192</code>

4、測試 nfs

<code>[root@C1 ~] </code><code># mount -t nfs -o noatime,nodiratime 192.168.0.219:/data /xxxxx/ </code>

<code>[root@C1 ~] </code><code># df -h|grep data </code>

<code>192.168.0.219:</code><code>/data</code> <code>126G 1.1G 118G 1% </code><code>/data</code>

<code>[root@C1 ~] </code><code># cd /data</code>

<code>[root@C1 data] </code><code># ls </code>

<code>[root@C1 data] </code><code># echo 'nolinux' &gt;&gt; nihao</code>

<code>lost+found nihao </code><code>test</code>

<code>[root@C1 data] </code><code># cat nihao </code>

<code>nolinux</code>

六、整合Heartbeat、DRBD和NFS服務

注意,一下修改的heartbeat的檔案和腳本都需要在M1和M2上保持相同配置!

1、修改 heartbeat 資源定義檔案

修改heartbeat的資源定義檔案,添加對drbd服務、磁盤挂載、nfs服務的自動管理,修改結果如下:

<code>[root@M1 ~]</code><code># cat /etc/ha.d/haresources</code>

<code>M1.redhat.sx IPaddr::192.168.0.219</code><code>/24/em1</code> <code>drbddisk::drbd Filesystem::</code><code>/dev/drbd0</code><code>::</code><code>/data</code><code>::ext4 nfsd</code>

這裡需要注意的是,配置檔案中使用的IPaddr、drbddisk都是存在于/etc/ha.d/resource.d/目錄下的,該目錄下自帶了很多服務管理腳本,來提供給heartbeat服務調用。而後面的nfsd,預設heartbeat是不帶的,這裡附上該腳本。

<code>[root@M1 /]</code><code># vim /etc/ha.d/resource.d/nfsd</code>

<code>#!/bin/bash</code>

<code>#</code>

<code>case</code> <code>$1 </code><code>in</code>

<code>start)</code>

<code>    </code><code>/etc/init</code><code>.d</code><code>/nfs</code> <code>restart</code>

<code>    </code><code>;;</code>

<code>stop)</code>

<code>   </code><code>for</code> <code>proc </code><code>in</code> <code>rpc.mountd rpc.rquotad nfsd nfsd</code>

<code>        </code><code>do</code>

<code>             </code><code>killall -9 $proc</code>

<code>    </code><code>done</code>

<code>esac</code>

<code>[root@M1 /]</code><code># chmod 755 /etc/ha.d/resource.d/nfsd</code>

雖然,系統自帶了nfs的啟動腳本,但是在 heartbeat 調用時無法徹底殺死 nfs 程序,是以才需要我們自己編寫啟動腳本。

2、重新開機heartbeat,啟動 NFS 高可用

一下操作,最好按順序!

<code>[root@M1 ~]</code><code># /etc/init.d/heartbeat stop </code>

<code>Stopping High-Availability services: </code>

<code>[root@M2 ~]</code><code># /etc/init.d/heartbeat stop </code>

<code>[root@M1 ~]</code><code># /etc/init.d/heartbeat start </code>

<code>[root@M2 ~]</code><code># /etc/init.d/heartbeat start </code>

<code>[root@M1 ~]</code><code># ip a|grep em1 </code>

<code>[root@M2 ~]</code><code># ip a |grep em1 </code>

<code>ns:24936 nr:13016 dw:37920 dr:17307 al:15 bm:5 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

<code>ns:84 nr:24 dw:37896 dr:10589 al:14 bm:5 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

<code>C1 端挂載測試:</code>

<code>[root@C1 ~] </code><code># mount 192.168.0.219:/data /data </code>

<code>[root@C1 ~] </code><code># df -h |grep data</code>

<code>192.168.0.219:</code><code>/data</code> <code>126G 60M 119G 1% </code><code>/data</code>

OK,可以看出C1用戶端能夠通過VIP成功挂載NFS高可用存儲共享出來的NFS服務。

3、測試

這裡,将進行對NFS高可用叢集進行測試,看遇到故障之後,是否服務能夠正常切換。

a、測試關閉heartbeat服務後,nfs服務是否正常

M1端heartbeat服務宕前,M1端狀态:

<code>inet 192.168.0.219</code><code>/24</code> <code>brd 192.168.0.255 scope global secondary em1 </code>

<code>ns:8803768 nr:3736832 dw:12540596 dr:5252 al:2578 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

M1端heartbeat服務宕前,M2端狀态:

<code>[root@M2 ~]</code><code># ip a|grep em1 </code>

<code>ns:4014352 nr:11417156 dw:15431508 dr:5941 al:1168 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

宕掉M1端heartbeat服務:

<code>Stopping High-Availability services: Done.</code>

M1端heartbeat服務宕後,M1端狀态:

<code>ns:11417152 nr:4014300 dw:15431448 dr:7037 al:3221 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

M1端heartbeat服務宕後,M2端狀态:

<code>ns:4014300 nr:11417152 dw:15431452 dr:5941 al:1168 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

恢複M1端的heartbeat服務,看M2是否回切

恢複M1端heartbeat服務:

M1端heartbeat服務恢複後,M1端狀态:

<code>ns:11417156 nr:4014352 dw:15431504 dr:7874 al:3221 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

M1端heartbeat服務恢複後,M2端狀态:

C1端針對NFS切換的受影響效果分析:

<code>[root@C1 ~] </code><code>#  for i in `seq 1 10000`;do dd if=/dev/zero of=/data/test$i bs=10M count=1;stat /data/test$i|grep 'Access: 2014';done   # 這裡僅僅截取部分輸出</code>

<code>1+0 records </code><code>in</code>

<code>1+0 records out</code>

<code>10485760 bytes (10 MB) copied, 15.1816 s, 691 kB</code><code>/s</code>

<code>Access: 2014-11-12 23:26:15.945546803 +0800</code>

<code>10485760 bytes (10 MB) copied, 0.20511 s, 51.1 MB</code><code>/s</code>

<code>Access: 2014-11-12 23:28:11.687931979 +0800</code>

<code>10485760 bytes (10 MB) copied, 0.20316 s, 51.6 MB</code><code>/s</code>

<code>Access: 2014-11-12 23:28:11.900936657 +0800</code>

注意:目測,NFS必須需要2分鐘的延遲。測試了很多方法,這個問題目前尚未解決!

b、測試關閉心跳線之外的網絡後,nfs服務是否正常

M1端em1網口宕前,M1端狀态:

宕掉M1端的em1網口:

<code>[root@M1 ~]</code><code># ifdown em1</code>

M1端em1網口宕後,M1端狀态:(在M2端上通過心跳線,SSH到M1端)

<code>2: em1: &lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc mq state DOWN qlen 1000</code>

<code>ns:11993288 nr:4024660 dw:16017944 dr:8890 al:3222 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

M1端em1網口宕後,M2端狀态:

<code>ns:4024620 nr:11993288 dw:16017908 dr:7090 al:1171 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

恢複M1端的em1網口:

<code>[root@M1 ~]</code><code># ifup em1</code>

恢複M1端的em1網口,M1端狀态:

<code>[root@M1 ~]</code><code># ip a |grep em1 </code>

<code>ns:11993292 nr:4024680 dw:16017968 dr:9727 al:3222 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

恢複M1端的em1網口,M2端狀态:

<code>ns:4024680 nr:11993292 dw:16017972 dr:7102 al:1171 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0</code>

       有關heartbeat和keepalived的腦裂問題,此處不做描述,後面另起文章去寫。

       以上文章是前一段公司存儲改造時,我寫的方案,此處分享給大家。

       後來在測試過程中,由于NFS是靠RPC機制來進行通信的,受RPCBIND機制的影響,導緻NFS服務端切換之後,NFS的用戶端會受到1-2分的延遲。在NFS用戶端頻繁寫入的情況下時間可能會更久,在NFS用戶端無寫入時,依舊需要一分鐘多。是以,後來棄用了這種架構。不知道51的博友們,是如何解決NFS服務端切換導緻NFS挂載用戶端延時這個問題的呢?

本文轉自 aaao 51CTO部落格,原文連結:http://blog.51cto.com/nolinux/1591739,如需轉載請自行聯系原作者