美文网首页
Linux 数据镜像软件 DRBD

Linux 数据镜像软件 DRBD

作者: w也不知道 | 来源:发表于2017-10-06 17:21 被阅读0次

    一、DRBD 简介及主要功能

    简单的说,DRBD (Distributed Replicated Block Device,分布式复制块设备)是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。可以把它看作是一种网络RAID1。
      DRBD的主要功能是负责接收数据,把数据写到本地磁盘,然后通过网络将同样的数据发送给另一个主机,另一个主机再将数据存到自己的磁盘中

    drbd运行结构

    二、DRBD 工作原理

    每个设备(drbd 提供了不止一个设备)都有一个状态,可能是‘主’状态或‘从’状态。在主节点上,应用程序应能运行和访问drbd设备(/dev/drbd*)。每次写入都会发往本地磁盘设备和从节点设备中。从节点只能简单地把数据写入它的磁盘设备上。 读取数据通常在本地进行。 如果主节点发生故障,心跳(heartbeat或corosync)将会把从节点转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。如果发生故障的节点恢复工作,它就会成为新的从节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。

    三、DRBD 与 HA 集群

    大部分现行高可用性集群使用的是共享存储器,因此存储器连接多个节点(用共享的SCSI 总线或光纤通道就可以做到)。DRBD 也可以作为一个共享的设备,但是它并不需要任何不常见的硬件。它在IP 网络中运行,而且在价格上IP 网络要比专用的存储网络经济的多。目前,DRBD 每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群来讲已经足够用了。现在的版本将支持两个节点同时进行读写存取。这很有用,比如对GFS 来讲就是如此。兼容性DRBD可以在IDE、SCSI 分区和整个驱动器之上运行,但不能在回路模块设备上运行。DRBD 也不能在回送网络设备中运行。因为它同样会发生死锁:所有请求都会被发送设备占用,发送流程也会阻塞在sock_sendmsg()中。有时,接收线程正从网络中提取数据块,并试图把它放在高速缓存器中;但系统却要把一些数据块从高速缓存器中取到磁盘中。这种情况往往会在接收器的环境下发生,因为所有的请求都已经被接收器块占用了。

    四、DRBD 复制模式

    • 协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。
    • 协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。
    • 协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。
    • 一般用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境中还是用C协议。

    五、DRBD 的安装与配置

    • 实验环境:
      注:不做特别说明的话就是主从节点都要进行操作,时间同步提前做好(hostname一定要修改)
      操作系统:CentOS 6.9
      软件版本:drbd84
      master节点:192.168.1.14(node1.cloud.com)
      slaver 节点:192.168.1.15(node2.cloud.com)

    1.添加drbd的yum源(163,阿里,epel源中没有drdb的rpm包)

    #在 /etc/yum.repos.d/CentOS-Base.repo 文件中添加以下内容
    [elrepo]
    name=CentOS-$releasever elrepe
    failovermethod=priority
    baseurl=http://elrepo.org/linux/elrepo/el6/x86_64/
    gpgcheck=0 
    
    1. 安装
    yum makecache
    yum install drbd84-utils kmod-drbd84
    

    检验是否安装成功

    lsmod | grep -i drbd
    
    安装成功的结果
    1. 配置文件
    # /etc/drbd.d/global_common.conf
    global {
        usage-count yes; # 是否参加DRBD使用者统计。默认是yes
    }
    
    common {
        protocol C;# 传输协议采用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;
        }
    
        disk {
            on-io-error detach;#发生I/O错误的节点将放弃底层设备,以 diskless mode继续工作
        }
    }
    
    # /etc/drbd.d/test1.res
    resource test1 {
        # 每个主机的说明以“on”开头,后面是主机名
        on node1.cloud.com {
            device /dev/drbd1; # 定义drdb的设备名
            disk /dev/sdb; # /dev/drbd0使用的磁盘分区是/dev/sdb1
            address 192.168.1.14:7789; # 设置DRBD的监听端口,用于与另一台主机通信
            meta-disk internal;# 定义metadata的存储方式,有2种
        }   
        on node2.cloud.com {
            device /dev/drbd1;
            disk /dev/sdb;
            address 192.168.1.15:7789;
            meta-disk internal;
        }   
    }
    

    转载:DRBD 配置文件详解

    1. 测试
    • 分别在两台主机上创建供DRBD记录信息的数据块:
    drbdadm create-md test1
    # 报错的话试着用以下方式解决
    # dd if=/dev/zero of=/dev/sdb bs=1M count=1
    
    • 启动程序,并且设置主节点
    /etc/init.d/drbd start
    drbdadm -- --overwrite-data-of-peer primary test1#设置主节点
    
    • 格式化磁盘病进行挂载(在主节点进行,)
    mkfs.ext4 /dev/drbd1
    mount /dev/drbd1 /drbd 
    
    • 同步测试
      主节点执行:cp -a /var/cache/yum /drbd/
      命令执行完成后关闭从节点的drbd服务,挂载从节点/dev/sdb到随意目录下,查看结果
    测试结果

    六、模拟DRBD主节点出问题,从节点转为主节点后,主节点又正常

    1. 关闭主节点IP(node1 为主节点)
    主节点状态 从节点状态
    1. 把从节点升级为主节点,并查看状态
    第二步操作
    1. 恢复主节点IP地址,查看drbd状态
    主节点状态 从节点状态
    1. 恢复同步断掉前的状态(node1为主,node2为从)
    node2 进行的操作 node1 进行的操作 再次查看 node2 的 drbd 状态

    七、keepalived + DRBD + NFS 构建存储节点HA

    实验拓扑结构
    1. node1 节点进行的操作(三台服务器先进行时间同步,用到的脚本具体看文末)
       ①、配置keepalived(keepalived.conf)
    ! Configuration File for keepalived
    global_defs {
        router_id node1
    }
    vrrp_script chk_nfs {
        script "/etc/keepalived/check_nfs.sh" # 监测 NFS 状态的脚本
        interval 5
    }
    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100 
        advert_int 1
    
        authentication {
            auth_type PASS
            auth_pass 1111
        }   
    
        track_script {
            chk_nfs
        }   
    
        notify_stop /etc/keepalived/notify_stop.sh         # keepalived 停掉时执行的脚本
    
        notify_master /etc/keepalived/notify_master.sh     # keepalived 角色转变为 master 时执行的脚本
    
        virtual_ipaddress {
            192.168.1.200
        }   
    }
    

     ②、配置 DRBD 和 NFS

    #DRBD 配置
    # cat /etc/drbd.d/global_common.conf 
    global {
        usage-count yes;
    }
    
    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 {
        }
    
        options {
        }
    
        disk {
            on-io-error detach;
        }
    
        net {
        }
    }
    ########################################################################################
    # cat /etc/drbd.d/test1.res 
    resource test1 {
        on node1.cloud.com {
            device /dev/drbd1;
            disk /dev/sdb;
            address 192.168.1.14:7789;
            meta-disk internal;
        }   
        on node2.cloud.com {
            device /dev/drbd1;
            disk /dev/sdb;
            address 192.168.1.15:7789;
            meta-disk internal;
        }   
    }
    ########################################################################################
    # NFS 配置
    # cat /etc/exports 
    /drbd  192.168.1.0/24(rw,insecure,sync,all_squash,anonuid=65534,anongid=65534)
    
    1. node2 节点进行的操作
       ①、配置keepalived(keepalived.conf)
    ! Configuration File for keepalived
    global_defs {
        router_id node2
        }   
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 51
        priority 90
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }   
        notify_master /etc/keepalived/notify_master.sh     # 切换为 Master 时执行的脚本
        notify_backup /etc/keepalived/notify_backup.sh     # 切换为 BackUp 时执行的脚本
        virtual_ipaddress {
            192.168.1.200
        }   
    }
    

     DRBD 和 NFS 配置基本一致,不再贴配置文件

    1. 开启服务 client 端进行写入测试
    clent 端进行写入测试

    现在关闭 node1 的 keepalived 服务,看写入是否正常

    ndoe1 关闭keepalived服务后各个服务的状态 node2上个服务的状态,NFS自动启动,DRBD自动切换为主

    大约2分钟之后,写入继续在node2上进行


    附录:keepalived + NFS + DRBD 配置文件

    相关文章

      网友评论

          本文标题:Linux 数据镜像软件 DRBD

          本文链接:https://www.haomeiwen.com/subject/krvlyxtx.html