当前位置:   article > 正文

hadoop分析之四:关于hadoop namenode的双机热备份方案

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.140server1

10.10.140.117server2

10.10.140.84server3

10.10.140.200servervip

10.0.0.201server1

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

drbd220056 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的监听端口,用于与另一台主机通信

address10.10.140.140:7788;

flexible-meta-disk internal;

}

on server3 {

device/dev/drbd0;

disk/dev/sda4;

address10.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个主机上的空白分区上创建相应的元数据保存的数据块:

常见之前现将两块空白分区彻底清除数据

分别在两个主机上执行

#ddif=/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

  1. <property>
  2. <name>hadoop.tmp.dir</name>
  3. <value>/home/share/hadoopdata/</value>
  4. <description>A base for other temporary directories.</description>
  5. </property>
  6. <property>
  7. <name>fs.default.name</name>
  8. <value>hdfs://servervip:9000</value>
  9. <description>The name of the default file system. A URI whose
  10. schemeand authority determine the FileSystem implementation. The
  11. uri'sscheme determines the config property (fs.SCHEME.impl) naming
  12. theFileSystem implementation class. Theuri's authority is used to
  13. determine the host, port, etc. for a filesystem.</description>
  14. </property
  15. <property>
  16. <name>fs.checkpoint.dir</name>
  17. <value>${hadoop.tmp.dir}/dfs/namesecondary</value>
  18. <description>Determines where on the local filesystem the DFSsecondary
  19. namenode should store the temporary images to merge.
  20. Ifthis is a comma-delimited list of directories then the image is
  21. replicated in all of the directories for redundancy.
  22. </description>
  23. </property
  24. <property>
  25. <name>fs.checkpoint.edits.dir</name>
  26. <value>${fs.checkpoint.dir}</value>
  27. <description>Determines where on the local filesystem the DFSsecondary
  28. namenode should store the temporary edits to merge.
  29. Ifthis is a comma-delimited list of directoires then teh edits is
  30. replicated in all of the directoires for redundancy.
  31. Default value is same as fs.checkpoint.dir
  32. </description>
  33. </property>

hdfs-site.xml

  1. <property>
  2. <name>dfs.name.dir</name>
  3. <value>${hadoop.tmp.dir}/dfs/name</value>
  4. <description>Determines where on the local filesystem the DFS
  5. namenode should store the name table(fsimage). If this is a
  6. comma-delimitedlist of directories then the name table is
  7. replicated in all of the directories, for
  8. redundancy.</description>
  9. </property>
  10. <property>
  11. <name>dfs.name.edits.dir</name>
  12. <value>${dfs.name.dir}</value>
  13. <description>Determines where on the local filesystem the DFS
  14. namenode should store the transaction (edits) file. If this is
  15. acomma-delimited list of directories then the transaction file
  16. isreplicated in all of the directories, for redundancy.
  17. Default value is same as dfs.name.dir</description>
  18. </property>

mapred-site.xml

  1. <property>
  2. <name>mapred.job.tracker</name>
  3. <value>servervip:9001</value>
  4. <description>The host and port that the MapReduce job tracker runs
  5. at. If "local", then jobs are run in-processas a single map
  6. andreduce task.
  7. </description>
  8. </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上传文件

创建一个目录并上传一个测试文件,

[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


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/276851
推荐阅读
相关标签
  

闽ICP备14008679号