參考Hadoop_HDFS系統雙機熱備方案.pdf,試驗後有所增減
關於hadoopnamenode的雙機熱備份方案
1、 前言
目前hadoop-0.20.2沒有提供name node的備份,只是提供了一個secondary node,儘管它在一定程度上能夠保證對name node的備份,但當name node所在的機器出現故障時,secondary node不能提供實時的進行切換,並且可能出現數據丟失的可能性。
我們採用drbd + heartbeat方案實現name node的HA。
採用drbd實現共享存儲,採用heartbeat實現心跳監控,所有服務器都配有雙網卡,其中一個網卡專門用於建立心跳網絡連接。
2、 基本配置
2.1、硬件環境
採用VMWare的虛擬機作爲測試機,一共三臺,其中兩臺分別提供2個網卡(其中一個用作網絡通訊,一個爲heartbeat的心跳),和一個空白的大小相同的分區(供drbd使用)。軟件環境:RedHat Linux AS 5,hadoop-0.20.2, 大體情況如下圖:
主機 |
IP地址 |
分區 |
server1(name node) |
eth0:10.10.140.140 eth1:10.0.0.201(heartbeat心跳使用此ip) eth0:0:10.10.140.200(虛擬IP) |
/dev/drbd0 Mounted on /home/share |
server2(data node) |
eth0:10.10.140.117 |
|
server3(備份 name node) |
eth0:10.10.140.84 eth1:10.0.0.203(heartbeat心跳使用此ip) eth0:0:10.10.140.200(虛擬IP) |
dev/drbd0 Mounted on /home/share |
|
|
|
2.1、網絡配置
2.2.1、修改server1和server3的hosts(相同)文件
vi /etc/hosts
10.10.140.140 server1
10.10.140.117 server2
10.10.140.84 server3
10.10.140.200 servervip
10.0.0.201 server1
10.0.0.203 server3
2.2.2、server1和server3的網絡配置如下:
server1的網絡配置:
[root@server1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced MicroDevices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:0C:29:18:65:F5
ONBOOT=yes
IPADDR=10.10.140.140
NETMASK=255.255.254.0
GATEWAY=10.10.140.1
TYPE=Ethernet
[root@server1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth1
# Please read/usr/share/doc/initscripts-*/sysconfig.txt
# for thedocumentation of these parameters.
GATEWAY=10.0.0.1
TYPE=Ethernet
DEVICE=eth1
HWADDR=00:0c:29:18:65:ff
BOOTPROTO=none
NETMASK=255.255.255.0
IPADDR=10.0.0.201
ONBOOT=yes
USERCTL=no
IPV6INIT=no
PEERDNS=yes
Server3的網絡配置:
[root@server3 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced MicroDevices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:0C:29:D9:6A:53
ONBOOT=yes
IPADDR=10.10.140.84
NETMASK=255.255.254.0
GATEWAY=10.10.140.1
TYPE=Ethernet
[root@server3 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth1
# Please read/usr/share/doc/initscripts-*/sysconfig.txt
# for thedocumentation of these parameters.
GATEWAY=10.0.0.1
TYPE=Ethernet
DEVICE=eth1
HWADDR=00:0c:29:d9:6a:5d
BOOTPROTO=none
NETMASK=255.255.255.0
IPADDR=10.0.0.203
ONBOOT=yes
USERCTL=no
IPV6INIT=no
PEERDNS=yes
2.2.3、修改主機名
[root@server1 ~]#cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=server1
[root@server3 ~]#cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
HOSTNAME=server3
2.2.4、 關閉防火牆
[root@server1 ~]#chkconfig iptables off
[root@server3 ~]# chkconfig iptables off
3、 DRBD安裝與配置
3.1、DRBD的原理
DRBD(DistributedReplicated Block Device)是基於Linux系統下的塊複製分發設備。它可以實時的同步遠端主機和本地主機之間的數據,類似與Raid1的功能,我們可以將它看作爲網絡 Raid1。在服務器上部署使用DRBD,可以用它代替共享磁盤陣列的功能,因爲數據同時存在於本地和遠端的服務器上,當本地服務器出現故障時,可以使用遠端服務器上的數據繼續工作,如果要實現無間斷的服務,可以通過drbd結合另一個開源工具heartbeat,實現服務的無縫接管。DRBD的工作原理如下圖:
3.2、安裝
下載安裝包:wget http://oss.linbit.com/drbd/8.3/drbd-8.3.0.tar.gz,執行以下命令:
tar xvzf drbd-8.3.0.tar.gz
cd drbd-8.3.0
cd drbd
make clean all
cd ..
make tools
make install
make install-tools
驗證安裝是否正確:
# insmod drbd/drbd.ko 或者 # modprobe drbd
# lsmod | grep drbd
drbd 220056 2
顯示則安裝正確。主要在server1上和和server3上都要安裝
3.3、配置
3.3.1、DRBD使用的硬盤分區
server1和server3分區的大小,格式必須相同。並且必須都爲空白分區,可以在裝系統前預留分區,如果已經安裝好的系統,建議使用gparted工具進行分區。
使用方法可以參考:http://hi.baidu.com/migicq/blog/item/5e13f1c5c675ccb68226ac38.html
server1:ip地址爲10.10.140.140,drbd的分區爲:/dev/sda4
server3:ip地址爲10.10.140.84,drbd的分區爲:/dev/sda4
3.3.2、主要的配置文件
DRBD運行時,會讀取一個配置文件/etc/drbd.conf。這個文件裏描述了DRBD設備與硬盤分區的映射關係,和DRBD的一些配置參數。
[root@server1 ~]#vi /etc/drbd.conf
#是否參加DRBD使用者統計.默認是yes
global {
usage-count yes;
}
# 設置主備節點同步時的網絡速率最大值,單位是字節
common {
syncer { rate 10M; }
# 一個DRBD設備(即:/dev/drbdX),叫做一個"資源".裏面包含一個DRBD設備的主備#節點的相關信息。
resource r0 {
# 使用協議C.表示收到遠程主機的寫入確認後,則認爲寫入完成.
protocol C;
net {
# 設置主備機之間通信使用的信息算法.
cram-hmac-alg sha1;
shared-secret"FooFunFactory";
allow-two-primaries;
}
syncer {
rate 10M;
}
# 每個主機的說明以"on"開頭,後面是主機名.在後面的{}中爲這個主機的配置 on server1 {
device /dev/drbd0;
#使用的磁盤分區是/dev/sda4
disk /dev/sda4;
# 設置DRBD的監聽端口,用於與另一臺主機通信
address 10.10.140.140:7788;
flexible-meta-disk internal;
}
on server3 {
device /dev/drbd0;
disk /dev/sda4;
address 10.10.140.84:7788;
meta-disk internal;
}
}
3.3.3、將drbd.conf文件複製到備機上/etc目錄下
[root@server1 ~]#scp /etc/drbd.conf root@server3:/etc/
3.4、DRBD啓動
準備啓動之前,需要分別在2個主機上的空白分區上創建相應的元數據保存的數據塊:
常見之前現將兩塊空白分區徹底清除數據
分別在兩個主機上執行
#dd if=/dev/zero of=/dev/sdbX bs=1M count=128
否則下一步會出現
.........
Device size would be truncated,which
would corrupt data and result in
'access beyond end of device' errors.
You need to either
* use external meta data (recommended)
* shrink that filesystem first
* zero out the device (destroy thefilesystem)
Operation refused.
..........
分別在server1和server3上面執行
3.4.1、#drbdadmcreate-md r0 創建元數據
確保成功後,接下來就可以啓動drbd進程了(在server01和server02同時啓用):
3.4.2 在server1和server3上分別執行
[root@server01~]# /etc/init.d/drbd start 或servicedrbd start
StartingDRBD resources: [ d(r0) s(r0) n(r0) ].
3.4.3 設置主節點
在server1執行以下命令(第一次),設置server1爲主節點,以後可以用 drbdadmprimary db
#drbdsetup /dev/drbd0 primary –o
3.4.4 查看連接
在第一次啓動會同步磁盤的數據。
3.4.5 對空白磁盤進行格式化並mount到文件系統中
此操作只在primary節點上執行。
[root@server1 ~]# mkfs.ext2/dev/drbd0
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
655360 inodes, 1309232 blocks
65461 blocks (5.00%) reserved forthe super user
First data block=0
Maximum filesystemblocks=1342177280
40 block groups
32768 blocks per group, 32768fragments per group
16384 inodes per group
Superblock backups stored onblocks:
32768, 98304, 163840, 229376, 294912,819200, 884736
Writing inode tables: done
Creating journal (32768 blocks):done
Writing superblocks and filesystemaccounting information: done
This filesystem will beautomatically checked every 35 mounts or
180 days, whichever comesfirst. Use tune2fs -c or -i to override.
[root@server1 ~]# mount /dev/drbd0 /home/share
3.4.6 設置drbd開機時自動啓動
chkconfig--level 35 drbd on
3.5、DRBD測試
3.5.1 主備機手動切換
先卸載主機上drbd設備
[root@server1 ~]# umount /dev/drbd0
將server1降爲從節點
[root@server1 ~]# drbdadm secondary r0
查詢server1的狀態
把server3升級爲主節點
[root@server3 ~]# drbdadm primary r0
在server3上掛在到drbd設備上
[root@server3 ~]# mount /dev/drbd0 /home/share
查看server3的狀態
4、 Heartbeat的安裝與配置
4.1 Heartbeat的安裝
在server1和server3利用yum安裝heartbeat
[root@server1~]# yum install heartbeat
4.2 Heartbeat的配置
配置/etc/ha.d/ha.cf
1、使用下面的命令查找Heartbeat RPM包安裝後釋放的ha.cf樣本配置文件:
rpm -qd heartbeat | grepha.cf
2、使用下面的命令將樣本配置文件複製到適當的位置:
cp/usr/share/doc/packages/heartbeat/ha.cf /etc/ha.d/
3、編輯/etc/ha.d/ha.cf文件,取消註釋符號或增加以下內容:
udpport 694
#採用ucast方式,使用網卡eth1在主服務器和備用服務器之間發送心跳消息。指定對端ip,即在server1上指定10.0.0.203,在server3上指定10.0.0.201
ucast eth1 10.0.0.203
4、同時,取消keepalive,deadtime和initdead這三行的註釋符號:
keepalive 2
deadtime 30
initdead 120
initdead行指出heartbeat守護進程首次啓動後應該等待120秒後再啓動主服務器上的資源,keepalive行指出心跳消息之間應該間隔多少秒,deadtime行指出備用服務器在由於主服務器出故障而沒有收到心跳消息時,應該等待多長時間,Heartbeat可能會發送警告消息指出你設置了不正確的值(例如:你可能設置deadtime的值非常接近keepalive的值以確保一個安全配置)。
5、將下面兩行添加到/etc/ha.d/ha.cf文件的末尾:
node server1
node server3
這裏填寫主、備用服務器的名字(uname -n命令返回的值)
5、去掉以下注釋可以查看heartbeat的運行日誌,對錯誤分析有很大幫助
debugfile /var/log/ha-debug
logfile /var/log/ha-log
配置 /etc/ha.d/authkeys
1、使用下面的命令定位樣本authkeys文件,並將其複製到適當的位置: rpm -qd heartbeat | grep authkeys
cp/usr/share/doc/packages/heartbeat/authkeys /etc/ha.d
2、編輯/etc/ha.d/authkeys文件,取消下面兩行內容前的註釋符號:
auth1
1 crc
3、確保authkeys文件只能由root讀取:
chmod 600/etc/ha.d/authkeys
4.3 在備用服務器上安裝Heartbeat
把配置文件拷貝到備用服務器上
[root@server1 ~]# scp -r/etc/ha.d root@server3:/etc/ha.d
4.4 啓動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
5、 Hadoop主要配置文件的配置
提示:在啓動heartbeat前,應該先formatnamenode在drbd分區中產生元數據。
masters
servervip
slavesserver2
core-site.xml
<property>
<name>hadoop.tmp.dir</name>
<value>/home/share/hadoopdata/</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://servervip:9000</value>
<description>The name of the default file system. A URI whose
schemeand authority determine the FileSystem implementation. The
uri'sscheme determines the config property (fs.SCHEME.impl) naming
theFileSystem implementation class. Theuri's authority is used to
determine the host, port, etc. for a filesystem.</description>
</property
<property>
<name>fs.checkpoint.dir</name>
<value>${hadoop.tmp.dir}/dfs/namesecondary</value>
<description>Determines where on the local filesystem the DFSsecondary
namenode should store the temporary images to merge.
Ifthis is a comma-delimited list of directories then the image is
replicated in all of the directories for redundancy.
</description>
</property
<property>
<name>fs.checkpoint.edits.dir</name>
<value>${fs.checkpoint.dir}</value>
<description>Determines where on the local filesystem the DFSsecondary
namenode should store the temporary edits to merge.
Ifthis is a comma-delimited list of directoires then teh edits is
replicated in all of the directoires for redundancy.
Default value is same as fs.checkpoint.dir
</description>
</property>
hdfs-site.xml
<property>
<name>dfs.name.dir</name>
<value>${hadoop.tmp.dir}/dfs/name</value>
<description>Determines where on the local filesystem the DFS
namenode should store the name table(fsimage). If this is a
comma-delimitedlist of directories then the name table is
replicated in all of the directories, for
redundancy.</description>
</property>
<property>
<name>dfs.name.edits.dir</name>
<value>${dfs.name.dir}</value>
<description>Determines where on the local filesystem the DFS
namenode should store the transaction (edits) file. If this is
acomma-delimited list of directories then the transaction file
isreplicated in all of the directories, for redundancy.
Default value is same as dfs.name.dir</description>
</property>
mapred-site.xml
<property>
<name>mapred.job.tracker</name>
<value>servervip:9001</value>
<description>The host and port that the MapReduce job tracker runs
at. If "local", then jobs are run in-processas a single map
andreduce task.
</description>
</property>
6、 通過haresource配置自動切換
如果不使用heartbeat的情況下,DRBD只能手工切換主從關係,現在修改heartbeat的配置文件,使DRBD可以通過heartbeat自動切換。
6.1 創建資源腳本
1、新建腳本hadoop-hdfs,用於啓停hdfs文件系統,同理也可以建腳本hadoop-all,hadoop-jobtracker等資源文件,以hdfs爲例內容如下:
[root@server1 conf]# cat/etc/ha.d/resource.d/hadoop-hdfs
cd /etc/ha.d/resource.d
vi hadoop-hdfs
#!/bin/sh
case "$1" in
start)
# Start commands go here
cd /home/hadoop-0.20.2/bin
msg=`su - root -c "sh/home/hadoop-0.20.2/bin/start-dfs.sh"`
logger $msg
;;
stop)
# Stop commands go here
cd /home/hadoop-0.20.2/bin
msg=`su - root -c "sh/home/hadoop-0.20.2/bin/stop-dfs.sh"`
logger $msg
;;
status)
# Status commands go here
;;
2、修改權限
[root@server1 conf]# chmod755 /etc/ha.d/resource.d/hadoop-hdfs
3、 把腳本拷貝到備份機並同樣修改權限
[root@server1 conf]# scp/etc/ha.d/resource.d/hadoop-hdfs server3: /etc/ha.d/resource.d/
6.2 配置haresources
[root@server1 conf]# cat /etc/ha.d/haresources
server1 IPaddr::10.10.140.200 drbddisk::r0 Filesystem::/dev/drbd0::/home/share::ext2hadoop-hdfs
註釋:
Server1 主服務器名
10.10.140.200 對外服務IP別名
drbddisk::r0 資源drbddisk,參數爲r0
Filesystem::/dev/drbd0::/home/share::ext2資源Filesystem,mount設備/dev/drbd0到/home/share目錄,類型爲ext2
Hadoop-hdfs文件系統資源
7、 DRBD、heartbeat、hadoop聯調
7.1創建文件和目錄
1、在server1(主節點)上drbd和heartbeat運行着。由於heartbeat啓動後,虛擬地址10.10.140.200被分配到主節點上。用命令查看:
用命令cat /proc/drbd查看server1和server3是否通信正常,可以看到server1和server3分別爲主從節點。
查看drbd分區是否掛載
2、查看hadoop dfs是否啓動,打開:http://10.10.140.200:50070/dfshealth.jsp
3、向hadoop上傳文件
創建一個目錄並上傳一個測試文件,
[[email protected]]# bin/hadoop dfs -mkdir testdir
[root@server1 hadoop-0.20.2]# bin/hadoop dfs-copyFromLocal /home/share/temp2 testdir
查看文件:
7.2 主備機切換
1、在server1上停止heartbeat
[root@server1 /]# service heartbeat stop
Stopping High-Availabilityservices:
[ OK ]
2、可以查看虛擬IP已經切換到server3上了
3、驗證server3上查看hadoop文件系統
7.3 主備機再次切換
1、在server1上啓動heartbeat
[root@server1 /]# service heartbeatstart
Starting High-Availability services:
2012/07/25_15:03:31 INFO: Resource is stopped
[ OK ]
2、查看虛擬IP已經切換到server1上。
3、驗證server1上查看hadoop文件系統
8、 其他問題
8.1 split brain問題處理
split brain實際上是指在某種情況下,造成drbd的兩個節點斷開了連接,都以primary的身份來運行。當drbd某primary節點連接對方節點準備發送信息的時候如果發現對方也是primary狀態,那麼會會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日誌中記錄以下信息:“Split-Brain detected,droppingconnection!”當發生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在203查看cat/proc/drbd,203運行爲StandAlone狀態
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829build by root@ost3, 2008-12-30 17:16:32
0: cs:StandAlone ro:Secondary/Unknownds:UpToDate/DUnknown r---
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0ua:0 ap:0 ep:1 wo:b oos:664
3在202查看cat /proc/drbd,202運行爲StandAlone狀態
version: 8.3.0 (api:88/proto:86-89)
GIT-hash:9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost2, 2008-12-3017:23:44
0: cs:StandAlone ro:Primary/Unknownds:UpToDate/DUnknown r---
ns:0 nr:0 dw:4 dr:21 al:1 bm:0 lo:0pe:0 ua:0 ap:0 ep:1 wo:b oos:68
4 原因分析
由於節點重啓導致數據不一致,而配置文件中沒有配置自動修復錯誤的內容,因而導致握手失敗,數據無法同步。
split brain有兩種解決辦法:手動處理和自動處理。
手動處理
1 在203上停止heartbeat
Heartbeat會鎖定資源,只有停止後才能釋放
/etc/init.d/heartbeat stop
2 在作爲secondary的節點上放棄該資源的數據
在ost3上
/sbin/drbdadm -- --discard-my-dataconnect r0
3在作爲primary的節點重新連接secondary
在ost2上
/sbin/drbdadm disconnect r0
/sbin/drbdadm connect r0
把ost2設置爲主節點
/sbin/drbdadm primary r0
4在203上重新啓動heartbeat
/etc/init.d/heartbeat start
5 查看202狀態 cat /proc/drbd,顯示爲Connected,已經恢復了正常。
version: 8.3.0 (api:88/proto:86-89)
GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build byroot@ost2, 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:1wo:b oos:0
6查看203狀態 cat/proc/drbd,顯示爲Connected,已經恢復了正常。
version: 8.3.0 (api:88/proto:86-89)
GIT-hash:9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost3, 2008-12-3017:16:32
0: cs:Connected ro:Secondary/Primaryds:UpToDate/UpToDate C r---
ns:0 nr:768 dw:768 dr:0 al:0 bm:10 lo:0pe:0 ua:0 ap:0 ep:1 wo:b oos:0
自動處理
通過/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;
相
參考資料:Hadoop_HDFS系統雙機熱備方案.pdf
DRBD安裝配置(主從模式)--詳細步驟圖文並茂.doc