hadoop分析之四:關於hadoop namenode的雙機熱備份方案

參考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進程了(server01server02同時啓用):

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
<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


發佈了117 篇原創文章 · 獲贊 24 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章