由于目前線上的兩台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' >> /etc/rc.local </code>
<code>[root@M1 network-scripts]</code><code># echo '/sbin/route add -host 172.16.100.211 dev em3' >> /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' >> /etc/rc.local </code>
<code>[root@M2 network-scripts]</code><code># echo '/sbin/route add -host 172.16.100.210 dev em3' >> /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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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>[>....................] </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>[>....................] </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' >> 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: <BROADCAST,MULTICAST> 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,如需轉載請自行聯系原作者