标签:
Distributed Replicated Block Device(DRBD)是基于块设备在不同的高可用服务器对之间同步和镜像数据的软件,通过它可以实现在网络中的两台服务器之间基于块设备级别的实时或异步镜像或同步复制,其实就是类似于rsync+inotify(sersync)这样的架构项目软件。只不过DRBD是基于文件系统底层的,即block层级同步,而rsync是在文件系统之上的实际物理文件同步,因此DRBD效率更高、效果更好。相当于网络中的RAID1功能
提示:上面提到的块设备可以是磁盘分区、LVM逻辑卷、或整块磁盘等,DRBD的同步不能基于目录
官方介绍:http://drbd.linbit.com/home/what-is-drbd/
DRBD有以下几个特点
q DRBD是一种块设备
q 可用于高可用集群中(HA)
q 通过网络实现块设备数据实时镜像
q 类似于一个网络的raid-1
工作特点:
q DRBD工作在内核空间,它镜像复制的是二进制数据,这也是它速度快的根本原因
q DRBD至少需要两个节点来工作。
从上图我们可以清晰的看出drbd是以主从(Primary/Secondary)方式工作的,这点原理与mysql的主从复制的架构有些相似。主节点上的drbd提升为Primary并负责接收写入数据,当数据到达drbd模块时,一份继续往下走写入到本地磁盘实现数据的持久化,同时并将接收到的要写入的数据发送一分到本地的drbd设备上通过tcp传到另外一台主机的drbd设备上(Secondary node),另一台主机上的对应的drbd设备再将接收到的数据存入到自己的磁盘当中。这里与mysql的基于通过二进制日志完成数据的复制的确很相似,但是也有一些不同之处。比如:mysql的从节点不能写但是可以读,但是drbd的从节点是不能读、不能挂载。
因此,drbd对同一设备块每次只允许对主节点进行读、写操作,从节点不能写也不能读。这样感觉是不是对主机有资源浪费,的确HA架构中为了提供冗余能力是有资源浪费,但是你可以对上图的两台主机建立两个drbd资源并互为主从,这样两台机器都能利用起来,但是配置起来就复杂了。但是话又说回来,用drbd作为廉价的共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多,其性能与稳定性方面也还不错。
宕机接管原理图
DRBD同步模式有实时同步模式和异步同步模式,DRBD有3种复制协议,分别是A、B、C协议
q 协议A<异步>
即异步复制协议。当本地磁盘写入完成,并且拷贝数据包进入本地TCP发送缓冲区里后,就认为在主节点的本地写操作完成。这种模式,在发生强制故障转移的时候可能发生数据丢失的现象。协议A常用在长距离复制环境中。当它和DRBD代理结合使用的时候,它成为一个有效的灾难恢复解决方案。
q 协议B<异步>
即内存同步(半同步)复制协议。当本地磁盘写入发生,并且拷贝数据包到达对等层节点时,就认为在主节点中的本地写操作完成。正常情况下,在故障转移事件中,写入的数据不会丢失。然而,如果节点同时停电,主节点的数据存储将发生不可逆的损坏,大部分最近在主节点中写入完成的数据可能会丢失。
q 协议C<实时>
即实时同步复制协议。只有当本地磁盘和远程磁盘都确认写入完成时,就认为在主节点的本地写操作完成。结果,即使一个节点崩溃,也不会丢失任何数据。唯一丢失数据的可能是两个节点同时崩溃。
到目前为止,协议C是安装DRBD是最常使用的复制协议。选择协议将影响流量,从而影响网络延时
对于使用A、B协议要考虑丢失数据的风险,当数据写在缓冲区里面,没有真正写在磁盘上,系统崩溃会导致数据丢失,有些带电池的硬盘控制器,不但自带电池而且自带缓存,会在系统意外断电或崩溃后将最后的数据写入磁盘,这类控制器一般使用disk flush,从而保证性能的前提下提高数据安全性。
q 单主模式:即主备模式,典型的高可用性方案
q 复主模式:需要采用共享的cluster文件系统,如GFS、OCFS2,用于需要从2个或多个节点并发访问数据的场合,需要特别配置
生产场景中drbd常用于基于高可用服务器之间的数据同步解决方案。如:heartbeat+drbd+nfs/mfs/gfs,heartbeat+drbd+mysql/oracle等,实际上drbd可以配合任意需要数据同步的所有服务的应用场景
rsync(实时同步工具sersync,inotify,lsyncd)
scp/sftp
nc
搭建http/ftp/svn
nfs(网络文件系统)
union 双机同步
csync2 多机同步
软件自身同步机制(mysql,redis,oracle,ttserver,mongdb)
drbd
当心跳线路出现暂时性故障时,会导致两端都各自提升为Primary。当两端再次连通的时候,需要手工处理这种情况。
裂脑是一个因所有集群节点网络中断后产生的一种状态,可能原因有集群管理器的介入,热内错误,此时两个节点都会提升为主,这是一个潜在的非常有害的状态,这意味着数据的修改写到一端但是没有及时同步到对端,这样可能两端都会产生不同的数据,导致数据无法被合并
一种为自动处理方式,/etc/drbd.conf
Net{
Net:网络配置相关的内容,可以设置是否允许双主节点(allow-two-primaries)等
After-sb-0pri disconnect;
After-sb-1pri disconnect;
After-sb-2pri disconnect;
rr-conflict disconnect;
}
手动解决裂脑方法
1.在从节点slave node2上做如下操作
drbdadm secondary data
Drbdadm -- -- discard-my-data connect data <-放弃本地更新的数据再进行连接
2.在主节点master node1 上,通过cat /proc/drbd查看状态,如果不是WFConnection
Drbdadm connect data
提示:此处的data为DRBD的一个resource,可以理解一个同步的实例
假设有两台服务器node1、node2,ip分别为192.168.1.24/192.168.1.25
配置目标:两台服务器配置好drbd服务后,实现在node1上/dev/sdb分区上写入数据,数据会实时同步到node2上,一旦服务器node1机器宕机或硬盘损坏导致数据不可用,node2机器上的数据此时是node1机器上的一个完整备份。当然不光是是完整备份,还可以瞬间接替损坏数据或宕机的node1机器,实现数据的异机实时同步,从而达到数据高可用无业务影响的目的。
本实验模式为DRBD主备模式,即应用时只在主的一端写入数据,备的一端仅处于数据热备状态。备节点的drbd分区是不可见的,也就是处于非活动状态,不能人为写入数据。
多drbd分区主主的双向同步模式,实际生产环境,也可以配置成主主模式,即只在主的一端一个分区写入数据,备的一端仅处于数据同步热备状态,而在备端的另外一个分区可以做为主,原来主的一端的新分区作为备。
l DRBD服务通过直连线或以太网实现数据实时互相同步
l 两台存储服务器互相备份,正常情况下两端各提供一个主分区供NFS使用
l 存储服务器之间、存储服务器和交换机之间都是千兆网卡(bonding)
l 应用服务器通过NFS访问存储
提示:
在生产环境中,一般drbd服务不是孤立使用的,而是结合一些软件使用。如NFS、MFS等,NFS或MFS利用drbd的特性进行两台数据服务器间数据实时同步,再加上高可用工具Heartbeat,就可以实现共享存储服务器的高可用性。此时Heartbeat会通过串口线或直连线对存储服务器做健康检查,同时控制DRBD、NFS、VIP等资源动态切换,在一端服务器故障时,进行资源的自动转移。确保达到业务高可用的目的
实验环境需要添加一块网卡和一块磁盘,系统使用centos6.7 x86_64
名称 |
接口 |
IP |
用途 |
Node1(master) |
eth0 |
192.168.1.24 |
外网管理IP,用于WAN数据转发 |
eth1 |
10.25.25.16 |
用于服务器间心跳连接以及数据同步(直连) |
|
Node2 (slave) |
eth0 |
192.168.1.25 |
外网管理IP,用于WAN数据转发 |
eth1 |
10.25.25.17 |
用于服务器间心跳连接以及数据同步(直连) |
生产环境一般心跳连接和数据同步分两个网卡处理,网卡配置与heartbeat一样
l iptables配置
l selinux 关闭
l 配置主机名hosts
[root@node1 ~]# /sbin/route add -host 10.25.25.17 dev eth1
[root@node1 ~]# echo ‘/sbin/route add -host 10.25.25.17 dev eth1‘ >>/etc/rc.local
[root@node2 ~]# /sbin/route add -host 10.25.25.16 dev eth1
[root@node2 ~]# echo ‘/sbin/route add -host 10.25.25.16 dev eth1‘ >>/etc/rc.local
可以通过route –n查看
q 给虚拟机添加硬盘
[root@node1 ~]# fdisk –l
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
[root@node2 ~]# fdisk -l
Disk /dev/sdb: 5905 MB, 5905580032 bytes
255 heads, 63 sectors/track, 717 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
q 对磁盘进行分区
分区规范
Device |
Mount point |
预期大小 |
作用 |
/dev/sdb1 |
Meta data 分区 |
1-2G |
存放drbd同步状态信息 |
/dev/sdb2 |
/data |
其他所有空间 |
存放数据文件 |
注意:
meat data分区不能建立格式化文件系统
分好的分区不能现在就挂载
生产环境drbd meta data分区一般大小1-2G,也可以不单独分区和数据分区一起使用
[root@node1 ~]# yum install parted –y 安装磁盘分区工具
[root@node2 ~]# yum install parted –y
[root@node1 ~]# parted /dev/sdb
GNU Parted 2.1
Using /dev/sdb
Welcome to GNU Parted! Type ‘help‘ to view a list of commands.
(parted) mklabel
New disk label type? gpt
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted) mkpart
Partition name? []? meta_data
File system type? [ext2]?
Start? 1
End? 1000M
(parted) mkpart
Partition name? []? data
File system type? [ext2]?
Start? 1000M
End? -1
(parted) p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 1000MB 1000MB meta_data
2 1000MB 5368MB 4367MB data
也可以无交互分区
parted /dev/sdb mklabel gpt yes
parted /dev/sdb mkpart primary ext4 0 1000 ignore
parted /dev/sdb mkpart primary ext4 1001 -1 Yes ignore
parted /dev/sdb p
node2也按此方法创建分区
[root@node1 ~]# mkfs.ext4 /dev/sdb2 格式化分区
[root@node2 ~]# mkfs.ext4 /dev/sdb2
[root@node1 ~]# mkdir /meta_data
[root@node1 ~]# mkdir /data
[root@node2 ~]# mkdir /meta_data
[root@node2 ~]# mkdir /data
q 检查meta分区是否正常
[root@node1 ~]# mount /dev/sdb1 /meta_data/
mount: you must specify the filesystem type
[root@node2 ~]# mount /dev/sdb1 /meta_data/ 无文件系统
mount: you must specify the filesystem type
q 源码安装
[root@node1 ~]# yum install kernel-devel kernel-headers –y 安装内核相关包
[root@node1 drbd-9.0.1-1]# ls -ld /usr/src/kernels/$(uname -r) 查看内核源码包
drwxr-xr-x 22 root root 4096 Apr 9 16:35 /usr/src/kernels/2.6.32-573.22.1.el6.x86_64
[root@node1 ~]# wget http://www.drbd.org/download/drbd/9.0/drbd-9.0.1-1.tar.gz
[root@node1 ~]# tar -xf drbd-9.0.1-1.tar.gz
[root@node1 ~]# cd drbd-9.0.1-1
[root@node1 drbd-9.0.1-1]# ./configure --prefix=/usr/local/drbd --with-km --with-heartbeat --syscon\=/etc/ 8.4.5之前的版本要./configure,之后的直接make就行
[root@node1 drbd-9.0.1-1]# make KDIR=/usr/src/kernels/$(uname -r)/ 编译
[root@node1 drbd-9.0.1-1]# echo $? 检查是否有错
0
[root@node1 drbd-9.0.1-1]# make install 安装
[root@node1 drbd-9.0.1-1]# echo $?
0
[root@node1 drbd-9.0.1-1]# ls /lib/modules/$(uname -r)/updates 安装成功会生成drbd.ko文件
drbd.ko drbd_transport_tcp.ko
q yum安装,生产环境使用
[root@node1 ~]# yum install kernel-devel kernel-headers –y
[root@node1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
[root@node1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@node1 ~]# yum install drbd kmod-drbd84 –y
[root@node1 ~]# rpm -qa drbd84-utils kmod-drbd84
drbd84-utils-8.9.5-1.el6.elrepo.x86_64
kmod-drbd84-8.4.7-1_1.el6.elrepo.x86_64
node2也这样安装就行
主机名称 |
Node1.cn |
Node2.cn |
管理IP |
eth0 192.168.1.24 |
eth0 192.168.1.25 |
DRBD管理名称 |
Data |
data |
DRBD挂载目录 |
/data |
/data |
DRBD逻辑设备 |
/dev/drbd0/ |
/dev/drbd0/ |
对接IP
|
eth1 10.25.25.16/24 |
eth1 10.25.25.17/24 |
DRBD存储设备 |
/dev/sdb2 |
/dev/sdb2 |
DRBD meta 设备 |
/dev/sdb1[0] |
/dev/sdb1[0] |
NFS导出目录 |
/data |
/data |
NFS虚拟IP |
192.168.1.16 |
192.168.1.17 |
灰底部分都是heartbeat控制的
[root@node1 ~]# lsmod | grep drbd
[root@node1 ~]# modprobe drbd
[root@node1 ~]# lsmod | grep drbd
drbd 466379 0
libcrc32c 1246 1 drbd
[root@node1 ~]# echo "modprobe drbd" >> /etc/rc.local
或者使用下面方法
[root@node1 ~]# echo "modprobe drbd" >> /etc/sysconfig/modules/drbd.modules
[root@node1 ~]# chmod 755 /etc/sysconfig/modules/drbd.modules
提示:让DRBD模块加载到内核不是必须的
[root@node1 ~]# cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example #模板样例文件配置
include "drbd.d/global_common.conf"; #全局配置文件
include "drbd.d/*.res"; #资源配置文件
我们实验比较简单配置就全部写到drbd.conf,不过还是推荐分开写配置
[root@node1 ~]# vim /etc/drbd.d/global_common.conf
global {
usage-count no; #是否参加DRBD 使用者统计,默认参加
}
common {
protocol C; #使用DRBD 的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成
startup {
wfc-timeout 120; #在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待
degr-wfc-timeout 120; #也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
outdated-wfc-timeout 120;
}
disk {
on-io-error detach; #策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作
resync-rate 30M; #设置主用节点和备用节点同步时的网络速率最大值,单位是字节
no-disk-flushes; #直接写入磁盘
no-md-flushes;
al-extents 517;
}
net {
sndbuf-size 512k;
timeout 60; #如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡
connect-int 10; #如果无法立即连接上远程DRBD设备,系统将断续尝试连接
ping-int 10; #如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活
max-buffers 2048; #该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
max-epoch-size 2048; #该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好
unplug-watermark 1024;
cram-hmac-alg sha1 ; #该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。
shared-secret "drbd"; #用来设定在对待节点授权中使用的密码,最长64个字符
verify-alg sha1;
after-sb-0pri disconnect; #防止脑裂
after-sb-1pri disconnect;
after-sb-2pri disconnect;
rr-conflict disconnect;
}
}
注意:配置此文件一定要参考已有配置文件中的选项并对应
[root@node1 ~]# vim /etc/drbd.d/r0.res
resource data {
on node1.cn {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.1.24:7898;
meta-disk /dev/sdb1[0];
}
on node2.cn {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.1.25:7898;
meta-disk /dev/sdb1[0];
}
}
[root@node1 ~]# cd /etc/drbd.d/
[root@node1 drbd.d]# scp global_common.conf r0.res 192.168.1.25:/etc/drbd.d/ #拷贝到node2
和配置heartbeat一样,两台机器配置一样,直接拷贝就行
node1上初始化
[root@node1 ~]# drbdadm create-md data #也可以不指定名字,直接all,all表示资源配置文件*.res所有的资源
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
node2上初始化
[root@node2 ~]# drbdadm create-md data
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data block successfully created.
方法一:/etc/init.d/drbd start
方法二:drbdadm up all all表示启动所有资源,drbdadm down all 关闭资源
[root@node1 ~]# drbdadm up all #这个命令相当于:attach all、syncer all、connect all
[root@node2 ~]# drbdadm up all
方法一:cat /proc/drbd
方法二:/etc/init.d/drbd status
方法三:drbd-overview
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4264704
[root@node2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
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:4264704
cs:Connected ro:Secondary/Secondary 已经连接,两端都是从,表示当前无主(primary)的状态
[root@node1 ~]# drbd-overview
0:data/0 Connected Primary/Secondary UpToDate/UpToDate
[root@node2 ~]# drbd-overview
0:data/0 Connected Secondary/Primary UpToDate/UpToDate
[root@node1 ~]# drbdadm primary data
0: State change failed: (-2) Need access to UpToDate data #数据没有更新,不一致无法提升
Command ‘drbdsetup-84 primary 0‘ terminated with exit code 17
解决:同步drbd数据到对端server,使数据保持一致
注意:
1、如果两端都是空硬盘,可以随意执行操作不用考虑数据
2、如果两端已有数据,且不一样,要特别注意数据同步的方向,否则可能丢失数据
一个资源只能在一端执行同步数据到对端的命令
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary data
说明:把本地做主,把本地数据快速拷贝到对端并覆盖
主节点node1状态:
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4264960 nr:0 dw:0 dr:4265624 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
备节点node2状态:
[root@node2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:4264960 dw:4264960 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
1、检查服务器物理网络连接,IP、主机路由是否正确
2、停止iptables防火墙,或放行DRBD(简单的ip过滤就行,没必要端口过滤)
3、Secondary/Unknow这种状态还可能是脑裂问题导致
可以尝试下面方法解决:
q 在从节点slave上操作:
drbdadm Secondary data
drbdadm -- --discard-my-data connect data ---> 丢弃本端数据进行连接
q 在主节点上操作
通过查看cat/proc/drbd状态,如果不是WFConnection状态,则需要手动连接
drbdadm connect data
4、如果初始配置不当,或配置好后进行其他意外处理等,如两端处于同步状态的meta信息不对
DRBD与Heartbeat禁止开机启动是为了人工处理问题可控性更强
[root@node1 ~]# chkconfig --list drbd
drbd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@node1 ~]# chkconfig drbd off
[root@node1 ~]# mount /dev/sdb2 /data 不是直接挂载文件系统分区
mount: /dev/sdb2 already mounted or /data busy 被DRBD占用
挂载主node1
[root@node1 ~]# mount /dev/drbd0 /data
[root@node1 ~]# echo "Test DRBD" >/data/test.txt
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4264992 nr:0 dw:32 dr:4265981 al:10 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
看看从node2能否挂载
[root@node2 ~]# mount /dev/drbd0 /data 无法挂载
mount: you must specify the filesystem type
[root@node2 ~]# mount /dev/sdb2 /data
mount: /dev/sdb2 already mounted or /data busy
从node2上查看数据
[root@node2 ~]# /etc/init.d/drbd stop 停止DRBD,或者使用drbdadm down data
Stopping all DRBD resources: .
[root@node2 ~]# mount /dev/sdb2 /data
[root@node2 ~]# cat /data/test.txt
Test DRBD
再次启动从node2的DRBD
[root@node2 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: data
prepare disk: data
adjust disk: data:failed(attach:10) 报错
adjust net: data
]
.
[root@node2 ~]# drbdadm up all
0: Failure: (104) Can not open backing device.
Command ‘drbdsetup-84 attach 0 /dev/sdb2 /dev/sdb1 0 --on-io-error=detach --resync-rate=30M‘ terminated with exit code 10
解决:
[root@node2 ~]# umount -lf /data 要先卸载
[root@node2 ~]# /etc/init.d/drbd start
Starting DRBD resources: [
]
.
[root@node2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate 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
l 问题1:DRBD依赖于内核模块,要手动加载modprobe drbd
l 问题2:命令drbdadm up all相当于下面3个命令的组合
drbdadm attach all、drbdadm syncer all、drbdadm connect all
l 问题3: 脑裂的问题
脑裂状态:ro:Secondary/Unknow
可以选择一台机器作为secondary,在该机器上执行
drbdadm secondary all
drbdadm disconnect all
drbdadm -- --discard-my-data connect all à丢弃本端数据并连接
有时也需要在另一节点执行
drbdadm connect all
l 问题4: 挂载设备要挂载drbd的设备
[root@node1 ~]# mount /dev/drbd0 /data
[root@node1 ~]# drbd-overview
0:data/0 Connected Primary/Secondary UpToDate/UpToDate /data ext4 3.9G 8.2M 3.7G 1%
l 问题5:drbd开机自动启动,启动drbd会报错
禁止drbd开机启动
l 问题6:drbd的单机启动正常状态
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
ns:4 nr:0 dw:4 dr:1109 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
l 问题7:can not open backing device
一般是系统分区已经挂载导致出现这种问题,mount /dev/sdb2 /data
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101) #版本信息
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11 #build information
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
#0表示第一个resource资源,且当前此资源处于主primary状态
C drbd复制协议
ns:4 nr:0 dw:4 dr:1157 al:1 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
cs(connection state):status of the network connection 连接状态
cs:Connected 可以通过drbdadm cstate all查看
[root@node1 ~]# drbdadm cstate all
Connected
连接状态说明:
StandAlone 独立的:网络配置不可用;资源还没有被连接或是被管理断开(使用 drbdadm disconnect 命令),或是由于出现认证失败或是脑裂的情况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试连接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点连接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推动连接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点建立网络连接
WFReportParams:已经建立TCP连接,本节点等待从对等节点传来的第一个网络包
Connected 连接:DRBD已经建立连接,数据镜像现在可用,节点处于正常状态
StartingSyncS:完全同步,有管理员发起的刚刚开始同步,未来可能的状态为SyncSource或PausedSyncS
StartingSyncT:完全同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,但是目前同步已经暂停,可能是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,但是目前同步已经暂停,这可以是因为另外一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行
ro(roles) Roles of the node 节点角色
[root@node1 ~]# drbdadm role data
Primary/Secondary 左边为当前主机的状态
Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
Secondary 次:资源目前为次,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
ds(disk states) State of the hard disk 磁盘状态
[root@node1 ~]# drbdadm dstate all
UpToDate/UpToDate 左边为当前主机的状态
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
DRBD将数据的各种信息块保存在一个专用的区域里,这些metadata包括了
a,DRBD设备的大小
b,产生的标识
c,活动日志
d,快速同步的位图
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
l 内部meta data
内部meta data存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动
on node1.cn {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.1.24:7898;
meta-disk internal;
}
l 外部meta data
外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要认为的干预操作来进行现有node对心硬盘的同步了
如果硬盘上有数据,并且硬盘或者分区不支持扩展,或者现有的文件系统不支持shrinking,那就必须使用外部metadata这种方式了
on node1.cn {
device /dev/drbd0;
disk /dev/sdb2;
address 192.168.1.24:7898;
meta-disk /dev/sdb1[0];
}
参考:http://www.wenzizone.cn/?p=280
#!/bin/sh
role=($(drbdadm role all|tr "/" "\n"))
dstate=($(drbdadm dstate all|tr "/" "\n"))
cstate=`drbdadm cstate all`
if [ "Primary" = "${role[0]}" ] && [ "Secondary" = "${role[1]}" ] && [ "UpToDate" = "${dstate[0]}" ] && [ "UpToDate" = "${dstate[1]}" ] && [ "Connected" = "$cstate" ] ;
then
echo "OK -MYSQL_DRBD_STATUS is ok !"
exit 0
else
echo "CRITICAL -MYSQL_DRBD_STATUS is CRITICAL !"
exit 2
fi
[root@node1 ~]# drbdadm –h 查看帮助
COMMANDS:
attach disk-options
detach connect
net-options disconnect
up resource-options
down primary
secondary invalidate
invalidate-remote outdate
resize verify
pause-sync resume-sync
adjust adjust-with-progress
wait-connect wait-con-int
role cstate
dstate dump
dump-xml create-md
show-gi get-gi
dump-md wipe-md
apply-al hidden-commands
查看meta data
[root@node1 ~]# drbdadm detach data
[root@node1 ~]# drbdadm apply-al data
Marked additional 4096 KB as out-of-sync based on AL.
[root@node1 ~]# drbdadm dump-md data
# DRBD meta data dump
# 2016-04-12 15:36:13 +0800 [1460446573]
# node1.cn> drbdmeta 0 v08 /dev/sdb1 0 dump-md
#
version "v08";
# md_size_sect 262144
# md_offset 0
# al_offset 4096
# bm_offset 36864
uuid {
0x071E73AE78DA0CA3; 0x0000000000000000; 0xAFB46290723E4CF1; 0xAFB36290723E4CF1;
flags 0x00000000;
}
# al-extents 517;
la-size-sect 8529920;
bm-byte-per-bit 4096;
device-uuid 0xDEC6F3E849B99AC6;
la-peer-max-bio-size 1048576;
al-stripes 1;
al-stripe-size-4k 8;
# bm-bytes 135168;
bm {
# at 0kB
16 times 0xFFFFFFFFFFFFFFFF;
16880 times 0x0000000000000000;
}
# bits-set 1024;
管理命令:drbdmeta
管理命令:drbdsetup
主主模式首先需要采用共享的cluster文件系统,如GFS、MFS
[root@node1 ~]# vim /etc/drbd.d/global_common.conf
添加配置
net {
allow-two-primaries;
}
startup {
become-primary-on both;
}
[root@node1 ~]# scp /etc/drbd.d/global_common.conf 192.168.1.25:/etc/drbd.d/
再重启drbd服务
[root@node1 ~]# drbdadm adjust all
[root@node1 ~]# drbdadm disconnect all
[root@node1 ~]# drbdadm connect all
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:0 nr:0 dw:0 dr:4760 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
[root@node2 ~]# drbdadm primary all
[root@node2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:4096 dw:4096 dr:1328 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
[root@node1 ~]# mount /dev/drbd0 /data #挂载设备
[root@node2 ~]# mount /dev/drbd0 /data
写入文件测试
[root@node1 ~]# echo 123456 > /data/test2.txt
[root@node1 ~]# ls /data/
lost+found test2.txt test.txt
[root@node2 ~]# ls /data/
lost+found test.txt --->没有test2.txt文件
[root@node2 ~]# umount -lf /data/
[root@node2 ~]# drbdadm down data
[root@node2 ~]# ls /data/
lost+found test2.txt test.txt --->有test2.txt文件,说明drbd已经同步了,但是看不到
DRBD双主模式结论<ext4文件系统>:
1、DRBD双主模式数据可以互相同步
2、DRBD双主两端只能看到各自的数据
3、通过停掉DRBD可以查看到互相同步的数据
l 安装GFS
[root@node1 ~]# yum install gfs2-utils cman –y
[root@node2 ~]# yum install gfs2-utils cman –y
rpm -qa gfs2-utils
l 卸载drbd设备,停止drbd
[root@node1 ~]# umount /data/
[root@node1 ~]# drbdadm down data
[root@node2 ~]# umount /data/
[root@node2 ~]# drbdadm down data
[root@node1 ~]# ccs_tool create gfscluster
[root@node1 ~]# ccs_tool addnode -n 1 -v 1 node1.cn
[root@node1 ~]# ccs_tool addnode -n 2 -v 1 node2.cn
[root@node1 ~]# ccs_tool lsnode
Cluster name: gfscluster, config_version: 3
Nodename Votes Nodeid Fencetype
node1.cn 1 1
node2.cn 1 2
[root@node1 ~]# mkfs.gfs2 -j 2 -p lock_dlm -t gfscluster:gfslocktable /dev/sdb2
[root@node2 ~]# mkfs.gfs2 -j 2 -p lock_dlm -t gfscluster:gfslocktable /dev/sdb2
l 格式化成gfs2文件系统
mkfs.gfs2 -h
[root@node1 ~]# mkfs.gfs2 -p lock_nolock -j 5 /dev/sdb2
[root@node2 ~]# mkfs.gfs2 -p lock_nolock -j 5 /dev/sdb2
l 清除之前的metadata
[root@node1 ~]# drbdadm wipe-md data
[root@node2 ~]# drbdadm wipe-md data
l 重新初始化metadata
[root@node1 ~]# drbdadm create-md data
[root@node2 ~]# drbdadm create-md data
l 启动DRBD
[root@node1 ~]# drbdadm up all
[root@node2 ~]# drbdadm up all
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
ns:0 nr:0 dw:0 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:4264704
[root@node1 ~]# drbdadm -- --overwrite-data-of-peer primary data 同步数据
[root@node1 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:4264960 nr:0 dw:0 dr:4265624 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
l 挂载drbd设备,测试
[root@node1 ~]# mount /dev/drbd0 /data
[root@node1 ~]# echo 12345 > /data/test.txt
[root@node2 ~]# drbdadm primary data
[root@node2 ~]# mount /dev/drbd0 /data
[root@node2 ~]# cat /proc/drbd
version: 8.4.7-1 (api:1/proto:86-101)
GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
0: cs:Connected ro:Primary/Primary ds:UpToDate/UpToDate C r-----
ns:24 nr:4265012 dw:4265036 dr:11864 al:18 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
[root@node2 ~]# ls /data/
test.txt
再写入一个文件看看
[root@node1 ~]# echo 123456 > /data/test2.txt
[root@node1 ~]# ls /data/
test2.txt test.txt
再看node2
[root@node2 ~]# ls /data/
test.txt 没有看到test2.txt
还有些问题,搞完GFS2再回来弄,生产环境DRBD主主也比较少用
标签:
原文地址:http://www.cnblogs.com/ylion/p/5519659.html