Drbd(Distributed Replicated Block Device)为分布式复制块设备 是内核中的一个模块,要想让其工作起来要借助drbdadm等命令工具


  Drbd类似于Raid1(mirror模式),但是Raid1的磁盘位于同一个主机上,通过总线直接连接主机,且两块磁盘必须一样大,因为所谓的镜像是按位对应同步存储的,Raid有控制芯片叫控制器(Controller),直接内置在在主板上;而通过PCI插槽提供的叫适配器(adaptor)


  Drbd将位于两个主机上的不同磁盘或分区做成镜像设备,当向主节点写入时,会通过TCP/IP协议从网络上复制一份存储在备节点上


Drbd只允许两个节点,主从(primary/secondary)

主节点可以进行读写操作;而从节点不能挂载文件系统,不能进行读写

但是主从角色可以切换,且可以借助HA集群+集群文件系统构成双主模型



DRBD结构图


wKioL1g1kSKSavtPAARzd46UGxg515.png

  Drbd工作流程图分析:service服务,File System是任何进程要读取磁盘,都要向内核发起文件系统级别的调用来实现,文件系统能把数据等存入磁盘。Buffer Cache是service将数据缓存在内存中,并由Disk Scheduler取出调度排序,发往Disk Driver支配Disk Storage存储。而Raw Device则是不经由文件系统调用,直接块级别存储。DRBD则是直接在内核空间的内存与硬盘驱动之间加入一层,将从Buffer Cache提取的数据镜像一份,源数据继续经由Disk Driver支配Disk Storage存储,而镜像的数据经由TCP/IP网络通过本地网卡发往从drbd主机的drbd层交由Disk Driver支配Disk Storage存储。

 

   DRBD的用户空间管理工具,用于管理主从drbd节点。主要使用drbdadm命令,因其更符合用户的使用习惯。而drbdsetup和drbdmeta为较接近底层的设备,所以使用较少。

   DRBD的工作特性:实时,透明,设置数据同步类型




Drbd协议类型

A:数据发出去不管对方有没有收到(异步)性能好可靠性差

B:半同步

C: 数据发出去后要管对方收到后再发(同步)可靠性好但性能差


Drbd资源:定义Drbd的各种必须设置


1:资源名称

2:Drbd设备一般为/dev/drdbX 其主设备号为147,次设备号从0开始用于区分同一类型的不同设备

3:磁盘或者分区,在双方节点上,各自提供的存储设备

4:网络设备的配置,双方数据同步时所使用的网络属性如:是否加密,带宽多少。。。


命令

drbdadm 一个管理工具,配置文件为 /etc/drbd.conf 或/etc/drbd.d/*

Drbd的官方站点 https://www.linbit.com/


安装 Drbd + Corosync 实现高可用的MySql

 drbd的rpm在内核版本2.6.33以上才自动加入内核功能,本文的系统版本为CentOS6.7,内核版本为2.6.32-573.el6.x86_64,所以要想使用drbd,只能编译源码,或是使用三方提供的rpm包。

[root@www mail]# uname -r  %%而红帽6是2.6.32的内核,最好使用第三方的RPM包

2.6.32-573.el6.x86_64


ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/ 


直接用yum源安装drbd
CentOS 6.x

[root@www mail]rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm

[root@www mail]yum -y install drbd83-utils kmod-drbd83

CentOS 7.x

[root@www mail]rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm


[root@www mail]yum install -y drbd84-utils kmod-drbd84

加载模块:
[root@www mail]modprobe drbd


准备一个大小为1G的/dev/sda5分区,但不要格式化

[root@www drbd-8.4.3]# vim /etc/drbd.conf %%drbd的配置文件

# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

include "drbd.d/global_common.conf"; %包含drbd.d/global_common.conf文件
include "drbd.d/*.res"; %包含drbd.d/*.res,所有res结尾的文件都独立第一了一个drbd资
                        %源



[root@www drbd-8.4.3]# vim /etc/drbd.d/global_common.conf  %%此文件为主配置文件的一部分


global {   %global段为全局配置,#开头则没有启用

        usage-count yes; %收集用户的drbd装机信息

        # minor-count dialog-refresh disable-ip-verification

}


common {  %common段为不同的Drbd资源定义默认属性

        protocol C; %默认的Drbd协议类型为C(同步)


        handlers {

                # These are EXAMPLE handlers only.

                # They may have severe implications,

                # like hard resetting the node under certain circumstances.

                # Be careful when chosing your poison. 

              %%启动以下三项

                 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 degr-wfc-timeout outdated-wfc-timeout wait-after-sb

        }


        disk {      on-io-error detach; %%节点故障就移除

                # on-io-error fencing use-bmbv no-disk-barrier no-disk-flushes

                # no-disk-drain no-md-flushes max-bio-bvecs


        }


        net {    

                cram-hmac-alg "sha1"; %数据同步时要加密,加密算法为sha1

                shared-secret "mydrbdlab"; %加密的共享密钥,可以自己生成一段随机数

                # sndbuf-size rcvbuf-size timeout connect-int ping-int ping-timeout max-buffers

                # max-epoch-size ko-count allow-two-primaries cram-hmac-alg shared-secret

                # after-sb-0pri after-sb-1pri after-sb-2pri data-integrity-alg no-tcp-cork

        }


        syncer {

               rate 100M; %数据同步的带宽为100M

        }

}


要想知道更多的参数可以

[root@www drbd-8.4.3]# man drbd.conf


这样主配置文件就配置好了,接下来定义Drbd资源

[root@www drbd-8.4.3]# vim /etc/drbd.d/mydrbd.res


 resource web { %%web为自己定义的Drbd资源名称

            on www.rs1.com{ %%定义节点rs1

                  device  /dev/drbd0;%%在rs1上drbd设备名为drbd0,一般从0排起

                  disk /dev/sda5; %%在rs1上磁盘为sda5

                  address 192.168.139.2:7789; %%drbd监听在rs1的7789端口

                  meta-disk internal; %%drbd的元数据就在本节点内部

                            }


            on www.rs2.com{ %%定义节点rs2

                  device  /dev/drbd0;

                  disk /dev/sda5;

                  address 192.168.139.4:7789;

                  meta-disk internal;

                            }

              }

[root@www drbd-8.4.3]# scp -r /etc/drbd.* rs2:/etc/ %%将配置文件及其资源定义的文件复制到节                                    %%点rs2上

drbd.conf                  0.1KB/s   00:00    

global_common.conf            1.3KB/s   00:00    

mydrbd.res                  0.6KB/s   00:00    



在两个节点上初始化资源

 192.168.139.2

[root@www drbd-8.4.3]# drbdadm create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap

New drbd meta data block successfully created.


192.168.139.4

[root@www drbd-8.4.3]# drbdadm create-md web
Writing meta data...
initializing activity log
NOT initialized bitmap

New drbd meta data block successfully created.


192.168.139.2 和192.168.139.4两个节点同时启动drbd


[root@www drbd-8.4.3]# service drbd start
[root@www drbd-8.4.3] # service drbd start


 启动服务后两节点都处于Secondary状态,将其中一个节点设置为Primary

 192.168.139.2上

[root@www drbd-8.4.3] # drbdadm primary --force web
或者

[root@www drbd-8.4.3]# drbdadm -- --overwrite-data-of-peer primary web


查看状态信息


[root@www drbd-8.4.3] # drbd-overview %%查看状态信息
   0:mystore  SyncSource Primary /Secondary  UpToDate /Inconsistent  C r----- 

    [======>.............] sync'ed: 39.7% (3096/5128)M


 同步完毕,rs1为主,rs2为从

 [root@www drbd-8.4.3]# drbd-overview  %%查看状态信息

   0:mystore  Connected Primary /Secondary  UpToDate /UpToDate  C r----- 
   

也可使rs1为从节点,rs2为主节点


[root@www drbd-8.4.3] # drbdadm secondary web %%将192.168.139.2变为从节点

[root@www drbd-8.4.3]# drbdadm primary --force web %%将192.168.139.4变为主节点

 

格式化为ext4文件系统并分区

  [root@www drbd-8.4.3]# mke2fs -t ext4 /dev/drbd0

 挂载并测试drbd

[root@www drbd-8.4.3]# mount /dev/drbd0 /mnt %%将drbd0进行挂载
[root@www drbd-8.4.3] # cd /mnt
[root@www drbd-8.4.3] # cp /etc/hosts ./ %%复制文件测试
[root@www drbd-8.4.3] # ls %%挂载成功
hosts  lost+found


 这样一个简单的Drbd就制作完成

 如果用Corosync+Pacemaker再配置一个HA高可用集群,将Drbd配置成一个资源,就可以实现双主模型,或者实现主从节点自动切换(可以用crm命令配置)