zoukankan      html  css  js  c++  java
  • 利用heartbeat和drbd实现HDFS的双机热备

    利用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;

  • 相关阅读:
    bootstrap-select.js 下拉框多选后动态赋值
    vs2012 未找到与约束 ContractName Microsoft.VisualStudio.Utilities.IContentTy...
    jquery 报错 Uncaught TypeError: Illegal invocation
    火狐浏览器的RestClient,接口测试,Post提交数据
    destoon二次开发 操作数据库可运行示例
    ZendStudio13 PHP调试环境快速配置
    VR发展的最大障碍在于内容?
    优秀博文链接
    LoopMatrix
    串口输出float型数据
  • 原文地址:https://www.cnblogs.com/aaronwxb/p/2435012.html
Copyright © 2011-2022 走看看