Hadoop HDFS 系统双机热备方案


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。 主机 IP 地址 配置 ost2(主节点) eth0: 192.168.188.202 eth1: 10.0.0.202 (HA 心跳使 容量:80G 接口标准:IDE www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 用地址) eth0:0: 192.168.188.201(虚拟 IP) 转速:7200rpm 缓存容量:2M 平均寻道时间:9ms 传输标准:ATA 133 ost3(从节点) eth0: 192.168.188.203 eth1: 10.0.0.203 (HA 心跳使 用地址) eth0:0: 192.168.188.201(虚拟 IP) 容量: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 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 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。 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 编辑文件/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 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 initdead 行指出 heartbeat 守护进程首次启动后应该等待 120 秒后再启动主服务器上的资 源,keepalive 行指出心跳消息之间应该间隔多少秒,deadtime 行指出备用服务器在由于主服 务器出故障而没有收到心跳消息时,应该等待多长时间,Heartbeat 可能会发送警告消息指 出你设置了不正确的值(例如:你可能设置 deadtime 的值非常接近 keepalive 的值以确保一 个安全配置)。 5、 将下面两行添加到/etc/ha.d/ha.cf 文件的末尾: node ost2 node ost3 这里填写主、备用服务器的名字(uname -n 命令返回的值)。 6 日志文件,没有就创建 logfile /var/log/ha-log 7 使用 Heartbeat 重新启动守护进程 你可以告诉 Heartbeat 它每次启动时启动一个守护进程,如果该守护进程停止运行时就启 动重新启动,要实现这样的功能,在/etc/ha.d/ha.cf 中使用下面这样一行: respawn userid /usr/bin/mydaemon 3.3. 配置/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 3.4. 配置/etc/ha.d/haresources haresources 的实际配置在 drbd 的配置中描述,这里只描述 haresources 的语法。 主服务器和备用服务器上的/etc/ha.d/haresources 文件必须相同。haresources 文件中的每 一行通常都包括下面的内容: 1)正常情况下运行资源的服务器的名字(主服务器),后面跟一个空格或一个 tab 键 2)一个(可选的)ip 别名,启动资源前,Heartbeat 应该将其添加到系统上,后面跟一 个空格。(ip 别名定义可能包括一个子网掩码和一个广播地址,使用斜线“/”字符分割) 3)存在于/etc/init.d 目录或/etc/ha.d/resource.d 目录的一个资源脚本(这个脚本用于启动 和停止资源),如果需要传递参数给资源脚本,在参数前面添加两个冒号即可,如果有多个 参数,参数之间也用两个冒号分隔。 4)其他的资源脚本可以使用空格字符作为分隔符进行添加。 注意:如果你需要创建一个比你屏幕长度还要长的 haresource 行,你可以使用反斜线“\” 指出下一行仍然是 haresources 条目。 这个语法简单地说就是一行有两个资源,每个资源有两个参数,如: primary-server [IPaddress] resource1[::arg1::arg2] [resource2[::arg1::arg2] www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 实际上,在一个叫做 primary.mydomain.com 的服务器上,运行有 sendmail 和 httpd,ip 地址是 209.100.100.3,那么就表示为: primary.mydomain.com 209.100.100.3 sendmail httpd 让我们更细致地检验 haresources 文件中的每一个元素。 3.4.1.主服务器名 在 haresources 行的开头输入的主服务器名应该与在/etc/ha.d/ha.cf 文件中指定的服务器 名匹配,同时也应该与在主服务器上运行 uname -n 命令返回的结果一致。 3.4.2.ip别名 尽管它不是必须的,但通常在 haresources 文件中还是指定了 ip 别名,这个 ip 别名可以 由主服务器提供也可以由备用服务器提供,依赖于谁的系统更健康,例如: primary.mydomain.com 209.100.100.3 Heartbeat 将添加 209.100.100.3 作为现有网卡的 ip 别名,并通过这个网卡发送 ARP 欺 骗广播,如果主服务器停机,只需要在备用服务器上添加。 实际上,当 Heartbeat 在 haresources 文件中看到一个 ip 地址时,它运行/etc/ha.d/resource.d 目录下叫做 IPaddr 的资源脚本,并传递需要的 ip 地址作为一个参数, /etc/ha.d/resource.d/IPaddr 脚本调用包括在 Heartbeat 包中的程序 findif(查找接口),传递 ip 别名给它,这个程序自动选择物理网卡基于内核的网络路由表添加 ip 别名,如果 findif 程序 不能定位添加 ip 别名的接口,它将在/var/log/messages 文件中记录类似下面的信息: heartbeat: ERROR: unable to find an interface for 200.100.100.3 3.4.3.资源 haresources 文件中的每一行可以包含一个或多个资源脚本名,资源之间使用空格隔开, 参数之间可以使用两个冒号隔开,例如:如果你需要 Heartbeat 发送一个专门的参数(假设 FIFLE1)到你的资源脚本(在单词 start,status,或 stop 前),你应该使用下面的语法: primary.mydomain.com myresource::FILE1 假设你在主服务器和备用服务器上的 haresources 文件中都添加了这一行,当它在主服 务器上第一次启动时,Heartbeat 将运行/etc/ha.d/resource.d/myresource FILE1 start,当主服务 器失效时将在备用服务器上再次运行,当资源需要“释放”或停止,Heartbeat 将使用命令/etc/ ha.d/resource.d/myresource FILE1 stop 运行脚本。 如果我们想联合我们的 iptakeover 脚本和 myresource 脚本和它的 FIFLE1 参数,我们应 该使用下面这一行: primary.mydomain.com iptakeover myresource::FILE1 要发送你的资源脚本几个参数的话,在同一行上脚本名后输入它们,每个参数用一对冒 号隔开,例如:要发送参数 FIFLE1,UNAME=JOIN 和 L3 给 myresource 脚本,你的 haresources 文件看起来应该象: primary.mydomain.com iptakeover myresource::FILE1::UNAME=JOHN::L3 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 3.5. 在备用服务器上安装Heartbeat 在主服务器上执行下面的命令复制所有配置文件到备用服务器上: scp -r /etc/ha.d ost3:/etc/ha.d scp 命令是安全复制命令,它使用 SSH 协议在两个节点之间复制数据,-r 选项指定 scp 复制主服务器上/etc/ha.d 目录下的所有文件和所有子目录。 3.6. 启动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 4. DRBD部署 4.1. 原理 DRBD(Distributed Replicated Block Device)是基于 Linux 系统下的块复制分发设备。 它可以实时的同步远端主机和本地主机之间的数据,类似与 Raid1 的功能,我们可以将它看 作为网络 Raid1。在服务器上部署使用 DRBD,可以用它代替共享磁盘阵列的功能,因为数 据同时存在于本地和远端的服务器上,当本地服务器出现故障时,可以使用远端服务器上的 数据继续工作,如果要实现无间断的服务,可以通过 drbd 结合另一个开源工具 heartbeat, 实现服务的无缝接管。DRBD 的工作原理如下图: www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 4.2. 编译linux内核 由于 2.4.9 缺少 CONNECTOR,导致 drbd 无法安装,因此必须编译内核。 1 下载内核 首先从 http://www.kernel.org/pub/linux/kernel/v2.6/下载内核,这里是 linux-2.6.18.tar.gz。 2 编译安装 cd /usr/src tar zxvf linux-2.6.18.tar.gz cd /usr/src/linux-2.6.18 make mrproper cp /boot/config-`uname -r` .config make menuconfig 选择选项"Load an Alternate Configuration File",然后 select,选择提取.config。 在 device driver 中,选择 Connector - unified userspace <-> kernelspace linker ---> make make modules_install make install 3 修改/boot/grub/grub.conf default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title Red Hat Enterprise Linux AS (2.6.18) root (hd0,0) kernel /vmlinuz-2.6.18 ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.18.img title Red Hat Enterprise Linux AS (2.6.9-67.0.4.EL_lustre.1.6.4.3smp) www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 root (hd0,0) kernel /vmlinuz-2.6.9-67.0.4.EL_lustre.1.6.4.3smp ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.9-67.0.4.EL_lustre.1.6.4.3smp.img title Red Hat Enterprise Linux AS (2.6.9-22.EL) root (hd0,0) kernel /vmlinuz-2.6.9-22.EL ro root=LABEL=/ rhgb quiet initrd /initrd-2.6.9-22.EL.img 4 重新启动 补充说明: 1)错误提示 新内核系统启动提示 Enforcing mode requested but no policy loaded. Halting now. kernel panic - not syncing: Attenpted to kill init 2)原因 enforcing 参数是在启动内核时传递给 selinux 的内核参数,它用来决定你系统的内核运 行于 强制(enforcing )模式还是自由(permissive) 模式。 在自由模式下 SELinux 只是记录他该做什么,而事实上并不做任何动作。在强制模式 下 SElinux 可能会阻止登陆。所以正常情况下在启动时传 enforcing=1 给内核,当 SELinux 策略有问题时,可以临时传 enforcing=0 给内核来查错。 3)解决办法(参见 2.3) 方法 1 编辑文件/etc/sysconfig/selinux,设置: SELINUX=disabled 然后 reboot 方法 2 kernel /vmlinuz-2.6.18 ro root=LABEL=/ rhgb quiet 修改为 kernel /vmlinuz-2.6.18 ro root=LABEL=/ enforcing=0 rhgb quiet 4.3. 安装drbd 从官方网站 www.drbd.org 下载源码包 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 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 4.4. 配置drbd 1.DRBD 使用的硬盘分区 这两个分区的大小必须相同。我们指定两台主机的/dev/hda5 分区作为 DRBD 的使用的 分区.这两个分区大小都为 32G。分区需为空白。 主机 1 :ost2, IP 地址为 10.0.0.202,DRBD 分区为/dev/hdb5 主机 1 :ost3,IP 地址为 10.0.0.203,DRBD 分区为/dev/hda5 这里用 eth1 作为两个主机的通信接口。 2.drbd.conf 配置文件 DRBD 运行时,会读取一个配置文件/etc/drbd.conf。这个文件里描述了 DRBD 设备与硬 盘分区的映射关系,和 DRBD 的一些配置参数: # 是否参加 DRBD 使用者统计.默认是 yes global { usage-count yes; } # 设置主备节点同步时的网络速率最大值,单位是字节. common { syncer { rate 10M; } } # 一个 DRBD 设备(即:/dev/drbdX),叫做一个"资源".里面包含一个 DRBD 设备的主备 节点的相关信息. resource r0 { # 使用协议 C.表示收到远程主机的写入确认后,则认为写入完成. protocol C; disk { on-io-error detach; size 30G; (由于硬盘大小不同,所以需要设置 drbd 的大小) } net { after-sb-0pri disconnect; rr-conflict disconnect; } syncer { rate 10M; (设置网络同步速率) al-extents 257; } # 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置. on ost2 { # /dev/drbd1使用的磁盘分区是/dev/hdb1 device /dev/drbd0; disk /dev/hdb5; # 设置 DRBD 的监听端口,用于与另一台主机通信 address 10.0.0.202:7788; flexible-meta-disk internal; } on ost3 { device /dev/drbd0; www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 disk /dev/hda5; address 10.0.0.203:7788; meta-disk internal; } } 3 将 drbd.conf 文件复制到备机上/etc 目录下 scp /etc/drbd.conf ost3:/etc 4.5. 初始化drbd 1、加载模块 drbd 采用的是模块控制的方式,所以先要加载 drbd.ko 模块 insmod drbd.ko 或者 modprobe drbd 使用 lsmod 来查看模块是否加载成功。 2、创建数据块 drbdadm create-md r0 3、启动 drbd /etc/init.d/drbd start 4、启动 drbd 服务,在后台状态下运行 drbdadm up all 5、设置主节点 在 ost2 上执行以下命令,设置 ost2 为主节点: drbdsetup /dev/drbd0 primary –o 6、查看连接 netstat -atn 的输出结果,说明两台机器的 drbd 服务已经连接上了: tcp 0 0 10.0.0.203:59369 10.0.0.202:7788 ESTABLISHED tcp 0 0 10.0.0.203:7788 10.0.0.202:34123 ESTABLISHED 7、查看同步状态 cat /proc/drbd 主节点上执行这个名后的结果,显示数据正在同步中 version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost2, 2008-12-30 17:23:44 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r--- ns:750308 nr:0 dw:0 dr:750464 al:0 bm:45 lo:0 pe:7 ua:5 ap:0 ep:1 wo:b oos:30707168 [>....................] sync'ed: 2.5% (29987/30720)M finish: 0:46:14 speed: 10,952 (10,272) K/sec 8、创建文件系统 在主节点上的设备/dev/drbd0 上创建一个文件系统,可以把 DRBD 设备挂载到/mnt/drbd 目录上使用。从节点的 DRBD 设备无法被挂载,因为它是用来接收主机数据的,由 DRBD 负责操作。因此不需要这个过程。在 ost2 上执行: mkfs.ext3 -j /dev/drbd0 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 mkdir /mnt/drbd mount /dev/drbd0 /mnt/drbd df /dev/drbd0 30963708 176200 29214644 1% /mnt/drbd 9、设置 drbd 开机自动启动 chkconfig --level 35 drbd on 4.6. 主备机切换 有时,需要将 DRBD 的主备机互换一下,可以执行下面的操作: 1、在主节点上,先要卸载掉 DRBD 设备。 umount /mnt/drbd0 2、将主节点 ost2 降级为”从节点”: drbdadm secondary r0 3、在从节点 ost3 上,将它升级为”主节点”: drbdadm primary r0 4、在从节点 ost3 上,挂载 drbd 设备 mount /dev/drbd0 /mnt/drbd 4.7. 通过haresources配置自动切换 如果不使用 heartbeat 的情况下,DRBD 只能手工切换主从关系,现在修改 heartbeat 的 配置文件,使 DRBD 可以通过 heartbeat 自动切换。 4.7.1.创建资源脚本 1 新建脚本 hdfs,用于启停 hdfs 文件系统,内容如下: cd /etc/ha.d/resource.d vi hdfs #!/bin/sh case "$1" in start) # Start commands go here cd /home/hdfs/hdfsinstall/hadoop/bin msg=`su - hdfs -c "sh /home/hdfs/hdfsinstall/hadoop/bin/start-dfs.sh"` logger $msg ;; stop) # Stop commands go here cd /home/hdfs/hdfsinstall/hadoop/bin msg=`su - hdfs -c "sh /home/hdfs/hdfsinstall/hadoop/bin/stop-dfs.sh"` logger $msg www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 ;; status) # Status commands go here ;; esac 2 修改权限 chmod 755 /etc/ha.d/resource.d/hdfs 3 把脚本拷贝到备份机并同样修改权限 scp /etc/ha.d/resource.d/hdfs ost3: /etc/ha.d/resource.d/ chmod 755 /etc/ha.d/resource.d/hdfs 4.7.2.配置haresources 1 修改/etc/ha.d/haresources vi /etc/ha.d/haresources ost2 192.168.188.201 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs 注释: ost2 主服务器名 192.168.188.201 对外服务 IP 别名 drbddisk::r0 资源 drbddisk,参数为 r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 资源 Filesystem , mount 设备/dev/drbd0 到 /mnt/drbd 目录,类型为 ext3 hdfs hdfs文件系统资源 4.8. 测试drbd 1、drbd 同步测试 1)在 ost2 上 cd /mnt/drbd dd if=/dev/zero of=/mnt/drbd/testfile bs=104857600 count=2 umount /mnt/drbd drbdadm secondary all 2)在 ost3 上 drbdadm primary all mkdir -p /mnt/drbd mount /dev/drbd0 /mnt/drbd ls -l /mnt/drbd 可以看到文件 testfile 在主节点写入,在从节点马上可以看到。 2、heartbeat 自动切换测试 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 1)启动 heartbeat 在 ost2 和 ost3 上执行: /etc/init.d/heartbeat start 2)在 ost2 上到 ifconfig 可以看到虚拟 IP 已经启动 eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C inet addr:192.168.188.201 Bcast:192.168.188.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0xc400 3)在 ost2 上停止 heartbeat 服务或关机 /etc/init.d/heartbeat stop 4)在 ost3 上 ifconfig 可以看到虚拟 IP 已经启动 eth0:0 Link encap:Ethernet HWaddr 00:11:2F:85:F9:DD inet addr:192.168.188.201 Bcast:192.168.188.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0xc400 5. drbd,heartbeat,hdfs联调测试 5.1. 测试 1 创建文件和目录 1、202 上 heartbeat 和 drbd 启动 由于 202 为主节点,在启动 heartbeat 服务后,虚拟地址 192.168.188.201 被配置到 202 上,同时挂载了 drbd 文件系统在/mnt/drbd。 1)执行/sbin/ifconfig 可以看到 eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C inet addr:192.168.188.201 Bcast:192.168.188.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0xc400 2)在 202 上执行 cat /proc/drbd,可以看到 202 和 203 之间同步正常,202 为主节点 version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost2, 2008-12-30 17:23:44 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:17672 nr:0 dw:17664 dr:157 al:20 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 3)在 203 上执行 cat /proc/drbd,可以看到 203 和 202 之间同步正常,203 为备份节点 version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost3, 2008-12-30 17:16:32 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r--- www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 ns:0 nr:9292 dw:9292 dr:0 al:0 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 4)在 202 上执行 df,看到 drbd 已挂载 /dev/drbd0 30963708 176320 29214524 1% /mnt/drbd 2、在 hdfs 文件系统创建目录 # 必须切换到 hdfs 用户才可以访问 hdfs 文件系统 su hdfs cd /home/hdfs/hdfsinstall/hadoop # 创建目录 testdir bin/hadoop dfs -mkdir testdir 3、把本地文件 hello 拷贝到 HDFS 的根目录下 bin/hadoop dfs -put /home/hdfs/hdfsinstall/hadoop/hello hello 4、查看现有的文件和目录 bin/hadoop dfs -ls -rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir 5.2. 测试 2 主备节点切换 1、在 202 上停止 heartbeat 在 202 上执行 reboot 或执行/etc/init.d/heartbeat stop 2、查看 203 1)执行/sbin/ifconfig 可以看到虚拟 ip 已经切换到 203 上 eth0:0 Link encap:Ethernet HWaddr 00:11:2F:85:F9:DD inet addr:192.168.188.201 Bcast:192.168.188.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0xc400 2)在 203 上执行 cat /proc/drbd,看到 203 切换为主节点,备节点状态为 Unknown version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost3, 2008-12-30 17:16:32 0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r--- ns:0 nr:17744 dw:17836 dr:6505 al:11 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:84 3)执行 df,看到 drbd 已挂载 /dev/drbd0 30963708 185580 29205264 1% /mnt/drbd 3、在 203 上查看 hdfs 文件系统 bin/hadoop dfs -ls 查看现有的文件和目录。显示是正常的。 -rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 5.3. 测试 3 主备节点再次切换 1、在 203 上停止 heartbeat 在 203 上执行 reboot 或执行/etc/init.d/heartbeat stop 2、查看 202 1)执行/sbin/ifconfig 可以看到虚拟 ip 已经切换到 202 上 eth0:0 Link encap:Ethernet HWaddr 00:11:D8:94:C6:1C inet addr:192.168.188.201 Bcast:192.168.188.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 Interrupt:177 Base address:0xc400 2)在 202 上执行 cat /proc/drbd,看到 202 切换为主节点,备节点状态为 Unknown version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost2, 2008-12-30 17:23:44 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r--- ns:0 nr:0 dw:4 dr:21 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:68 3)执行 df,看到 drbd 已挂载 /dev/drbd0 30963708 185580 29205264 1% /mnt/drbd 3、在 202 上查看 hdfs 文件系统 bin/hadoop dfs -ls 查看现有的文件和目录。显示是正常的。 -rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir 5.4. 测试 4 split brain自动处理 1、按照其他中描述配置 split brain 自动处理 2、重新启动 202 和 203,等待几分钟后 3、查看 202 cat /proc/drbd 显示 Connected,表示同步正常。 version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost2, 2008-12-30 17:23:44 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r--- ns:112 nr:0 dw:4 dr:129 al:1 bm:6 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 4、查看 203 cat /proc/drbd 显示 Connected,表示同步正常。 version: 8.3.0 (api:88/proto:86-89) www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost3, 2008-12-30 17:16:32 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r--- ns:0 nr:112 dw:112 dr:0 al:0 bm:6 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 5、在 202 上查看 hdfs 文件系统 bin/hadoop dfs -ls 查看现有的文件和目录。显示是正常的。 -rw-r--r-- 1 hdfs supergroup 1951937 2009-01-14 17:15 /user/hdfs/hello drwxr-xr-x - hdfs supergroup 0 2009-01-13 16:44 /user/hdfs/testdir 6. hdfs文件读写测试 6.1. 测试内容 对 HDFS 文件系统读写不同大小文件的性能进行测试。 1)创建测试目录 testdir bin/hadoop dfs -mkdir testdir 2)用 dd 在本地创建不同大小的文件 如 dd if=/dev/zero of=hello bs=1G count=1 //创建 1M 大小的文件 3) 拷贝测试文件到 HDFS 下 testdir 目录 bin/hadoop dfs -copyFromLocal hello testdir/ 4)执行测试 java HadoopDFSFileReadWrite testdir/hello testdir/hello1 5)删除测试文件 bin/hadoop dfs -rm testdir/* 6.2. 测试结果 文件大 小 Hdfs 以网络方式写入网络节点 (ms) Hdfs 以网络方式写入本地节点(ms) 2k 16k 64k 256k 512k 1M 224 115 2M 330 281 3M 350 373 4M 356 430 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 8M 704 724 16M 1406 966 64M 4476 4888 256M 16347 13667 1G 63234 46484 6.3. 结果分析 为了实现双机热备,hdfs 文件系统的元数据需要保存在共享存储(这里是 drbd)上。 目前的测试只有两个节点,因此 hdfs 的文件数据也保存在共享存储上。即文件数据也需要 通过网络访问,而不是本地访问。 从结果看(第一列为旧的测试数据),目前的双机方式对 hdfs 性能没有什么影响,进一 步的测试可以考虑加入和删除数据节点。 7. 其他 7.1. 用户映射 在 202 上和 203 上我们的都创建相同的用户/口令:hdfs/hdfs,但在/etc/passwd 和/etc/group 中可以看到,在两台机器上,用户和组所对应的 useid 和 groupid 是不同的,这样会导致, drbd 切换时,drbd 的存储在两台机器上映射到不一致的用户和组。因此需要在创建用户和 组时指定 useid 和 groupid。目前我们采用修改 203 的方式: 1 首先打开 202 上的/etc/passwd 和/etc/group,得 到 hdfs 的 useid 和 groupid 值为 10008。 2 在 203 上修改 hdfs 的 useid 和 groupid 值为 10008。 usermod -u 10008 hdfs groupmod -u 10008 hdfs 3 这样 drbd 切换时,就不会出现权限问题。 7.2. split brain问题处理 split brain 实际上是指在某种情况下,造成 drbd 的两个节点断开了连接,都以 primary 的身份来运行。当 drbd 某 primary 节点连接对方节点准备发送信息的时候如果发现对方也是 primary 状态,那么会会立刻自行断开连接,并认定当前已经发生 split brain 了,这时候他会 在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当 发 生 split brain 之 后,如果查看连接状态,其中至少会有一个是 StandAlone 状态,另外一个可能也是 StandAlone (如果是同时发现 split brain 状态),也有可能是 WFConnection 的状态。 7.2.1.错误状态 1 节点重新启动时,在 dmesg 中出现错误提示: www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 drbd0: Split-Brain detected, dropping connection! drbd0: self 055F46EA3829909E: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: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@ost3, 2008-12-30 17:16:32 0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r--- ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua: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-30 17:23:44 0: cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown r--- ns:0 nr:0 dw:4 dr:21 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:68 4 原因分析 由于节点重启导致数据不一致,而配置文件中没有配置自动修复错误的内容,因而导致 握手失败,数据无法同步。 split brain 有两种解决办法:手动处理和自动处理。 7.2.2.手动处理 1 在 203 上停止 heartbeat Heartbeat 会锁定资源,只有停止后才能释放 /etc/init.d/heartbeat stop 2 在作为 secondary 的节点上放弃该资源的数据 在 ost3 上 /sbin/drbdadm -- --discard-my-data connect 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,已经恢复了正常。 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 version: 8.3.0 (api:88/proto:86-89) GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@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:1 wo: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-30 17:16:32 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r--- ns:0 nr:768 dw:768 dr:0 al:0 bm:10 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 7.2.3.自动处理 通过/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 默认策略,没有自动恢复,简单的断开连接。 www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。 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安装和管理 http://www.linuxidc.com/Linux/2012-01/50712.htm Hadoop HDFS开发参考 http://www.linuxidc.com/Linux/2012-01/50713.htm www.linuxidc.com Linux公社(LinuxIDC.com) 是包括Ubuntu,Fedora,SUSE技术,最新IT资讯等Linux专业类网站。
还剩20页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

yhx0000

贡献于2012-12-20

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf