zoukankan      html  css  js  c++  java
  • 高可用集群(HA)之DRBD原理和基础配置

    目录
        6.测试

    1.工作原理图-->

    目的-->
    解决共享存储问题

    工作原理-->
    提供两个大小相同的分区,在数据流的层次上构建一个磁盘镜像,就如同raid1,所以又被称为分布式raid
    主从架构:primary/secondary
    默认结构,两节点的所有存储属性,内容皆相同;
    同一时刻只能有一个节点上线(即从节点,读写皆不可),主节点接到数据后,将数据备份到磁盘,同时传递给从节点,并存放到磁盘中.
    双主模型:
    组内节点皆上线;
    节点必须为集群文件系统;
    必须支持分布式文件锁(内核支持),主节点写入的时候,从节点就从文件锁得知对方在写入;
    高可用集群的底层文件信息通道(必须将DRBD做成集群资源).

    因为drbd工作在内核,故需要用户空间工具提供规则,所以它由用户空间工具和内核模块组成,就如同iptables和LVS一样.
    不支持多个从,至少当前不支持

    2.用户空间工具-->告知内核哪个分区是drbd设备

    drbdadm    /etc/drbd.d/
        |__ drbdadm primary resource_name    升级为主节点
        |__ drbdadm secondary resource_name    降级为备节点

    drbdsetup
    drbdmeta

    查看drbd状态,有两种方法
    cat /proc/drbd
    drbd-overview

    3.工作模式-->DRbd有三种工作模式告知上层进程写入完成:A异步,B半同步,C同步

    A模式:主节点接到数据,只保证发送到本地网卡的数据缓冲区
    (性能最好)
    B模式:主节点接到数据,保证数据发送到从节点缓冲区,且存到了从节点的内核区,但是是否数据存储到从节点的硬盘,则不清楚
    C模式:主节点接到数据,保证数据发送到从节点缓冲区,同时接到从节点存到从节点硬盘的信息
    (安全最高)



    利用高可用的底层信息通道(如HA的heartbeat或者corosync)+pacemaker进行资源监控,将drbd定义为资源,且drbd资源有主从之分.

    5.所需的软件包-->drbd在红帽中并没有编译,故而需要自己制作或者采用第三方rpm包

    一定要使用与内核相匹配的包(google或者rpmfind搜索)
    rhel6:官方不提供,由第三方提供
    drbd-kmdl(内核空间)和drbd(用户空间)
    rhel5:
    kmod-drbd(内核空间)和drbd(用户空间)

    6.配置-->分段式配置

    drbd_resource组成: resource_name device disk network
    global{}基本没意义的配置
    common{}定义drbd设备共享的属性信息(磁盘信息,网络信息,认证信息),可能存在多组drbd设备,每组包含一个主从
    剩余配置信息是不同的属性
    每一组drbd叫做drbd资源(资源名必须是小写字符),并以文件形式存放在/etc/drbd.d/资源名.res,资源之间以套接字方式互相通信
    每一组drbd,主从所在的磁盘分区必须大小相等

    7.详细配置过程-->一个共享区域资源的例子

    前提准备:提供两个大小相同的磁盘或者磁盘分区空间

    7-1.配置通用属性信息-->/etc/drbd.d/global-common.conf
    global {
            usage-count no;
            #是否给官方发送统计报告,这个不用说,还是关了吧
            # minor-count dialog-refresh disable-ip-verification
    }

    #定义drbd节点的共同点属性
    common {
            protocol C;

            handlers {
                    pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                    pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
                    local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
                    # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
                    # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
                    # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
                    # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
                    # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
            }

            startup {
                    #wfc-timeout 120;
                    #degr-wfc-timeout 120;
            }

            disk {
                    on-io-error detach;
                    #fencing resource-only;
            }

            net {
                    cram-hmac-alg "sha1";
                    shared-secret "mydrbdlab";
            }
    #定义同步速率
            syncer {
                    rate 1000M;
            }
    }

    7-2.定义一个资源-->/etc/drbd.d/mysql.res
    resource mysql {
      on node1 {
        device    /dev/drbd0;
        disk      /dev/sdc5;
        address   172.16.100.15:7789;
        #internal表示将drbd自己的源数据放在drbd资源磁盘空间中
        meta-disk internal;
      }
      on node2 {
        device    /dev/drbd0;
        disk      /dev/sdc5;
        address   172.16.100.16:7789;
        meta-disk internal;
      }
    }
    以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
    # scp  /etc/drbd.d/*  node2:/etc/drbd.d/

    1)初始化资源,在Node1和Node2上分别执行:
    # drbdadm create-md mysql
    Writing meta data...
    initializing activity log
    NOT initializing bitmap
    New drbd meta data block successfully created.
    此处可能会报 Command 'drbdmeta 0 v08 /dev/sdc5 internal create-md' terminated with exit code 40 错误,解决办法:首先看提示命令中的磁盘是否是你配置文件中的磁盘,如果不是,说明生效的配置文件不是你所认为的那个,其次,如果是,说明配置文件没错,那么可以使用dd命令往对应磁盘中输入些数据,此处磁盘分区是sdc5,故命令如下:dd if=/dev/zero of=/dev/sdc5 bs=100M count=1
    2)启动服务,在Node1和Node2上分别执行:
    #/etc/init.d/drbd start

    3)查看启动状态:
    # watch -nl "cat /proc/drbd"
    version: 8.3.8 (api:88/proto:86-94)
    GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16
     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:b oos:505964
    也可以使用drbd-overview命令来查看:
    # drbd-overview 
      0:mysql  Connected Secondary/Secondary Inconsistent/Inconsistent C r---- 

    7-4.设置主节点-->从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令
    # drbdadm primary --force mysql
    也可以在要设置为Primary的节点上使用如下命令来设置主节点:
         # drbdadm  --overwrite-data-of-peer primary mysql
    而后再次查看状态,可以发现数据同步过程已经开始:
    # drbd-overview 
      0:mysql  SyncSource Primary/Secondary UpToDate/Inconsistent C r---- 
        [============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
        
    等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:
    # drbd-overview 
      0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r---- 

    需要注意的是,只需要在主节点上进行格式化,且只能在主节点上挂载,若主节点下线,从节点上线,则从节点可以直接挂载,不需要再次格式化.
    # mke2fs -t ext4 -L DRBD /dev/drbd0
    # mkdir /mydata
    # mount /dev/drbd0 /mydata

    对主Primary/Secondary模型的drbd服务来讲,在某个时刻[只能有一个节点为Primary],因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:

    Node1:创建测试文件到挂载点,并将其下线
    # cd /mydata 
    # vi test
    # date >> test
    # cat test
      Thu Mar 13 17:00:18 CST 2014
    # cd .. && umount /test 
    # drbdadm secondary mysql    --降级(下线)
    查看状态:
    # drbd-overview 
      0:mysql  Connected Secondary/Secondary UpToDate/UpToDate C r---- 

    Node2:将其上线,查看是否有文件存在
    # drbdadm primary mysql    --升级(上线)
    # drbd-overview 
      0:mysql  Connected Primary/Secondary UpToDate/UpToDate C r---- 
    # mkdir /mydata
    # mount /dev/drbd0 /mydata
    # ls /mydata
      lost+found  test
    # cat test
      Thu Mar 13 17:00:18 CST 2014

    7-7.问题-->
    问题描述:设备被其他人占用,无法停止或者下线资源
    0: State change failed: (-12) Device is held open by someone
    解决办法:查看是否设备挂载,umount即可
    问题描述:0:mydrbd WFConnection Primary/Unknown UpToDate/DUnknown C r-----,即总有一个节点是未知状态
    解决办法:
    主节点上执行:
    drbdadm connect all
    从节点上执行:
    drbdadm -- --discard-my-data connect all







    [星空刺] |-->一颗星辰一闪即逝,支撑它的唯有方向和目的
  • 相关阅读:
    经典isset,empty,is_null三个的用法与区别,最详细的讲解
    TP框架分页bootstrap冲突问题
    TP框架右下角运行时间
    TP6的跳转坑 和cmd报错 php版本和composer扩展坑
    TP5.1模板继承
    TP5.1模型关联
    Oracle语句
    ajaxform和ajaxgrid获取数据源、添加数据
    confirm和alert弹窗
    UEP-弹窗
  • 原文地址:https://www.cnblogs.com/aaa103439/p/152261f0d686601ca72e59c49368198b.html
Copyright © 2011-2022 走看看