參考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
slaves
server2
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<propert y> <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 redundanc y.</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 sto re the transaction (edits) file. If this is acomma-delimited list of directories then the transaction file isreplicated in all of the directories, for redu ndancy. 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.dvi hadoop-hdfs#!/bin/shcase "$1" instart)# Start commands go herecd /home/hadoop-0.20.2/binmsg=` su - root -c "sh/home/hadoop-0.20.2/bin/start-dfs.sh"`logger $msg;; stop)# Stop commands go herecd /home/hadoop-0.20.2/binmsg=`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上傳檔
創建一個目錄並上傳一個測試檔案,
[root@server1hadoop-0.20.2]# 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