DRBD简介

    DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。


DRBD工作

   (DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。


DRBD与HA的关系

   一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错。


DRBD复制模式

协议A:

   异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点

协议B:

   内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘

协议C:

   同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议


环境需求(Centos7

IP:10.0.0.129  zxb2

IP:10.0.0.130  zxb3


配置过程

1.修改/etc/hosts文件和hostname确保可以访问

[root@zxb2 ~]# cat /etc/hosts
10.0.0.129  zxb2
10.0.0.130  zxb3

[root@zxb2 ~]# hostnamectl set-hostname zxb2

[root@zxb3 ~]# cat /etc/hosts

10.0.0.129  zxb2
10.0.0.130  zxb3

[root@zxb3 ~]# hostnamectl set-hostname zxb3


2.修改ssh使之互信

[root@zxb2 ~]# ssh-keygen

[root@zxb2 ~]#ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

3.设置时钟同步(每5分钟同步一次)

[root@zxb2 ~]crontab -l

*/5 * * * * ntpdate cn.pool.ntp.org

[root@zxb3 ~]crontab -l

*/5 * * * * ntpdate cn.pool.ntp.org


4.安装drbd

[root@zxb2 ~]#cd /etc/yum.repos.d/

[root@zxb2 ~]#rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

[root@zxb2 ~]#rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

[root@zxb2 ~]#yum install -y kmod-drbd84 drbd84-utils


[root@zxb3 ~]#cd /etc/yum.repos.d/

[root@zxb3 ~]#rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

[root@zxb3 ~]#rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

[root@zxb3 ~]#yum install -y kmod-drbd84 drbd84-utils


5、主配置文件

/etc/drbd.conf #主配置文件

/etc/drbd.d/global_common.conf#全局配置文件

 

6、查看主配置文件

[root@node1 ~]# cat/etc/drbd.conf

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

include"drbd.d/global_common.conf";

include"drbd.d/*.res";


7.修改局配置文件,并说明

[root@zxb2 ~]# cat /etc/drbd.d/global_common.conf

global {
   usage-count no;#是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量
    # minor-count dialog-refresh disable-ip-verification
}
common {
   protocol C;      #使用DRBD的同步协议
   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";
    }
   startup {
       # wfc-timeout degr-wfc-timeoutoutdated-wfc-timeout wait-after-sb
    }
   options {
       # cpu-mask on-no-data-accessible
    }
   disk {
       on-io-error detach; #配置I/O错误处理策略为分离
       # size max-bio-bvecs on-io-error fencingdisk-barrier disk-flushes
       # disk-drain md-flushes resync-rate resync-afteral-extents
       # c-plan-ahead c-delay-target c-fill-targetc-max-rate
       # c-min-rate disk-timeout
    }
   net {
 
       # protocol timeout max-epoch-sizemax-buffers unplug-watermark
       # connect-int ping-int sndbuf-sizercvbuf-size ko-count
       # allow-two-primaries cram-hmac-algshared-secret after-sb-0pri
       # after-sb-1pri after-sb-2pri always-asbprr-conflict
       # ping-timeout data-integrity-alg tcp-corkon-congestion
        #congestion-fill congestion-extents csums-alg verify-alg
       # use-rle
    }
   syncer {
       rate 1024M;    #设置主备节点同步时的网络速率
    }
}

注释: on-io-error 策略可能为以下选项之一

detach 分离:这是默认和推荐的选项,如果在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下

pass_on:DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,但是在此节点上就往往忽略(因此此节点上没有可以报告的上层)

-local-in-error:调用本地磁盘I/O处理程序定义的命令;这需要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误定义一个资源


8.分别在两台机器上各添加一块硬盘,并分区

[root@zxb2 ~]# fdisk /dev/sdb

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   8e  Linux LVM

[root@zxb3 ~]# fdisk /dev/sdb

   设备 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     2099199     1048576   8e  Linux LVM


9.创建配置文件

[root@zxb2 ~]# cat /etc/drbd.d/mysql.res
resource mysql { #资源名称
protocol C; #使用协议
meta-disk internal;
device /dev/drbd1;#DRBD设备名称

syncer {
verify-alg sha1;#加密算法

}
net {
allow-two-primaries;
}
on zxb2 {
disk /dev/sdb1; #drbd1使用的磁盘分区为"mysql"

address 10.0.0.129:7789;
}
on zxb3 {
disk /dev/sdb1;
address 10.0.0.130:7789;
}
}

10.然后把配置文件copy到对面的机器上

[root@zxb2 ~]# scp -rp /etc/drbd.d/* zxb3:/etc/drbd.d/


11.在zxb2上面启动

[root@zxb2 ~]# drbdadm create-md mysql

initializing activity log

initializing bitmap (160 KB) to all zero

Writing meta data...

New drbd meta data block successfullycreated.

[root@zxb2 ~]# modprobe drbd  #查看内核是否已经加载了模块:

[root@zxb2 ~]# drbdadm up mysql

[root@zxb2 ~]#  drbdadm --force primary mysql

[root@zxb2 ~]# cat /proc/drbd  #查看状态

version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22
 1: cs:Connected ro:Primary/Unknown ds:UpToDate/Unknown C r-----
    ns:2136 nr:1099935 dw:1102071 dr:12794 al:11 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


##有可能报错,更新内核,重启即可

[root@zxb2 ~]# drbdadm create-md mysql

modinfo: ERROR: Module drbd not found.

drbd.d/global_common.conf:69: Parse error: 'a syncer option keyword' expected,

but got 'rate'

##解决方法:yum install gcc gcc-c++ make glibc flex kernel kernel-devel kernel-headers



12.在对端节点(zxb3)执行

root@zxb3  ~]# drbdadm create-md mysql

[root@zxb3 ~]# modprobe drbd

[root@zxb3 ~]# drbdadm up mysql
[root@zxb3 ~]# cat /proc/drbd   #查看同步数据后状态

##[====>...............] sync'ed: 29.0%

version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:22

 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:1099935 nr:2136 dw:53563 dr:1052363 al:18 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0


13.创键挂载目录,格式化drbd

[root@zxb2 ~]# mkdir /data

[root@zxb2 ~]# mkfs.xfs /dev/drbd1


14.安装mysql,修改mysql的配置文件,数据指向/data,并授权/data

[root@zxb2 ~]# yum install -y mariadb mariadb-server
[root@zxb2 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data
[root@zxb2 ~]# chown mysql:mysql -R /data


15.挂载/data,启动数据库,并查看有无数据

[root@zxb2 ~]# mount /dev/drbd1 /data

[root@zxb2 ~]# systemctl start mariadb

[root@zxb3 data]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root   17G  3.3G   14G   20% /
devtmpfs             478M     0  478M    0% /dev
tmpfs                489M     0  489M    0% /dev/shm
tmpfs                489M  6.7M  482M    2% /run
tmpfs                489M     0  489M    0% /sys/fs/cgroup
/dev/sda1           1014M  197M  818M   20% /boot
tmpfs                 98M     0   98M    0% /run/user/0
/dev/drbd1          1021M   62M  960M    7% /data


[root@zxb3 ~]# cd /data/
[root@zxb3 data]# ls
aria_log.00000001  aria_log_control  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test


####要想使得从可以挂载,我们必须,先把主切换成,然后再到从上面挂载


1.停止主的数据库,并取消挂载

[root@zxb ~]# systemctl stop mariadb
[root@zxb2 ~]# umount /data


2.将primary修改为secondary

[root@zxb2 ~]# drbdadm secondary mysql
[root@zxb2 ~]# drbdadm status

mysql role:Secondary
  disk:UpToDate
  peer role:Primary
  replication:Established peer-disk:UpToDate



1.将secondary修改为primary

[root@zxb3 ~]# drbdadm status
mysql role:Primary 

disk:UpToDate

peer role:Secondary
replication:Established peer-disk:UpToDate


2.创键挂载目录,并授权/data

[root@zxb3 ~]# mkdir /data

[root@zxb3 ~]# chown mysql:mysql -R /data


3.安装mysql,修改mysql的配置文件,数据指向/data

[root@zxb3 ~]# yum install -y mariadb mariadb-server
[root@zxb3 ~]# cat /etc/my.cnf
[mysqld]
datadir=/data

4.启动数据库,查看/data是否有数据

[root@zxb3 ~]# systemctl start mariadb

[root@zxb3 data]# ls
aria_log.00000001  aria_log_control  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  test


!!!