利用heartbeat和drbd实现HDFS的双机热备

              written by aaronwxb,2012.03.30

主要原理:

利用DRBD实现共享存储空间,在主服务器(primary)将元数据写入本机时同时要写入备份节点(secondary),才算一次写操作完成,实现元数据的实时备份。

利用heartbeat实现自动切换功能,双方之间发送心跳,若备份节点一旦其无法检测到主服务器的“心跳”则自动接管主服务器的资源。

 

虚拟机环境配置:

用vbox安装虚拟机,OS为ubuntu11.10,虚拟机双网卡,网卡配置为桥接方式,主要设置如下:

主机

IP地址

配置

master(主节点)

eth0: 192.168.123.41

eth1: 192.168.123.42 (HA心跳使用地址)

eth0:0: 192.168.123.40 (虚拟IP)

 

容量:G

接口标准:

转速:rpm

缓存容量:M

平均寻道时间:ms

传输标准:

backup(从节点)

eth0: 192.168.123.44

eth1: 192.168.123.46 (HA心跳使用地址)

eth0:0: 192.168.123.40 (虚拟IP)

 

容量:G

接口标准:

转速:rpm

缓存容量:M

平均寻道时间:ms

传输标准:

slave(数据节点)

eth0:192.168.123.47

 

 

master:

网卡配置:

bobo@master:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.41

netmask  255.255.255.0

gateway 192.168.123.1

 

auto eth1

iface eth1 inet static

address 192.168.123.42

netmask 255.255.255.0

 

hosts文件

bobo@master:~$ cat /etc/hosts

127.0.0.1  localhost

127.0.1.1  bobo-VirtualBox

 

192.168.123.41         master

192.168.123.44         backup

192.168.123.47         slave

 

192.168.123.40         vip

 

192.168.123.42         master

192.168.123.46         backup

 

backup:

网卡配置:

bobo@backup:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.44

netmask  255.255.255.0

gateway 192.168.123.1

 

auto eth1

iface eth1 inet static

address 192.168.123.46

netmask 255.255.255.0

 

hosts文件

同master

slave(datanode):

网卡配置:

bobo@slave:~$ cat /etc/network/interfaces

auto lo

iface lo inet loopback

 

auto eth0

iface eth0 inet static

address    192.168.123.47

netmask  255.255.255.0

gateway 192.168.123.1

hosts文件

同master

 

配置SSH无密码访问:

master

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa

cat ~/.ssh/id_dsa.pub >> authorized_keys

 

backup

 

关闭selinux(所有机器)

SELinux是一种基于 域-类型 模型(domain-type)的强制访问控制(MAC)安全系统,它由NSA编写并设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SELinux的补丁,最后还有一个相应的安全策略。Lustre存储服务器和元数据目录服务器通信会使用一些特殊端口,最好关闭SELINUX。

编辑文件/etc/sysconfig/selinux,设置:

SELINUX=disabled

然后reboot

 

没有selinux

 

关闭防火墙(所有机器)

如果系统启动了Iptables服务,需要为相关服务打开端口 (988, 1021 ~ 1023等),简单的处理是关闭防火墙。

#清除规则

iptables –F

#保存

service iptables save

chkconfig --level 2345 iptables off

service iptables stop

 

没有防火墙ufw

iptables没有开启,默认都是ACCEPT

 

DRBD部署

原理

DRBD(Distributed Replicated Block Device)是基于Linux系统下的块复制分发设备。它可以实时的同步远端主机和本地主机之间的数据,类似与Raid1的功能,我们可以将它看作为网络 Raid1。在服务器上部署使用DRBD,可以用它代替共享磁盘阵列的功能,因为数据同时存在于本地和远端的服务器上,当本地服务器出现故障时,可以使用远端服务器上的数据继续工作,如果要实现无间断的服务,可以通过drbd结合另一个开源工具heartbeat,实现服务的无缝接管。DRBD的工作原理如下图:

 

编译linux内核

由于2.4.9缺少CONNECTOR,导致drbd无法安装,因此必须编译内核。

 

linux内核2.6之后就带有CONNECTOR,这里用的是:

bobo@master:~$ uname -a

Linux master 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:50:42 UTC 2011 i686 i686 i386 GNU/Linux

 

安装drbd

分别在两台主机上安装。

sudo apt-get install drbd8-utils

 

配置drbd

1.DRBD使用的硬盘分区

这两个分区的大小必须相同。

 

为虚拟机master和backup添加一块虚拟硬盘,大小为2G,利用fdisk分区,得到:

Disk /dev/sdb: 2147 MB, 2147483648 bytes

22 heads, 16 sectors/track, 11915 cylinders, total 4194304 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x80d3501f

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1            2048     4194303     2096128    5  Extended

/dev/sdb5            4096     4194303     2095104   83  Linux

我们指定两台主机的/dev/sdb5分区作为DRBD的使用的分区.这两个分区大小都为2G。分区需为空白。

主机1 :master, IP地址为 192.168.123.42,DRBD分区为/dev/sdb5

主机2 :backup,IP地址为 192.168.123.46,DRBD分区为/dev/sdb5

这里用eth1作为两个主机的通信接口。

 

2.drbd.conf配置文件

DRBD运行时,会读取一个配置文件/etc/drbd.conf。这个文件里描述了DRBD设备与硬盘分区的映射关系,和DRBD的一些配置参数:

       # 是否参加DRBD使用者统计.默认是yes

       global { usage-count yes; }

       # 设置主备节点同步时的网络速率最大值,单位是字节.

       common { syncer { rate10M; } }

       # 一个DRBD设备(即:/dev/drbdX),叫做一个"资源".里面包含一个DRBD设备的主备节点的相关信息.

       resource r0 {

            # 使用协议C.表示收到远程主机的写入确认后,则认为写入完成.

           protocol C;

           disk {

                        on-io-error   detach;

            }

                net {

             #见其他——split brain问题处理

after-sb-0pri discard-younger-primary;

                                  after-sb-1pri discard-secondary;

                                  after-sb-2pri call-pri-lost-after-sb;

             rr-conflict disconnect; #incompatible resync decision

            }

                   syncer {

            rate10M;    #(设置网络同步速率)

             al-extents 257;      #A higher number of extents gives longer resync times but less updates to the meta-data. The default number of extents is 127. (Minimum: 7, Maximum: 3843)

                        }

            # 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置.

            on master {

                 # /dev/drbd1使用的磁盘分区是/dev/hdb1

                 device    /dev/drbd0;

                 disk      /dev/sdb5;                    #/dev/hdb5;

                 # 设置DRBD的监听端口,用于与另一台主机通信

                 address   192.168.123.42:7788;

                 flexible-meta-disk internal;

            }

            on backup {

                 device    /dev/drbd0;

                 disk      /dev/sdb5;                    #/dev/hda5;

                 address   192.168.123.46:7788;

                 flexible-meta-disk internal;

            }

       }

3 将drbd.conf文件复制到备机上

scp /etc/drbd.conf backup:/etc

初始化drbd

1、加载模块

drbd采用的是模块控制的方式,所以先要加载drbd.ko 模块

#insmod drbd.ko或者modprobe drbd

使用lsmod来查看模块是否加载成功。

 

成功

Module                  Size  Used by

nls_utf8               12493  1

isofs                  39549  1

drbd                  260222  4

2、主备创建数据块

drbdadm create-md r0

3、主备启动drbd

/etc/init.d/drbd start

 

bobo@master:~$ cat /proc/drbd

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----

ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2095004

 

bobo@backup:/etc$ cat /proc/drbd

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----

ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2095004

 

4、设置主节点

在master上执行以下命令,设置master为主节点:

sudo drbdadm -- --overwrite-data-of-peer primary all

 

5、查看连接

netstat -atn的输出结果,说明两台机器的drbd服务已经连接上了:

tcp        0      0 192.168.1.42:57769      192.168.1.46:7788    ESTABLISHED

tcp        0      0 192.168.1.42:7788       192.168.1.46:33762   ESTABLISHED

 

6、查看同步状态

cat /proc/drbd

主节点上执行这个命令后的结果,显示数据正在同步中:

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----

    ns:62464 nr:0 dw:0 dr:63264 al:0 bm:3 lo:7 pe:0 ua:8 ap:0 ep:1 wo:f oos:2032540

[>....................] sync'ed:  3.2% (2032540/2095004)K

finish: 0:03:14 speed: 10,408 (10,408) K/sec

 

等待同步完毕

7、创建文件系统

在主节点上的设备/dev/drbd0上创建一个文件系统,可以把DRBD设备挂载到/mnt/drbd目录上使用。从节点的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作。因此不需要这个过程。在master上执行:

mkfs.ext3 /dev/drbd0

mkdir /mnt/drbd

mount /dev/drbd0  /mnt/drbd

查看挂载结果:

df

/dev/drbd0            30963708    176200  29214644   1% /mnt/drbd

8、设置drbd开机自动启动

chkconfig drbd on

 

 

主备机切换

有时,需要将DRBD的主备机互换一下,可以执行下面的操作:

1、在主节点上,先要卸载掉DRBD设备。

sudo umount /mnt/drbd0

2、将主节点master降级为“从节点”:

sudo drbdadm secondary r0

3、在从节点backup上,将它升级为“主节点”:

sudo drbdadm primary r0

4、在从节点backup上,挂载drbd设备

sudo mount /dev/drbd0  /mnt/drbd

 

drbd手动切换同步测试

1)在master上

cd /mnt/drbd

dd if=/dev/zero of=/mnt/drbd/testfile bs=104857600 count=2

umount /mnt/drbd

drbdadm secondary all

 

2)在backup上

drbdadm primary all

mkdir -p /mnt/drbd

mount /dev/drbd0 /mnt/drbd

ls -l /mnt/drbd

可以看到文件testfile在主节点写入,在从节点马上可以看到。

 

heartbeat部署

安装heartbeat

先在主节点上安装,命令如下:

sudo apt-get install heartbeat

 

配置

/etc/ha.d/ha.cf定义位于不同节点上的heartbeat进程间如何进行通信/etc/ha.d/authkeys 定义Heartbeat包在通信过程中如何进行加密

/etc/ha.d/haresources 定义对某个资源来说哪个服务器是主节点,以及哪个节点应该拥有客户端访问资源时的目标IP地址

 

配置/etc/ha.d/ha.cf

配置heartbeat守护进程使用交叉网络发送和接收心跳数据包。

1、 解压/usr/share/doc/heartbeat/ha.cf样本配置文件:

sudo gunzip ha.cf.gz

 

2、 使用下面的命令将样本配置文件复制到适当的位置:

sudo cp ha.cf /etc/ha.d/ha.cf

 

3、 编辑/etc/ha.d/ha.cf文件,取消注释符号或增加以下内容:

logfile /var/log/ha-log

#heartbeat的日志文件 

udpport 694    

#设置广播通信使用的端口,694为默认使用的端口号

ucast eth1 192.168.123.46

#采用单播ucast方式,使用网卡eth1在主服务器和备用服务器之间发送心跳消息。指定对端ip,即在master上指定192.168.123.46,在backup上指定192.168.123.42

 

4、 同时,取消keepalive,deadtime和initdead这三行的注释符号:

keepalive 2

#心跳消息之间的时间间隔,默认时间单位为秒 

deadtime 30

#超出该时间间隔未收到对方节点的心跳,则认为对方已经死亡。 

warntime 10

#超出该时间间隔未收到对方节点的心跳,则发出警告并记录到日志中。 

initdead 120

#在某些系统上,系统启动或重启之后需要经过一段时间网络才能正常工作,选项用于解决这种情况产生的时间间隔。取值至少为deadtime的两倍。 

 

5、添加下面两行:

node master

node backup

 

#这里填写主、备用服务器的名字(uname -n命令返回的值)。

6、使用Heartbeat重新启动守护进程

指定与heartbeat一同启动和关闭的进程,该进程被自动监视,遇到故障则重新启动。

最常用的进程是ipfail,该进程用于检测和处理网络故障,需要配合ping语句指定的ping node来检测网络连接。在/etc/ha.d/ha.cf中使用下面这样一行:

ping 192.168.123.1  #一般ping网关,不能ping集群中的节点

respawn root /usr/lib/heartbeat/ipfail

apiauth ipfail gid=root uid=root #执行ipfail的用户和组ID

 

7、auto_failback的相关配置

用于决定,当拥有该资源的属主恢复之后,资源是否变迁:是迁移到主上(设置为on),还是在当前节点上继续运行,直到当前节点出现故障(off)。

 

auto_failback off

 

8、STONITH配置

stonith_host master null backup

stonith_host backup null master

# stonith的主要作用是使出现问题的节点从集群环境中脱离,进而释放集群资源,避免两个节点争用一个资源的情形发生。保证共享数据的安全性和完整性。 

 

配置/etc/ha.d/authkeys

authkeys文件用于heartbeat的鉴权设置,共有三种可用的鉴权方式:crc、md5和sha1。三种方式安全性依次提高,但同时占用的系统资源也依次扩大。crc安全性最低,适用于物理上比较安全的网络,sha1提供最为有效的鉴权方式,占用的系统资源也最多。 

其配置语句格式如下: 

auth <number> 

<number> <authmethod> [<authkey>] 

 

1、 将authkeys文件复制到适当的位置:

cp /usr/share/doc/heartbeat/authkeys /etc/ha.d

2、 编辑/etc/ha.d/authkeys文件,取消下面两行内容前的注释符号:

auth1

1 crc

3、 确保authkeys文件只能由root读取:

chmod 600 /etc/ha.d/authkeys

 

配置/etc/ha.d/haresources

格式如下:

primary-server [IPaddress[/mask/interface/broadcast]] resource1[::arg1::arg2] resource2[::arg1::arg2]

主服务拥有的资源的名字,它告诉heartbeat程序哪个机器拥有某个资源,资源名实际上是/etc/init.d目录或/etc/ha.d/resource.d目录下的一个脚本。(这个脚本的副本必须同时存在于主服务器和备用服务器上)

 

master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs

 

在备用服务器上安装Heartbeat

安装完包之后,直接在主服务器上执行下面的命令复制所有配置文件到备用服务器上:

scp -r /etc/ha.d backup:/etc/ha.d

scp命令是安全复制命令,它使用SSH协议在两个节点之间复制数据,-r选项指定scp复制主服务器上/etc/ha.d目录下的所有文件和所有子目录。

 

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

 

 

heartbeat自动切换测试

1)启动heartbeat

在master和backup上执行:

/etc/init.d/heartbeat start

 

已经启动

 

2)在master上到ifconfig

可以看到虚拟IP已经启动

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

3)在master上停止heartbeat服务或关机

/etc/init.d/heartbeat stop

 

4)在backup上ifconfig

可以看到虚拟IP已经启动

eth0:0    Link encap:Ethernet  HWaddr 00:11:2F:85:F9:DD 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

 

通过haresources配置自动切换

如果不使用heartbeat的情况下,DRBD只能手工切换主从关系,现在修改heartbeat的配置文件,使DRBD可以通过heartbeat自动切换。

 

创建资源脚本

1 新建脚本hdfs,用于启停hdfs文件系统,内容如下:

cd /etc/ha.d/resource.d

vi hdfs

#!/bin/sh

case "$1" in

start)

# Start commands go here

cd /home/bobo/hadoop-0.20.203.0/bin

msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/start-dfs.sh"`

logger $msg

;;

stop)

# Stop commands go here

cd /home/bobo/hadoop-0.20.203.0/bin

msg=` su - bobo -c "sh /home/bobo/hadoop-0.20.203.0/bin/stop-dfs.sh"`

logger $msg

;;

status)

# Status commands go here

;;

esac

 

2 修改权限

chmod 755 /etc/ha.d/resource.d/hdfs

 

3 把脚本拷贝到备份机并同样修改权限

scp /etc/ha.d/resource.d/hdfs backup: /etc/ha.d/resource.d/

chmod 755 /etc/ha.d/resource.d/hdfs

 

配置haresources

1 修改/etc/ha.d/haresources

vi /etc/ha.d/haresources

master 192.168.123.40 drbddisk::r0 Filesystem::/dev/drbd0::/mnt/drbd::ext3 hdfs

 

注释:

master                               主服务器名

192.168.123.40                     对外服务IP别名

drbddisk::r0                         资源drbddisk,参数为r0

Filesystem::/dev/drbd0::/mnt/drbd::ext3  资源Filesystem,mount设备/dev/drbd0到/mnt/drbd目录,类型为ext3

hdfs                           hdfs文件系统资源

 

 

drbd,heartbeat,hdfs联调测试

测试1 创建文件和目录

1、41上heartbeat和drbd启动

由于41为主节点,在启动heartbeat服务后,虚拟地址192.168.123.40被配置到master上,同时挂载了drbd文件系统在/mnt/drbd。

1)执行ifconfig可以看到

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

2)在41上执行cat /proc/drbd,可以看到41和44之间同步正常,41为主节点

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:84 nr:8 dw:88 dr:2058 al:2 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

3)在44上执行cat /proc/drbd,可以看到44和41之间同步正常,44为备份节点

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

    ns:8 nr:84 dw:92 dr:1025 al:1 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

4)在41上执行df,看到drbd已挂载

/dev/drbd0             2062060     35876   1921436   2% /mnt/drbd

 

2、在hdfs文件系统创建目录

# 必须切换到hdfs用户才可以访问hdfs文件系统

# su bobo

cd /home/hdfs/hdfsinstall/hadoop/bin

# 创建目录testdir

hadoop  dfs  -mkdir  testdir

 

3、把本地文件hello拷贝到HDFS的根目录下

hadoop dfs -put ~/hadoopfile/1.file testfile

 

4、查看现有的文件和目录

Found 2 items

drwxr-xr-x   - bobo supergroup          0 2012-03-26 01:24 /user/bobo/testdir

-rw-r--r--   1 bobo supergroup          0 2012-03-26 01:26 /user/bobo/testfile

 

测试2 主备节点切换

1、在41上停止heartbeat

在41上执行sudo service heartbeat stop

 

2、查看44

1)执行ifconfig可以看到虚拟ip已经切换到44上

eth1:0    Link encap:以太网  硬件地址 08:00:27:9a:2a:f5 

          inet 地址:192.168.1.40  广播:192.168.1.255  掩码:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1

2)在44上执行cat /proc/drbd,看到44切换为主节点Primary

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:2760 nr:1960 dw:4756 dr:3797 al:14 bm:14 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo

s:0

3)执行df,看到drbd已挂载

/dev/drbd0             2062060     35876   1921436   2% /mnt/drbd

 

3、在44上查看hdfs文件系统

/home/hdfs/hdfsinstall/hadoop/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

 

测试3 主备节点再次切换

1、先开启41上的heartbeat,在44上停止heartbeat

在44上执行/etc/init.d/heartbeat stop

 

2、查看41

1)执行ifconfig可以看到虚拟ip已经切换到41上

eth0:0    Link encap:Ethernet  HWaddr 00:11:D8:94:C6:1C 

          inet addr:192.168.123.40  Bcast:192.168.188.255  Mask:255.255.255.0

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          Interrupt:177 Base address:0xc400

2)在41上执行cat /proc/drbd,看到41切换为主节点Primary

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:2300 nr:2824 dw:5040 dr:4093 al:13 bm:16 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oo

s:0

3)执行df,看到drbd已挂载

/dev/drbd0            30963708    185580  29205264   1% /mnt/drbd

 

3、在41上查看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

测试4 split brain自动处理

1、按照其他中描述配置split brain自动处理

上面已经配置了

 

2、重新启动41和44,等待几分钟后

 

3、查看41

cat /proc/drbd

显示Connected,表示同步正常。

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----

    ns:336 nr:64 dw:400 dr:765 al:7 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

4、查看44

cat /proc/drbd

显示Connected,表示同步正常。

version: 8.3.11 (api:88/proto:86-96)

srcversion: DA5A13F16DE6553FC7CE9B2

 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----

    ns:0 nr:336 dw:336 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

 

5、在41上查看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

 

其他

用户映射

   在41上和44上我们的都创建相同的用户/口令:bobo/bobo,但在/etc/passwd和/etc/group中可以看到,在两台机器上,用户和组所对应的useid和groupid是不同的,这样会导致,drbd切换时,drbd的存储在两台机器上映射到不一致的用户和组。因此需要在创建用户和组时指定useid和groupid。目前我们采用修改44的方式:

1 首先打开41上的/etc/passwd和/etc/group,得到bobo的useid和groupid值为1000。

2 在44上修改bobo的useid和groupid值为1000。

usermod -u 1000 bobo

groupmod  -u 1000 bobo

3 这样drbd切换时,就不会出现权限问题。

 

split brain问题处理(参考)

split brain实际上是指在某种情况下,造成drbd的两个节点断开了连接,都以primary的身份来运行。当drbd某primary节点连接对方节点准备发送信息的时候如果发现对方也是primary状态,那么会会立刻自行断开连接,并认定当前已经发生split brain了,这时候他会在系统日志中记录以下信息:“Split-Brain detected,dropping connection!”当发生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在44查看cat /proc/drbd,44运行为StandAlone状态

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 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在41查看cat /proc/drbd,41运行为StandAlone状态

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 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有两种解决办法:手动处理和自动处理。

手动处理

1 在44上停止heartbeat

Heartbeat会锁定资源,只有停止后才能释放

/etc/init.d/heartbeat stop

2 在作为secondary的节点上放弃该资源的数据

在44上

/sbin/drbdadm --  --discard-my-data connect r0

3在作为primary的节点重新连接secondary

在41上

/sbin/drbdadm disconnect r0

/sbin/drbdadm connect r0

把41设置为主节点

/sbin/drbdadm primary r0

4在44上重新启动heartbeat

/etc/init.d/heartbeat start

5 查看41状态 cat /proc/drbd,显示为Connected,已经恢复了正常。

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@master, 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查看44状态 cat /proc/drbd,显示为Connected,已经恢复了正常。

version:8.3.0(api:88/proto:86-89)

GIT-hash: 9ba8b93e24d842f0dd3fb1f9b90e8348ddb95829 build by root@backup, 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

 

(实际采用的恢复方法)

先选择好一个备机,在备机上执行:

sudo drbdadm secondary r0

sudo drbdadm disconnect r0

sudo drbdadm -- --discard-my-data connect r0

在主上执行:

sudo drbdadm connect r0

 

 

自动处理

通过/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;

 

 

posted on 2012-04-06 17:38  aaronwxb  阅读(2148)  评论(4编辑  收藏  举报