利用heartbeat和drbd實現HDFS的雙機熱備
written by aaronwxb,2012.03.30
主要原理:
利用DRBD實現共享存儲空間,在主服務器(primary)將元數據寫入本機時同時要寫入備份節點(secondary),才算一次寫操作完成,實現元數據的實時備份。
利用heartbeat實現自動切換功能,雙方之間發送心跳,若備份節點一旦其無法檢測到主服務器的“心跳”則自動接管主服務器的資源。
虛擬機環境配置:
用vbox安裝虛擬機,OS為ubuntu11.10,虛擬機雙網卡,網卡配置為橋接方式,主要設置如下:
| 主機 |
IP地址 |
配置 |
| master(主節點) |
eth0: 192.168.123.41 eth1: 192.168.123.42 (HA心跳使用地址) eth0:0: 192.168.123.40 (虛擬IP)
|
容量:G 接口標准: 轉速:rpm 緩存容量:M 平均尋道時間:ms 傳輸標准: |
| backup(從節點) |
eth0: 192.168.123.44 eth1: 192.168.123.46 (HA心跳使用地址) eth0:0: 192.168.123.40 (虛擬IP)
|
容量:G 接口標准: 轉速:rpm 緩存容量:M 平均尋道時間:ms 傳輸標准: |
| slave(數據節點) |
eth0:192.168.123.47 |
|
master:
網卡配置:
bobo@master:~$ cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.123.41
netmask 255.255.255.0
gateway 192.168.123.1
auto eth1
iface eth1 inet static
address 192.168.123.42
netmask 255.255.255.0
hosts文件
bobo@master:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 bobo-VirtualBox
192.168.123.41 master
192.168.123.44 backup
192.168.123.47 slave
192.168.123.40 vip
192.168.123.42 master
192.168.123.46 backup
backup:
網卡配置:
bobo@backup:~$ cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.123.44
netmask 255.255.255.0
gateway 192.168.123.1
auto eth1
iface eth1 inet static
address 192.168.123.46
netmask 255.255.255.0
hosts文件
同master
slave(datanode):
網卡配置:
bobo@slave:~$ cat /etc/network/interfaces
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.123.47
netmask 255.255.255.0
gateway 192.168.123.1
hosts文件
同master
配置SSH無密碼訪問:
master
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> authorized_keys
backup
關閉selinux(所有機器)
SELinux是一種基於 域-類型 模型(domain-type)的強制訪問控制(MAC)安全系統,它由NSA編寫並設計成內核模塊包含到內核中,相應的某些安全相關的應用也被打了SELinux的補丁,最后還有一個相應的安全策略。Lustre存儲服務器和元數據目錄服務器通信會使用一些特殊端口,最好關閉SELINUX。
編輯文件/etc/sysconfig/selinux,設置:
SELINUX=disabled
然后reboot
沒有selinux
關閉防火牆(所有機器)
如果系統啟動了Iptables服務,需要為相關服務打開端口 (988, 1021 ~ 1023等),簡單的處理是關閉防火牆。
#清除規則
iptables –F
#保存
service iptables save
chkconfig --level 2345 iptables off
service iptables stop
沒有防火牆ufw
iptables沒有開啟,默認都是ACCEPT
DRBD部署
原理
DRBD(Distributed Replicated Block Device)是基於Linux系統下的塊復制分發設備。它可以實時的同步遠端主機和本地主機之間的數據,類似與Raid1的功能,我們可以將它看作為網絡 Raid1。在服務器上部署使用DRBD,可以用它代替共享磁盤陣列的功能,因為數據同時存在於本地和遠端的服務器上,當本地服務器出現故障時,可以使用遠端服務器上的數據繼續工作,如果要實現無間斷的服務,可以通過drbd結合另一個開源工具heartbeat,實現服務的無縫接管。DRBD的工作原理如下圖:
編譯linux內核
由於2.4.9缺少CONNECTOR,導致drbd無法安裝,因此必須編譯內核。
linux內核2.6之后就帶有CONNECTOR,這里用的是:
bobo@master:~$ uname -a
Linux master 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:50:42 UTC 2011 i686 i686 i386 GNU/Linux
安裝drbd
分別在兩台主機上安裝。
sudo apt-get install drbd8-utils
配置drbd
1.DRBD使用的硬盤分區
這兩個分區的大小必須相同。
為虛擬機master和backup添加一塊虛擬硬盤,大小為2G,利用fdisk分區,得到:
Disk /dev/sdb: 2147 MB, 2147483648 bytes
22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x80d3501f
Device Boot Start End Blocks Id System
/dev/sdb1 2048 4194303 2096128 5 Extended
/dev/sdb5 4096 4194303 2095104 83 Linux
我們指定兩台主機的/dev/sdb5分區作為DRBD的使用的分區.這兩個分區大小都為2G。分區需為空白。
主機1 :master, IP地址為 192.168.123.42,DRBD分區為/dev/sdb5
主機2 :backup,IP地址為 192.168.123.46,DRBD分區為/dev/sdb5
這里用eth1作為兩個主機的通信接口。
2.drbd.conf配置文件
DRBD運行時,會讀取一個配置文件/etc/drbd.conf。這個文件里描述了DRBD設備與硬盤分區的映射關系,和DRBD的一些配置參數:
# 是否參加DRBD使用者統計.默認是yes
global { usage-count yes; }
# 設置主備節點同步時的網絡速率最大值,單位是字節.
common { syncer { rate10M; } }
# 一個DRBD設備(即:/dev/drbdX),叫做一個"資源".里面包含一個DRBD設備的主備節點的相關信息.
resource r0 {
# 使用協議C.表示收到遠程主機的寫入確認后,則認為寫入完成.
protocol C;
disk {
on-io-error detach;
}
net {
#見其他——split brain問題處理
after-sb-0pri discard-younger-primary;
after-sb-1pri discard-secondary;
after-sb-2pri call-pri-lost-after-sb;
rr-conflict disconnect; #incompatible resync decision
}
syncer {
rate10M; #(設置網絡同步速率)
al-extents 257; #A higher number of extents gives longer resync times but less updates to the meta-data. The default number of extents is 127. (Minimum: 7, Maximum: 3843)
}
# 每個主機的說明以"on"開頭,后面是主機名.在后面的{}中為這個主機的配置.
on master {
# /dev/drbd1使用的磁盤分區是/dev/hdb1
device /dev/drbd0;
disk /dev/sdb5; #/dev/hdb5;
# 設置DRBD的監聽端口,用於與另一台主機通信
address 192.168.123.42:7788;
flexible-meta-disk internal;
}
on backup {
device /dev/drbd0;
disk /dev/sdb5; #/dev/hda5;
address 192.168.123.46:7788;
flexible-meta-disk internal;
}
}
3 將drbd.conf文件復制到備機上
scp /etc/drbd.conf backup:/etc
初始化drbd
1、加載模塊
drbd采用的是模塊控制的方式,所以先要加載drbd.ko 模塊
#insmod drbd.ko或者modprobe drbd
使用lsmod來查看模塊是否加載成功。
成功
Module Size Used by
nls_utf8 12493 1
isofs 39549 1
drbd 260222 4
2、主備創建數據塊
drbdadm create-md r0
3、主備啟動drbd
/etc/init.d/drbd start
bobo@master:~$ cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2095004
bobo@backup:/etc$ cat /proc/drbd
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2095004
4、設置主節點
在master上執行以下命令,設置master為主節點:
sudo drbdadm -- --overwrite-data-of-peer primary all
5、查看連接
netstat -atn的輸出結果,說明兩台機器的drbd服務已經連接上了:
tcp 0 0 192.168.1.42:57769 192.168.1.46:7788 ESTABLISHED
tcp 0 0 192.168.1.42:7788 192.168.1.46:33762 ESTABLISHED
6、查看同步狀態
cat /proc/drbd
主節點上執行這個命令后的結果,顯示數據正在同步中:
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:62464 nr:0 dw:0 dr:63264 al:0 bm:3 lo:7 pe:0 ua:8 ap:0 ep:1 wo:f oos:2032540
[>....................] sync'ed: 3.2% (2032540/2095004)K
finish: 0:03:14 speed: 10,408 (10,408) K/sec
等待同步完畢
7、創建文件系統
在主節點上的設備/dev/drbd0上創建一個文件系統,可以把DRBD設備掛載到/mnt/drbd目錄上使用。從節點的DRBD設備無法被掛載,因為它是用來接收主機數據的,由DRBD負責操作。因此不需要這個過程。在master上執行:
mkfs.ext3 /dev/drbd0
mkdir /mnt/drbd
mount /dev/drbd0 /mnt/drbd
查看掛載結果:
df
/dev/drbd0 30963708 176200 29214644 1% /mnt/drbd
8、設置drbd開機自動啟動
chkconfig drbd on
主備機切換
有時,需要將DRBD的主備機互換一下,可以執行下面的操作:
1、在主節點上,先要卸載掉DRBD設備。
sudo umount /mnt/drbd0
2、將主節點master降級為“從節點”:
sudo drbdadm secondary r0
3、在從節點backup上,將它升級為“主節點”:
sudo drbdadm primary r0
4、在從節點backup上,掛載drbd設備
sudo mount /dev/drbd0 /mnt/drbd
drbd手動切換同步測試
1)在master上
cd /mnt/drbd
dd if=/dev/zero of=/mnt/drbd/testfile bs=104857600 count=2
umount /mnt/drbd
drbdadm secondary all
2)在backup上
drbdadm primary all
mkdir -p /mnt/drbd
mount /dev/drbd0 /mnt/drbd
ls -l /mnt/drbd
可以看到文件testfile在主節點寫入,在從節點馬上可以看到。
heartbeat部署
安裝heartbeat
先在主節點上安裝,命令如下:
sudo apt-get install heartbeat
配置
/etc/ha.d/ha.cf定義位於不同節點上的heartbeat進程間如何進行通信/etc/ha.d/authkeys 定義Heartbeat包在通信過程中如何進行加密
/etc/ha.d/haresources 定義對某個資源來說哪個服務器是主節點,以及哪個節點應該擁有客戶端訪問資源時的目標IP地址
配置/etc/ha.d/ha.cf
配置heartbeat守護進程使用交叉網絡發送和接收心跳數據包。
1、 解壓/usr/share/doc/heartbeat/ha.cf樣本配置文件:
sudo gunzip ha.cf.gz
2、 使用下面的命令將樣本配置文件復制到適當的位置:
sudo cp ha.cf /etc/ha.d/ha.cf
3、 編輯/etc/ha.d/ha.cf文件,取消注釋符號或增加以下內容:
logfile /var/log/ha-log
#heartbeat的日志文件
udpport 694
#設置廣播通信使用的端口,694為默認使用的端口號
ucast eth1 192.168.123.46
#采用單播ucast方式,使用網卡eth1在主服務器和備用服務器之間發送心跳消息。指定對端ip,即在master上指定192.168.123.46,在backup上指定192.168.123.42
4、 同時,取消keepalive,deadtime和initdead這三行的注釋符號:
keepalive 2
#心跳消息之間的時間間隔,默認時間單位為秒
deadtime 30
#超出該時間間隔未收到對方節點的心跳,則認為對方已經死亡。
warntime 10
#超出該時間間隔未收到對方節點的心跳,則發出警告並記錄到日志中。
initdead 120
#在某些系統上,系統啟動或重啟之后需要經過一段時間網絡才能正常工作,選項用於解決這種情況產生的時間間隔。取值至少為deadtime的兩倍。
5、添加下面兩行:
node master
node backup
#這里填寫主、備用服務器的名字(uname -n命令返回的值)。
6、使用Heartbeat重新啟動守護進程
指定與heartbeat一同啟動和關閉的進程,該進程被自動監視,遇到故障則重新啟動。
最常用的進程是ipfail,該進程用於檢測和處理網絡故障,需要配合ping語句指定的ping node來檢測網絡連接。在/etc/ha.d/ha.cf中使用下面這樣一行:
ping 192.168.123.1 #一般ping網關,不能ping集群中的節點
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root #執行ipfail的用戶和組ID
7、auto_failback的相關配置
用於決定,當擁有該資源的屬主恢復之后,資源是否變遷:是遷移到主上(設置為on),還是在當前節點上繼續運行,直到當前節點出現故障(off)。
auto_failback off
8、STONITH配置
stonith_host master null backup
stonith_host backup null master
# stonith的主要作用是使出現問題的節點從集群環境中脫離,進而釋放集群資源,避免兩個節點爭用一個資源的情形發生。保證共享數據的安全性和完整性。
配置/etc/ha.d/authkeys
authkeys文件用於heartbeat的鑒權設置,共有三種可用的鑒權方式:crc、md5和sha1。三種方式安全性依次提高,但同時占用的系統資源也依次擴大。crc安全性最低,適用於物理上比較安全的網絡,sha1提供最為有效的鑒權方式,占用的系統資源也最多。
其配置語句格式如下:
auth <number>
<number> <authmethod> [<authkey>]
1、 將authkeys文件復制到適當的位置:
cp /usr/share/doc/heartbeat/authkeys /etc/ha.d
2、 編輯/etc/ha.d/authkeys文件,取消下面兩行內容前的注釋符號:
auth1
1 crc
3、 確保authkeys文件只能由root讀取:
chmod 600 /etc/ha.d/authkeys
配置/etc/ha.d/haresources
格式如下:
primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2]
主服務擁有的資源的名字,它告訴heartbeat程序哪個機器擁有某個資源,資源名實際上是/etc/init.d目錄或/etc/ha.d/resource.d目錄下的一個腳本。(這個腳本的副本必須同時存在於主服務器和備用服務器上)
master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs
在備用服務器上安裝Heartbeat
安裝完包之后,直接在主服務器上執行下面的命令復制所有配置文件到備用服務器上:
scp -r /etc/ha.d backup:/etc/ha.d
scp命令是安全復制命令,它使用SSH協議在兩個節點之間復制數據,-r選項指定scp復制主服務器上/etc/ha.d目錄下的所有文件和所有子目錄。
啟動Heartbeat
1 在主服務器和備用服務器上把heartbeat配置為開機自動啟動
chkconfig --level 35 heartbeat on
2 手工啟停方法
/etc/init.d/heartbeat start
或者
service heartbeat start
/etc/init.d/heartbeat stop
或者
service heartbeat stop
heartbeat自動切換測試
1)啟動heartbeat
在master和backup上執行:
/etc/init.d/heartbeat start
已經啟動
2)在master上到ifconfig
可以看到虛擬IP已經啟動
eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C
inet addr:192.168.123.40 Bcast:192.168.188.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:177 Base address:0xc400
3)在master上停止heartbeat服務或關機
/etc/init.d/heartbeat stop
4)在backup上ifconfig
可以看到虛擬IP已經啟動
eth0:0 Link encap:Ethernet HWaddr 00:11:2F:85:F9:DD
inet addr:192.168.123.40 Bcast:192.168.188.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:177 Base address:0xc400
通過haresources配置自動切換
如果不使用heartbeat的情況下,DRBD只能手工切換主從關系,現在修改heartbeat的配置文件,使DRBD可以通過heartbeat自動切換。
創建資源腳本
1 新建腳本hdfs,用於啟停hdfs文件系統,內容如下:
cd /etc/ha.d/resource.d
vi hdfs
#!/bin/sh
case "$1" in
start)
# Start commands go here
cd /home/bobo/hadoop-0.20.203.0/bin
msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/start-dfs.sh"`
logger $msg
;;
stop)
# Stop commands go here
cd /home/bobo/hadoop-0.20.203.0/bin
msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/stop-dfs.sh"`
logger $msg
;;
status)
# Status commands go here
;;
esac
2 修改權限
chmod 755 /etc/ha.d/resource.d/hdfs
3 把腳本拷貝到備份機並同樣修改權限
scp /etc/ha.d/resource.d/hdfs backup: /etc/ha.d/resource.d/
chmod 755 /etc/ha.d/resource.d/hdfs
配置haresources
1 修改/etc/ha.d/haresources
vi /etc/ha.d/haresources
master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs
注釋:
master 主服務器名
192.168.123.40 對外服務IP別名
drbddisk::r0 資源drbddisk,參數為r0
Filesystem::/dev/drbd0::/mnt/drbd::ext3 資源Filesystem,mount設備/dev/drbd0到/mnt/drbd目錄,類型為ext3
hdfs hdfs文件系統資源
drbd,heartbeat,hdfs聯調測試
測試1 創建文件和目錄
1、41上heartbeat和drbd啟動
由於41為主節點,在啟動heartbeat服務后,虛擬地址192.168.123.40被配置到master上,同時掛載了drbd文件系統在/mnt/drbd。
1)執行ifconfig可以看到
eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C
inet addr:192.168.123.40 Bcast:192.168.188.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:177 Base address:0xc400
2)在41上執行cat /proc/drbd,可以看到41和44之間同步正常,41為主節點
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:84 nr:8 dw:88 dr:2058 al:2 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
3)在44上執行cat /proc/drbd,可以看到44和41之間同步正常,44為備份節點
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:8 nr:84 dw:92 dr:1025 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
4)在41上執行df,看到drbd已掛載
/dev/drbd0 2062060 35876 1921436 2% /mnt/drbd
2、在hdfs文件系統創建目錄
# 必須切換到hdfs用戶才可以訪問hdfs文件系統
# su bobo
cd /home/hdfs/hdfsinstall/hadoop/bin
# 創建目錄testdir
hadoop dfs -mkdir testdir
3、把本地文件hello拷貝到HDFS的根目錄下
hadoop dfs -put ~/hadoopfile/1.file testfile
4、查看現有的文件和目錄
Found 2 items
drwxr-xr-x - bobo supergroup 0 2012-03-26 01:24 /user/bobo/testdir
-rw-r--r-- 1 bobo supergroup 0 2012-03-26 01:26 /user/bobo/testfile
測試2 主備節點切換
1、在41上停止heartbeat
在41上執行sudo service heartbeat stop
2、查看44
1)執行ifconfig可以看到虛擬ip已經切換到44上
eth1:0 Link encap:以太網 硬件地址 08:00:27:9a:2a:f5
inet 地址:192.168.1.40 廣播:192.168.1.255 掩碼:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 躍點數:1
2)在44上執行cat /proc/drbd,看到44切換為主節點Primary
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:2760 nr:1960 dw:4756 dr:3797 al:14 bm:14 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo
s:0
3)執行df,看到drbd已掛載
/dev/drbd0 2062060 35876 1921436 2% /mnt/drbd
3、在44上查看hdfs文件系統
/home/hdfs/hdfsinstall/hadoop/bin/hadoop dfs -ls
查看現有的文件和目錄。顯示是正常的。
-rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello
drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir
測試3 主備節點再次切換
1、先開啟41上的heartbeat,在44上停止heartbeat
在44上執行/etc/init.d/heartbeat stop
2、查看41
1)執行ifconfig可以看到虛擬ip已經切換到41上
eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C
inet addr:192.168.123.40 Bcast:192.168.188.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:177 Base address:0xc400
2)在41上執行cat /proc/drbd,看到41切換為主節點Primary
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:2300 nr:2824 dw:5040 dr:4093 al:13 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo
s:0
3)執行df,看到drbd已掛載
/dev/drbd0 30963708 185580 29205264 1% /mnt/drbd
3、在41上查看hdfs文件系統
bin/hadoop dfs -ls
查看現有的文件和目錄。顯示是正常的。
-rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello
drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir
測試4 split brain自動處理
1、按照其他中描述配置split brain自動處理
上面已經配置了
2、重新啟動41和44,等待幾分鍾后
3、查看41
cat /proc/drbd
顯示Connected,表示同步正常。
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:336 nr:64 dw:400 dr:765 al:7 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
4、查看44
cat /proc/drbd
顯示Connected,表示同步正常。
version: 8.3.11 (api:88/proto:86-96)
srcversion: DA5A13F16DE6553FC7CE9B2
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:336 dw:336 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
5、在41上查看hdfs文件系統
bin/hadoop dfs -ls
查看現有的文件和目錄。顯示是正常的。
-rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello
drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir
其他
用戶映射
在41上和44上我們的都創建相同的用戶/口令:bobo/bobo,但在/etc/passwd和/etc/group中可以看到,在兩台機器上,用戶和組所對應的useid和groupid是不同的,這樣會導致,drbd切換時,drbd的存儲在兩台機器上映射到不一致的用戶和組。因此需要在創建用戶和組時指定useid和groupid。目前我們采用修改44的方式:
1 首先打開41上的/etc/passwd和/etc/group,得到bobo的useid和groupid值為1000。
2 在44上修改bobo的useid和groupid值為1000。
usermod -u 1000 bobo
groupmod -u 1000 bobo
3 這樣drbd切換時,就不會出現權限問題。
split brain問題處理(參考)
split brain實際上是指在某種情況下,造成drbd的兩個節點斷開了連接,都以primary的身份來運行。當drbd某primary節點連接對方節點准備發送信息的時候如果發現對方也是primary狀態,那么會會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息:“Split-Brain detected,dropping connection!”當發生split brain之后,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。
錯誤狀態
1 節點重新啟動時,在dmesg中出現錯誤提示:
drbd0: Split-Brain detected, dropping connection!
drbd0: self055F46EA3829909E:899EC0EBD8690AFD:FEA4014923297FC8:3435CD2BACCECFCB
drbd0: peer 7E18F3FEEA113778:899EC0EBD8690AFC:FEA4014923297FC8:3435CD2BACCECFCB
drbd0: helper command: /sbin/drbdadm split-brain minor-0
drbd0: meta connection shut down by peer.
2在44查看cat /proc/drbd,44運行為StandAlone狀態
version:8.3.0(api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 2008-12-30 17:16:32
0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:664
3在41查看cat /proc/drbd,41運行為StandAlone狀態
version:8.3.0(api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 2008-12-30 17:23:44
0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r---
ns:0 nr:0 dw:4 dr:21 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:68
4 原因分析
由於節點重啟導致數據不一致,而配置文件中沒有配置自動修復錯誤的內容,因而導致握手失敗,數據無法同步。
split brain有兩種解決辦法:手動處理和自動處理。
手動處理
1 在44上停止heartbeat
Heartbeat會鎖定資源,只有停止后才能釋放
/etc/init.d/heartbeat stop
2 在作為secondary的節點上放棄該資源的數據
在44上
/sbin/drbdadm -- --discard-my-data connect r0
3在作為primary的節點重新連接secondary
在41上
/sbin/drbdadm disconnect r0
/sbin/drbdadm connect r0
把41設置為主節點
/sbin/drbdadm primary r0
4在44上重新啟動heartbeat
/etc/init.d/heartbeat start
5 查看41狀態 cat /proc/drbd,顯示為Connected,已經恢復了正常。
version:8.3.0(api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 2008-12-30 17:23:44
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r---
ns:768 nr:0 dw:800 dr:905 al:11 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
6查看44狀態 cat /proc/drbd,顯示為Connected,已經恢復了正常。
version:8.3.0(api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 2008-12-30 17:16:32
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r---
ns:0 nr:768 dw:768 dr:0 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
(實際采用的恢復方法)
先選擇好一個備機,在備機上執行:
sudo drbdadm secondary r0
sudo drbdadm disconnect r0
sudo drbdadm -- --discard-my-data connect r0
在主上執行:
sudo drbdadm connect r0
自動處理
通過/etc/drbd.conf配置中設置自動處理策略,在發生數據不一致時自動處理。自動處理策略定義如下:
1 after-sb-0pri.
當兩個節點的狀態都是secondary時,可以通過after-sb-0pri策略自動恢復。
1)disconnect
默認策略,沒有自動恢復,簡單的斷開連接。
2)discard-younger-primary
在split brain發生前從主節點自動同步。
3)discard-older-primary
在split brain發生時從變成primary的節點同步數據。
4)discard-least-changes
在split brain發生時從塊最多的節點同步數據。
5)discard-node-NODENAME
自動同步到名字節點
2 after-sb-1pri
當兩個節點的狀態只有一個是primary時,可以通過after-sb-1pri策略自動恢復。
1)disconnect
默認策略,沒有自動恢復,簡單的斷開連接。
2)consensus
丟棄secondary或者簡單的斷開連接。
3)discard-secondary
丟棄secondary數據。
4)call-pri-lost-after-sb
按照after-sb-0pri的策略執行。
3 after-sb-2pri
當兩個節點的狀態都是primary時,可以通過after-sb-2pri策略自動恢復。
1)disconnect
默認策略,沒有自動恢復,簡單的斷開連接。
2)violently-as0p
按照after-sb-0pri的策略執行。
3)call-pri-lost-after-sb
按照after-sb-0pri的策略執行,並丟棄其他節點。
4 配置自動恢復
編輯/etc/drbd.conf,找到resource r0部分,配置策略如下,所有節點完全一致。
#after-sb-0pri disconnect;
after-sb-0pri discard-younger-primary;
#after-sb-1pri disconnect;
after-sb-1pri discard-secondary;
#after-sb-2pri disconnect;
after-sb-2pri call-pri-lost-after-sb;
