Skip to content

天楚锐齿

人工智能 云计算 大数据 物联网 IT 通信 嵌入式

天楚锐齿

  • 下载
  • 物联网
  • 云计算
  • 大数据
  • 人工智能
  • Linux&Android
  • 网络
  • 通信
  • 嵌入式
  • 杂七杂八

使用heartbeat、PaceMaker、drbd实现hadoop的namenode热备份HA

2018-03-13

使用heartbeat、PaceMaker、drbd实现hadoop的namenode热备份HA

hadoop namenode主节点的HA实现:
缺点:无法做到完全无缝切换,切换过程中有一小段时间没法提供服务,不超过30秒,还可以改的更短。
环境:
# vi /etc/hosts
10.24.1.47      nd7-rack2-cloud
10.24.1.48      nd8-rack2-cloud
10.24.1.49      nd9-rack2-cloud
10.24.1.7       nd-rack2-cloud
其中10.24.1.47和10.24.1.48为hadoop主节点的两台HA机器,运行着namenode, secondarynamenode, jobtracker进程;10.24.1.7为他们的共同虚拟ip,为从节点和client节点提供服务;10.24.149为从节点,运行这datanode跟tasktracker进程。
运行Hadoop的用户名为hha,路径为/home/hha/hadoop。
1. 先安装好hadoop,此处略;接着安装好heartbeat和PaceMaker,此处略。配置:
# vi …/hadoop/conf/core-site.xml
注意这些配置文件里面的nd-rack2-cloud为HA节点的VIP。
…
<property>
<name>fs.default.name</name>
<value>hdfs://nd-rack2-cloud:9000</value>
</property>
<property>
…
 
# vi hdfs-site.xml
注意/mnt/drbd_sim为drbd所管理的分区,当然还可以在别的分区备份(这里是/data1/hha/hdfs/)。
…
<property>
<name>dfs.name.dir</name>
<value>/data1/hha/hdfs/name,/mnt/drbd_sim/hdfs/name</value>
</property>

<property>
<name>fs.checkpoint.dir</name>
<value>/data1/hha/hdfs/namesecondary,/mnt/drbd_sim/hdfs/namesecondary</value>
  <description>Determines where on the local filesystem the DFS secondary
name node should store the temporary images to merge.
If this is a comma-delimited list of directories then the image is
replicated in all of the directories for redundancy.
</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data0/hha/hdfs/data</value>
</property>
…
# vi mapred-site.xml
…
<property>
<name>mapred.local.dir</name>
<value>/mnt/drbd_sim/mapreduce</value>
</property>
…
# vi /etc/ha.d/ha.cf
debugfile /var/log/ha-debug
crm respawn
logfile /var/log/ha-log
logfacility     local0
keepalive 2
deadtime 30
warntime 10
initdead 120
mcast bond0 225.0.0.1 694 1 0
auto_failback on
node    nd7-rack2-cloud
node    nd8-rack2-cloud
# vi /etc/ha.d/authkeys
auth 1
1 crc
# crm configure edit

node $id=”38a09183-9fc0-4ca6-8f81-349d94930261″ nd8-rack2-cloud \
attributes standby=”off”
node $id=”560cc9af-2fd7-4af3-ab51-d221f95d80f8″ nd7-rack2-cloud \
attributes standby=”off”
primitive drbd lsb:hadoop_name_dir_copy \
        op monitor interval=”10s”
primitive failover-ip ocf:heartbeat:IPaddr \
        params ip=”10.24.1.7″ nic=”bond0″ cidr_netmask=”255.255.255.0″ \
        op monitor interval=”10s”
primitive hadoop_jobtracker lsb:hadoop_jobtracker \
        op monitor interval=”10s”
primitive hadoop_namenode lsb:hadoop_namenode \
        op monitor interval=”10s”
primitive hadoop_secondarynamenode lsb:hadoop_secondarynamenode \
        op monitor interval=”10s”
primitive ping ocf:pacemaker:ping \
        params host_list=”10.24.1.1″ multiplier=”100″ \
        op monitor interval=”15s” timeout=”60s” \
        op start interval=”0″ timeout=”90s” \
        op stop interval=”0″ timeout=”100s”
group hadoop failover-ip drbd hadoop_namenode hadoop_secondarynamenode hadoop_jobtracker
clone clone_ping ping \
        meta globally-unique=”false”
location location_hadoop hadoop \
        rule $id=”location_hadoop-rule” -inf: not_defined pingd or pingd lte 0
location location_hadoop_prior hadoop 100: nd7-rack2-cloud
property $id=”cib-bootstrap-options” \
dc-version=”1.1.5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f” \
cluster-infrastructure=”Heartbeat” \
no-quorum-policy=”ignore” \
start-failure-is-fatal=”false” \
stonith-enabled=”false”
rsc_defaults $id=”rsc-options” \

        resource-stickiness=”100″ 

2. 实现三个hadoop进程及一个拷贝数据的服务型LSB脚本,这些脚本还不通用,换一个系统则都需要修改:
# ll /etc/init.d/
…
hadoop_jobtracker
hadoop_namenode
hadoop_secondarynamenode
hadoop_name_dir_copy
…

# chmod +x /etc/init.d/hadoop_*
# vi hadoop_name_dir_copy
#!/bin/bash
######################################################################
RETVAL=0
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
######################################################################
# See how we were called.
case “$1” in
start)
su – root -c “/sbin/drbdadm primary all”
su – root -c “mount /dev/drbd0 /mnt/drbd_sim”
su – root -c “sleep 1”
su – root -c “nohup /sbin/drbd_connect.sh >/dev/null 2>&1 &”
su – root -c “chmod -R 777 /mnt/drbd_sim/”
su – hha -c “mkdir -p /data1/hha/hdfs/name”
su – hha -c “\cp -rf /mnt/drbd_sim/* /data1/hha/hdfs/name/”
echo $'”Start” command: [OK]!’
RETVAL=0
;;
stop)
su – root -c “sleep 2”
su – root -c “umount /mnt/drbd_sim”
su – root -c “sleep 1”
su – root -c “/sbin/drbdadm disconnect all”
su – root -c “/sbin/drbdadm secondary all”
su – root -c “/sbin/drbdadm — –discard-my-data connect all”
### “drbdadm connect all”  until “drbdadm cstate all” return Connected
su – root -c “nohup /sbin/drbd_connect.sh >/dev/null 2>&1 &”
echo $'”Stop” command: [OK]!’
RETVAL=0
;;
reload)
echo $'”reload” command is not supported!’
RETVAL=0
;;
restart)
echo $'”restart” command is not supported!’
RETVAL=0
;;
status)
echo $'”status” command is not supported!’
RETVAL=0
;;
*)
echo $”Usage: $0 {start|stop|restart|reload|status|help}”
exit 1
esac
exit $RETVAL
######################################################################
# vi hadoop_namenode
#!/bin/bash
######################################################################
RETVAL=0
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
######################################################################
# See how we were called.
case “$1” in
start)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh start namenode”
echo $'”Start” command: [OK]!’
RETVAL=0
;;
stop)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh stop namenode”
echo $'”Stop” command: [OK]!’
RETVAL=0
;;
reload)
echo $'”reload” command is not supported!’
RETVAL=0
;;
restart)
echo $'”restart” command is not supported!’
RETVAL=0
;;
status)
echo $'”status” command is not supported!’
RETVAL=0
;;
*)
echo $”Usage: $0 {start|stop|restart|reload|status|help}”
exit 1
esac
exit $RETVAL
######################################################################
# vi hadoop_secondarynamenode
#!/bin/bash
######################################################################
RETVAL=0
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
######################################################################
# See how we were called.
case “$1” in
start)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh start secondarynamenode”
echo $'”Start” command: [OK]!’
RETVAL=0
;;
stop)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh stop secondarynamenode”
echo $'”Stop” command: [OK]!’
RETVAL=0
;;
reload)
echo $'”reload” command is not supported!’
RETVAL=0
;;
restart)
echo $'”restart” command is not supported!’
RETVAL=0
;;
status)
echo $'”status” command is not supported!’
RETVAL=0
;;
*)
echo $”Usage: $0 {start|stop|restart|reload|status|help}”
exit 1
esac
exit $RETVAL
######################################################################
#vi hadoop_jobtracker
#!/bin/bash
######################################################################
RETVAL=0
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network
######################################################################
# See how we were called.
case “$1” in
start)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh start jobtracker”
echo $'”Start” command: [OK]!’
RETVAL=0
;;
stop)
su – hha -c “/home/hha/hadoop/bin/hadoop-daemon.sh stop jobtracker”
echo $'”Stop” command: [OK]!’
RETVAL=0
;;
reload)
echo $'”reload” command is not supported!’
RETVAL=0
;;
restart)
echo $'”restart” command is not supported!’
RETVAL=0
;;
status)
echo $'”status” command is not supported!’
RETVAL=0
;;
*)
echo $”Usage: $0 {start|stop|restart|reload|status|help}”
exit 1
esac
exit $RETVAL
######################################################################
3. 实现两个检查状态的脚本,这些脚本还不通用,换一个系统则都需要修改:
# ll /sbin/*.sh
drbd_connect.sh
heartbeat_rc_local.sh
# vi drbd_connect.sh
#!/bin/env bash
# nohup /sbin/drbd_connect.sh >/dev/null 2>&1 &
while [ 1 ] ;
do
cstate=`/sbin/drbdadm cstate all`
if [ “$cstate” != “Connected” ] ;
then
/sbin/drbdadm connect all
else
exit 0
fi
sleep 3
done
# vi heartbeat_rc_local.sh
#!/bin/env bash
# add the following line to “rc.local” file:
# nohup /sbin/heartbeat_rc_local.sh 10.24.1.1 >/dev/null 2>&1 &
while [ 1 ] ;
do
pingRtn=`/bin/ping $1 -c 3 -q | grep “packet loss” | awk ‘{ print $6}’`
if [ “$pingRtn” = “100%” -o “$pingRtn” = “+3” -o “$pingRtn” = “” ] ;
then
service heartbeat stop
else
service heartbeat start
fi
sleep 10
done
修改/etc/rc.local,加入以下内容,防止heartbeat进入裂脑状态,只有最后一行是必须的,前面几行在模拟磁盘时需要用,用真正分区时不需要:

dd if=/dev/zero of=drbd_sim bs=4k count=5000
losetup /dev/loop0 drbd_sim
mkfs.ext3 -F /dev/loop0
drbdadm detach  r0
dd if=/dev/zero of=/dev/loop0
drbdadm create-md r0

drbdadm attach  r0
nohup /sbin/heartbeat_rc_local.sh 10.24.1.1 >/dev/null 2>&1 &
4. 配置分区实时同步工具DRBD:
安装,这个drbd跟内核关系密切,最好用yum install安装,或拷贝相应内核的rpm包安装(如:drbd-8.0.16-5.el5.centos.x86_64.rpm和kmod-drbd-8.0.16-5.el5_3.x86_64.rpm):
# yum install kmod-drbd

模拟出分区,实际中需要用真正的分区来代替,否则重启就没有了:
# dd if=/dev/zero of=drbd_sim bs=4k count=5000
# losetup /dev/loop0 drbd_sim
# mkfs.ext3 -F /dev/loop0
# mkdir /mnt/drbd_sim
# mount -t ext3 /dev/loop0 /mnt/drbd_sim
# umount /mnt/drbd_sim

配置drbd,这里为8.0.16的方式,以后版本的配置文件应该会有变化:

# cp /usr/share/doc/drbd-8.0.16/drbd.conf  /etc/
# vi /etc/drbd.conf
…
resource r0 {
protocol  C;
  startup { wfc-timeout 3; degr-wfc-timeout 3; }
on nd7-rack2-cloud {
device    /dev/drbd0;
disk      /dev/loop0;
meta-disk internal;
address   10.24.1.47:7789;
}
on nd8-rack2-cloud {
device    /dev/drbd0;
disk      /dev/loop0;
meta-disk internal;
address   10.24.1.48:7789;
}
}
两边执行:
# dd if=/dev/zero of=/dev/loop0
# drbdadm create-md r0
# service drbd start
在某一台上执行:
# drbdsetup /dev/drbd0 primary -o
# cat /proc/drbd
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
ns:19960 nr:0 dw:0 dr:19960 al:0 bm:2 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:1246 misses:2 starving:0 dirty:0 changed:2
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
# mkfs.ext3 -F /dev/drbd0
# mount -t ext3 /dev/drbd0 /mnt/drbd_sim
每做一次切换,都必须执行drbdadm primary all,否则可能双方都会是secondary。
第一次同步的过程很慢,只有350KB/s,而且整个盘需要同步一次,时间会很漫长。
===========================================>>
原来打算用NFS,测试发现行不通:一方断网,另外一方hadoop启动不了。
一方配置:
# mkdir /data-nfs
# chmod 777 /data-nfs
# vi /etc/exports
/data-nfs PeerIP(rw,ync,no_root_squash,anonuid=65534,anongid=65534)
# service nfs start
另一方配置:
# mkdir /mnt/hdfs-nfs
# mount -t nfs -o hard,intr,bg,timeo=50 PeerIP:/data-nfs /mnt/hdfs-nfs
# vi /etc/fstab
PeerIP:/data-nfs    /mnt/hdfs-nfs           nfs     hard,intr,bg,timeo=50  0 0
然后交换过来配置。
<<=============================================

5. 启动:
Master主机:
# service heartbeat start
# su – hha -c “/home/hha/hadoop/bin/start-all.sh”
必须先启动heartbeat(就同时启动了namenode/secondarynamenode/jobtracker),然后再运行start-all.sh,把别的datanode/tasktracker之类的启动。
另一台备份主机:
# service heartbeat start
两台机器启动需要一点时间,估计不超过2分钟。

6. 检查:
Master主机:
# cat /proc/drbd
看到处于连接状态Connected,自己是Primary方,对方是Secondary方,数据处于更新状态UpToDate。
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:26:57
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
ns:122 nr:0 dw:28942 dr:212787 al:5 bm:99 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/257 hits:8807 misses:5 starving:0 dirty:0 changed:5
# df -h
含有/dev/drbd0所mount上来的分区/mnt/drbd_sim。
/dev/drbd0             19M  5.5M   13M  31% /mnt/drbd_sim
# ll /mnt/drbd_sim
分区里面已经保存有内容。
hdfs
mapreduce

# ifconfig

多了一个VIP:10.24.1.7。
bond0:0   Link encap:Ethernet  HWaddr 00:22:19:5D:48:3D
inet addr:10.24.1.7  Bcast:10.24.1.255  Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
# jps
可以看到hadoop的三个进程都已经启动正常,可以从hadoop web界面检查一下。
25279 NameNode
25403 SecondaryNameNode
28125 Jps
25635 JobTracker
# crm status
看到双方都在线online,服务组hadoop启动在nd8-rack2-cloud上,注意到顺序,启动时按顺序启动,停止时反过来的顺序停止;服务器ping启动在双方上。
============
Last updated: Fri Nov 11 09:18:54 2011
Stack: Heartbeat
Current DC: nd8-rack2-cloud (38a09183-9fc0-4ca6-8f81-349d94930261) – partition with quorum
Version: 1.1.5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, unknown expected votes
2 Resources configured.
============

Online: [ nd8-rack2-cloud nd7-rack2-cloud ]

Resource Group: hadoop
failover-ip        (ocf::heartbeat:IPaddr):        Started nd8-rack2-cloud
drbd       (lsb:hadoop_name_dir_copy):     Started nd8-rack2-cloud
hadoop_namenode    (lsb:hadoop_namenode):  Started nd8-rack2-cloud
hadoop_secondarynamenode   (lsb:hadoop_secondarynamenode): Started nd8-rack2-cloud
hadoop_jobtracker  (lsb:hadoop_jobtracker):        Started nd8-rack2-cloud
Clone Set: clone_ping [ping]
Started: [ nd7-rack2-cloud nd8-rack2-cloud ]

从主机:
# cat /proc/drbd
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by mockbuild@v20z-x86-64.home.local, 2009-08-22 13:26:57
0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r—
ns:0 nr:177 dw:45003 dr:111904 al:5 bm:105 lo:0 pe:0 ua:0 ap:0
resync: used:0/61 hits:0 misses:0 starving:0 dirty:0 changed:0
act_log: used:0/127 hits:9363 misses:5 starving:0 dirty:0 changed:5
# df -h
…没有/dev/drbd0分区
# ll /mnt/drbd_sim
没有内容
# ifconfig
… 没有bond0:x
# jps
没有hadoop的任何进程。
# crm status
显示跟Master主机一致。
7. 切换:
手工命令切换:
Master主机:
# crm node standby                        把自己变成standby状态,触发切换,对方变成主节点
# crm node online                          把自己变成online状态,不会切换 ,对方还是主节点。
从主机不用操作。
该过程很快,原Master变成了slave,原slave变成了master。
断网络服务切换:
Master主机:
# service network stop && sleep 150 && service network start
触发切换在30秒,原slave变成了master,等网络起来后,原Master变成了slave。
拔网线切换:
直接拔掉Master主机的网线,可以看到切换成功。
触发切换在30秒,原slave变成了master,等网线插回去后,原Master变成了slave。
重启切换:
Master主机:
# reboot
触发切换在30秒,原slave变成了master,等机器启动完毕,原Master变成了slave。
断电切换:
直接拔掉Master主机的电源(不是按服务器电源开关),可以看到切换成功。
触发切换在30秒,原slave变成了master,等插上电源,机器启动完毕,原Master变成了slave。
877次阅读

Post navigation

前一篇:

JBoss漏洞导致服务器中毒

后一篇:

安装KVM虚拟机

发表评论 取消回复

邮箱地址不会被公开。 必填项已用*标注

个人介绍

需要么,有事情这里找联系方式:关于天楚锐齿

=== 美女同欣赏,好酒共品尝 ===

微信扫描二维码赞赏该文章:

扫描二维码分享该文章:

分类目录

  • Linux&Android (79)
  • Uncategorized (1)
  • 下载 (28)
  • 云计算 (37)
  • 人工智能 (8)
  • 大数据 (24)
  • 嵌入式 (34)
  • 杂七杂八 (34)
  • 物联网 (59)
  • 网络 (23)
  • 通信 (21)

文章归档

近期文章

  • 使用Python渲染OpenGL的.obj和.mtl文件
  • 用LVGL图形库绘制二维码
  • Android使用Messenger和SharedMemory实现跨app的海量数据传输
  • CAN信号的c语言解析代码
  • QT qml下DBus的使用例子

近期评论

  • 硕发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • maxshu发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • Ambition发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • Ambition发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • maxshu发表在《Android9下用ethernet 的Tether模式来做路由器功能》

阅读量

  • 使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序 - 16,955次阅读
  • 卸载深信服Ingress、SecurityDesktop客户端 - 12,119次阅读
  • 车机技术之Android Automotive - 6,673次阅读
  • 车机技术之车规级Linux-Automotive Grade Linux(AGL) - 5,901次阅读
  • Linux策略路由及iptables mangle、ip rule、ip route关系及一种Network is unreachable错误 - 5,727次阅读
  • 在Android9下用ndk编译vSomeIP和CommonAPI以及使用例子 - 5,681次阅读
  • linux下的unbound DNS服务器设置详解 - 5,621次阅读
  • linux的tee命令导致ssh客户端下的shell卡住不动 - 5,041次阅读
  • 车机技术之360°全景影像(环视)系统 - 4,914次阅读
  • libwebp(处理webp图像)的安装和使用 - 4,764次阅读

功能

  • 文章RSS
  • 评论RSS

联系方式

地址
深圳市科技园

时间
周一至周五:  9:00~12:00,14:00~18:00
周六和周日:10:00~12:00

标签

android AT命令 centos Hadoop hdfs ip ipv6 kickstart linux mapreduce mini6410 modem OAuth openstack os python socket ssh uboot 内核 协议 安装 嵌入式 性能 报表 授权 操作系统 数据 数据库 月报 模型 汽车 测试 深信服 深度学习 源代码 神经网络 统计 编译 网络 脚本 虚拟机 调制解调器 车机 金融
© 2023 天楚锐齿