drdb介绍:
前面介绍了MySQL高可用heartbeat部署,可以实现web应用的高可用,但是实现数据库的高可用单纯heartbeat难以实现,需要借助drbd来同步数据。
drdb(Distributerd Replicates Block Device)是基于块设备同步,粒度更小,效率更高。
其工作原理类似于rsync+ibotify同步原理,只不过drbd是基于块级别(可以是磁盘分区,lvm逻辑卷或磁盘),rsync+inotify是基于文件系统级别的同步。
drbd官网:www.drbd.org
drbd同步方式:
实时同步模式:
数据写入本地磁盘—>写入远端磁盘–>返回成功。drbd协议C支持此种方式,
异步同步模式:
数据写入本地磁盘–>返回成功。drbd协议a,协议b支持此种方式
drbd的3种同步复制协议:
协议a:异步复制,本地写入磁盘成功后即返回,数据有可能会丢失
协议b:内存同步(半同步)复制协议。本地写入磁盘成功后滨江数据发送到远端后立即返回,不管远端是否成功写入。
协议c:同步复制协议。本地数据写入次哦按成功后并把数据发送到远端,远端数据写入成功后才返回。
drbd生产环境应用模式:
单主模式:主备模式
复主模式:一般需要共享cluster File System,如 GFS和OCFS2。
应用场景:
heartbeat+drbd+nfs/mfs/gfs
heartbeat+drbd+mysql/oracle
其他相关同步工具介绍:rsync(lsyncd,sersync,inotify),nfs,union(双机同步),csync2(多机同步),drbd。
drbd部署
环境准备
主备模式
Centos5.4自带drbd8.3版本,Centos6.4自带drbd8.4版本。
网络配置
———————————————————————————
master eth0 10.0.0.7 外网地址,数据转发 |
eth1 172.16.1.7 内网地址,数据转发 |
eth2 10.0.10.7 心跳线 |
vip 10.0.0.17 虚拟地址,对外提供服务 |
——————————————————————————
slave eth0 10.0.0.8
eth1 172.16.1.8
eth2 10.0.10.8
vip 10.0.0.18
——————————————————————————
我自己环境配置
node1:
eth0 10.37.2.100 //管理地址
eth1 192.168.52.106//心跳线
vip 10.37.2.240 //vip
node2:
eth0 10.37.2.111
eth1 192.168.52.103
vip 10.37.2.241
配置主机名 (跟配置heartbeat一样)
配置主机解析名(跟配置heartbeat一样)
添加主机路由 (跟配置heartbeat一样)
添加磁盘格式化分区
注意:备机磁盘大小要比主机大。sdb1存放数据,数据分区可以分配大点,sdb2存放drbd状态信息,分区一般给1~2G。
创建文件系统 mkfs.ext3 /dev/sdb1 –此步骤双节点都需要执行
tune2fs -c -1 /dev/sdb1 –此步骤双节点都需要执行
partprobe –此步骤双节点都需要执行
注意 sdb2 不需要创建文件系统,sdb2存放drbd原始数据,sdb1存放数据文件。
fidks不支持超过2T磁盘格式化,可以使用parted来分区
安装
yum 安装
更新镜像源
wget -q http://elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm
[root@node1 ~]# yum -y install gcc kernel-devel kernel-headers flex
[root@node1 ~]# yum install drbd kmod-drbd84 -y
或
编译安装
[root@node1 ~]# wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum -y install gcc kernel-devel kernel-headers flex
mkdir -p /home/drbd
export LC_ALL=C
http://www.drbd.org/download/drbd/8.4/archive/drbd-8.4.4.tar.gz
tar -xvf drbd-8.4.4.tar.gz
./configure –prefix=/home/drbd –with-km –with-heartbeat –sysconfdir=/etc/
–with-km 允许内核加载
drbd是在内核层面工作的,所以需要加载内核参数
ls -l /usr/src/kernels/(uname−r)cd/home/drbd/drbd−8.4.4makeKDIR=/usr/src/kernels/(uname -r) //指定内核源码路径
make install //安装内核参数
[root@node2 drbd-8.4.4]# modprobe drbd
[root@node2 drbd-8.4.4]# lsmod |grep drbd
重启后内核加载会丢失需要手工启动,当然可以放到rc.local让系统自动加载
[root@node2 rc.d]# vi /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
route add -host 192.168.52.106 dev eth1
modprobe drbd
配置文件
/etc/drbd.conf
##全局配置
global {
usage-count yes; ##是否允许被统计
# minor-count dialog-refresh disable-ip-verification
}
common {
syncer {
rate 10M;##同步速度10兆
verify-alg crc32c;##验证算法
}
}
resource data {
protocol C;##同步协议
disk {
on-io-error detach;##出现io错误处理方法
}
on node1 {
device /dev/drbd0; ##drbd逻辑设备
disk /dev/sdb1; ##数据分区
address 10.0.10.7:7788; ##drbd同步地址
meta-disk /dev/sdb2[0]; ##drbd数据分区
}
on node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 10.0.10.8:7788;
meta-disk /dev/sdb2[0];
}
}
初始化
drbdadm create-md data
启动
[root@node1 drbd-8.4.4]# drbdadm up data
报错1:
/home/drbd/var/run/drbd: No such file or directory
/home/drbd/var/run/drbd: No such file or directory
解决:–mkdir-p /home/drbd/var/run/drbd
报错2:
[root@node2 etc]# drbdadm create-md data
Writing meta data…
md_offset 0
al_offset 4096
bm_offset 36864
Found ext3 filesystem
This would corrupt existing data.
If you want me to do this, you need to zero out the first part
of the device (destroy the content).
You should be very sure that you mean it.
Operation refused.
Command ‘drbdmeta 0 v08 /dev/sdb1 0 create-md’ terminated with exit code 40
解决:dd if=/dev/zero of=/dev/sdb1 bs=1M size=100;
查看
[root@node1 drbd-8.4.4]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node1, 2017-08-30 11:34:17
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:8546580
如果两台主机发生脑裂,查看心跳地址;dbrd配置文件配置的心跳地址是否在正确;查看静态路由表是否配置。
到目前为止,drbd处于无主状态,接下来设置主备角色同步数据
drbdadm primary –force data //设置本地为主库,覆盖备库数据
[root@node1 drbd-8.4.4]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node1, 2017-08-30 11:34:17
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:841104 nr:0 dw:0 dr:841776 al:0 bm:51 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:7705476
[>...................] sync'ed: 9.9% (7524/8344)M
finish: 0:03:54 speed: 32,788 (29,000) K/sec
问题1:
主节点:
[root@node1 /]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node1, 2017-08-30 11:34:17
0: cs:StandAlone ro:Secondary/Unknown ds:UpToDate/DUnknown r-----
ns:8546716 nr:0 dw:152 dr:8547617 al:3 bm:523 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:8
备节点:
[root@node2 ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node2, 2017-08-30 11:32:34
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown 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:0
解决:以上可见,主备不同步,我们可以尝试如下
备节点执行:
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary data
[root@node2 ~]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node2, 2017-08-30 11:32:34
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:0 nr:0 dw:0 dr:672 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
备节点执行:
[root@node2/]# drbdadm secondary data
[root@node2 /]# drbdadm – –discard-my-data connect data
[root@node1 /]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node1, 2017-08-30 11:34:17
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:8 dw:160 dr:8547617 al:3 bm:525 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
至此问题解决。
如果主备同步出现问题,可以在备机尝试 drbdadm secondary data , drbdadm – –discard-my-data connect data;主节点上执行 drbdadm connect data ,cat /etc/proc/drbd 查看日志同步状态。
主备节点同步成功,查看日志,状态应该如下
[root@node2 etc]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@node2, 2017-08-30 11:32:34
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:8546580 dw:8546580 dr:0 al:0 bm:522 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
drbd参数解析:
cs(connect status) 连接状态
ro(roule)角色
ds(disk status)磁盘状态
ns(network send)网络发送
nr(network receive)网络接收
dw(disk write)磁盘写
dr(disk read)磁盘读
al(activity log)Number of updates of activity log of the meta data.
bm(bit map)Number of update of bitmap of the meta data.
lo(local count)Number of open request to lcoal i/o sub-system issued by drbd.
pe(pending)请求发送到对端短时还没应答
同步数据:
drbd是通过逻辑设备同步数据,可以在主节点创建一个目录然后挂载到主节点的逻辑设备,在备机可以看到同步过来的文件。
[root@node1 data]# mkdir /data
[root@node1 data]# mount /dev/drbd0 /data //这里要挂载drbd逻辑设备
[root@node1 data]# touch /data `seq 10`
备节点:
备节点需要先停止drbd才能正常挂载目录(一个设备只能有一个挂载点,drbd实际上也是一个挂载动作),且这个目录不能是drbd逻辑设备而是物理设备。
[root@node2 /]# drbdadm down data
[root@node2 /]# mount /dev/sdb1 /mnt/
[root@node2 /]# ls -l /mnt/
[root@node2 /]# drbdadm up data
[root@node2 /]# cat /proc/drbd
注意事项:
fdisk 磁盘只是重写MBR分区表,并没有把实际数据擦除释放空间。在drbd生产环境中这有可能导致主节点同步过来的数据在备节点上显示跟实际不匹配,主节点同步过来的/dev/drbd0逻辑设备 跟备节点本地 /dev/sdb2容量不一致。