Hadoop HDFS系统双机热备方案 1. 前言
HDFS包含两种角色:数据节点(datanode)和名字节点(namenode),名字节点只有一个,数据节点最多支持2000个。HDFS可以确保在硬件失效情况下数据存储的可靠性。常见的三种失败:名字节点失效, 数据节点失效和网络分割(network partitions)。
HDFS将每个文件存储成block序列,除了最后一个block,所有的block都是同样的大小。文件的所有block为了容错都会被复制。每个文件的block大小和replication因子都是可配置的。Replication因子可以在文件创建的时候配置,以后也可以改变。
每个Datanode节点都向Namenode周期性地发送心跳包。网络切割可能导致一部分Datanode跟Namenode失去联系。 Namenode通过心跳包的缺失检测到这一情况,并将这些Datanode标记为dead,不会将新的IO请求发给它们。Datanode的死亡可能引起一些block的副本数目低于指定值,Namenode不断地跟踪需要复制的 block,在任何需要的情况下启动复制。
因此在HDFS中通过复制可以确保数据节点的高可用性,名字节点的高可用性一般通过HA方式实现:
方案1 drbd+heartbeat
采用drbd实现共享存储,采用heartbeat实现心跳监控,所有服务器都配有双网卡,其中一个网卡专门用于建立心跳网络连接。
方案2磁盘阵列或SAN+ heartbeat
名字节点负责整个文件系统目录结构、文档权限和文档的扩展属性连同维护整个文档系统的数据一致性和响应客户端的请求。HDFS能够配置两个名字节点服务器,采用active/passive模式,两个服务器采用共享存储的方式来存放元数据。当某个名字节点出现故障后,备份服务器能够接管其服务,确保系统的正常运行。
以下我们通过DRBD和heartbeat实现了名字节点的高可用。
2. 基本配置
2.1. 硬件环境
测试环境为2节点,2台机器操作系统均为Red Hat Enterprise Linux AS4 UP2,2.6.9-22.EL。两台主机的eth1使用双机对联线直接连接。每台主机预留30G的raw空间作为共用空间被HA使用。
DRBD实现了网络RAID-1功能,即两台服务器一台是主节点,提供存储服务,一台是从节点。在主节点上的任何操作,都会被同步到从节点的相应磁盘分区上,达到数据备份的效果。当主节点发生故障时,通过heartbeat从节点可以接管主节点的虚拟IP。 主机 ost2(主节点) IP地址 eth0: 192.168.188.202 eth1: 10.0.0.202 (HA心跳使配置 容量:80G 接口标准:IDE 用地址) eth0:0: 192.168.188.201(虚拟IP) ost3(从节点) eth0: 192.168.188.203 eth1: 10.0.0.203 (HA心跳使用地址) eth0:0: 192.168.188.201(虚拟IP) 转速:7200rpm 缓存容量:2M 平均寻道时间:9ms 传输标准:ATA 133 容量:80G 接口标准:IDE 转速:7200rpm 缓存容量:2M 平均寻道时间:9ms 传输标准:ATA 133 2.2. 网络配置
1 修改/etc/hosts vi /etc/hosts
1)ost2的hosts内容如下:
127.0.0.1 localhost.localdomain localhost 192.168.188.201 ostvip 192.168.188.203 ost3 192.168.188.202 ost2 192.168.188.204 ost4 10.0.0.202 ost2 10.0.0.203 ost3 192.168.188.205 ost5
2)ost3的hosts内容如下:
127.0.0.1 localhost.localdomain localhost 192.168.188.201 ostvip 192.168.188.203 ost3 192.168.188.202 ost2 192.168.188.204 ost4 10.0.0.202 ost2 10.0.0.203 ost3
2 其他配置文件
1)ost2的hosts内容如下:
cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes
BOOTPROTO=none
IPADDR=192.168.188.202 NETMASK=255.255.255.0 GATEWAY=192.168.188.253 TYPE=Ethernet
cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes
BOOTPROTO=none IPADDR=10.0.0.202
NETMASK=255.255.255.0 USERCTL=no PEERDNS=yes TYPE=Ethernet IPV6INIT=no
2)ost3的hosts内容如下:
cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.188.203 NETMASK=255.255.255.0 GATEWAY=192.168.188.253
cat /etc/sysconfig/network-scripts/ifcfg-eth1 DEVICE=eth1 ONBOOT=yes
BOOTPROTO=static IPADDR=10.0.0.203
NETMASK=255.255.255.0
配置完成后,试试在各自主机上ping对方的主机名,应该可以ping通。
3 修改主机名
vi /etc/sysconfig/network 1)ost2的hosts内容如下: NETWORKING=yes HOSTNAME=ost2
2)ost3的hosts内容如下: NETWORKING=yes HOSTNAME=ost3
2.3. 关闭selinux(所有机器)
SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。Lustre存储服务器和元数据目录服务器通信会使用一些特殊端口,最好关闭SELINUX。
编辑文件/etc/sysconfig/selinux,设置: SELINUX=disabled 然后reboot
2.4. 关闭防火墙(所有机器)
如果系统启动了Iptables服务,需要为相关服务打开端口 (988, 1021 ~ 1023等),简单的处理是关闭防火墙。
#清除规则 iptables –F #保存
service iptables save
chkconfig --level 2345 iptables off service iptables stop
3. heartbeat部署
3.1. 安装HA 与HA依赖包
rpm -Uvh perl-TimeDate-1.16-1.2.el4.rf.noarch.rpm rpm -Uvh libnet-1.1.2.1-2.1.i386.rpm rpm -Uvh heartbeat-pils-2.1.4-2.1.i386.rpm rpm -Uvh heartbeat-stonith-2.1.4-2.1.i386.rpm rpm -Uvh heartbeat-2.1.4-2.1.i386.rpm
3.2. 配置/etc/ha.d/ha.cf
配置heartbeat守护进程使用交叉网络发送和接收心跳数据包。
1、 使用下面的命令查找Heartbeat RPM包安装后释放的ha.cf样本配置文件: rpm -qd heartbeat | grep ha.cf
2、 使用下面的命令将样本配置文件复制到适当的位置: cp /usr/share/doc/packages/heartbeat/ha.cf /etc/ha.d/
3、 编辑/etc/ha.d/ha.cf文件,取消注释符号或增加以下内容: udpport 694
#采用ucast方式,使用网卡eth1在主服务器和备用服务器之间发送心跳消息。指定对端ip,即在ost2上指定10.0.0.203,在ost3上指定10.0.0.202
ucast eth1 10.0.0.203
4、 同时,取消keepalive,deadtime和initdead这三行的注释符号: keepalive 2 deadtime 30 initdead 120