文章目录
一、DRBD简介
1.认识DRBD(端口7789)分布式磁盘块设备
DRBD:一个基于软件实现的,不共享任何东西,通过复制的方式在存储之间构建所谓镜像模式机制的磁盘,从而使得一个数据可以存储为多份, DRBD的核心功能是在内核中实现。
简单说DRBD是实现活动节点存储数据更动后自动复制到备用节点相应存储位置的软件。
2.DRBD工作原理
可以看到DRBD需要运行在各个节点上,且是运行在节点主机的内核中,所以DRBD是内核模块,在Linux2.6.33版本起开始整合进内核。
上图假设左节点为活动节点(实箭头),右节点为备用节点。左节点接收到数据发往内核的数据通路,DRBD在数据通路中注册钩子检查数据(类似ipvs),当发现接收到的数据是发往到自己管理的存储位置,就复制另一份,一份存储到本机的DRBD存储设备,另一份就发给TCP/IP协议栈,通过网卡网络传输到另一节点主机的网上TCP/IP协议栈;而另一节点运行的DRBD模块同样在数据通路上检查数据,当发现传输过来的数据时,就存储到DRBD存储设备对应的位置。
如果左节点宕机,右节点可以在高可用集群中成为活动节点,当接收到数据先存储到本地,当左节点恢复上线时,再把宕机后右节点变动的数据镜像到左节点。
镜像过程完成后还需要返回成功/失败的回应消息,这个回应消息可以在传输过程中的不同位置返回,如图上的A/B/C标识位置,可以分为三种复制模式
:
协议A:Async, 异步,本地写成功后立即返回,数据放在发送buffer中,可能丢失,但传输性能好;
协议B:semi sync, 半同步;
协议C:sync, 同步,本地和对方写成功确认后返回,数据可靠性高,一般都用这种;
3.DRBD支持的底层设备
DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘,可以在DRBD设备内创建文件系统。
DRBD所支持的底层设备有这些类别:磁盘,或者是磁盘的某一个分区;soft raid 设备;LVM的逻辑卷;EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;或其他任何的块设备。
4.DRBD资源
DRBD资源为DRBD管理的存储空间及相关信息,主要配置四个选项:
资源名称
:可以是除了空白字符外的任意ACSII码字符;
磁盘
:在双方节点上,各自提供的存储设备;
DRBD设备
:在双方节点上,此DRBD设备的设备文件;一般为/dev/drbdN,其主设备号147
网络配置
:双方数据同步时所使用的网络属性;
5.DRBD模式
1)单主模式:master/slave(primary/secondary)
这种机制,在某一时刻只允许有一个主节点。主节点的作用是可以挂在使用,写入数据等;从节点知识作为主节点的镜像,是主节点的备份。
这样的工作机制的好处是可以有效的避免磁盘出现单点故障,不会文件系统的错乱。
2)双主模式:dula primary(primary/primary)
所谓双主模型是2个节点都可以当做主节点来挂载使用。那么,思考这样一个问题?当第一个主节点对某一文件正在执行写操作,此时另一个节点也正在对同一文件也要执行写操作,结果会如何呢??
一般这种情况会造成文件系统的错乱,导致数据不能正常使用。原因是:对文件的加速机制是由操作系统内核所管理的,一个节点对文件加速之后,另一个节点并不知道对方的锁信息。
解决办法是:使用集群文件系统。集群文件系统使用分布式文件锁管理器,当一个节点对文件加锁之后会通过某种机制来通知其他节点锁信息,从而实现文件锁共享。
6.DRBD 配置工具
drbdadm
:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。
drbdsetup
:配置装载进kernel的DRBD模块,平时很少直接用。
drbdmeta
:管理META数据结构,平时很少直接用。
7.DRBD与RAID1区别
RAID1(独立磁盘阵列)也是实现不同存储设备间的数据镜像备份的;不同的是RAID1各存储设备是连接一个RAID控制器接入到一台主机上的,而DRBD是通过网络实现不同节点主机存储设备数据的镜像备份。
8.DRBD与集群共享存储
共享存储:如果各节点访问同一个数据文件都是在同一个存储空间内的,就是说数据共享的就一份,而这个存储空间就共享存储。
而DRBD定义上就指出了"无共享":不同节点存储设备空间是镜像,DRBD可以直接应用在主备模型的集群中,也可通过高可用双主模型集群中,还有就是DRBD为NFS共享存储提供高可用镜像备份,等等…
二、DRBD安装
环境准备:在两台主机上各添加一块硬盘
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
1.关闭防火墙、禁用selinux
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
SELINUX=disabled
setenforce 0
2.配置双机互信
2.1 两台主机配置hosts文件
[root@node1 ~]# cat /etc/hosts
192.168.131.107 node1
192.168.131.108 node2
2.2 两台主机配置免秘钥互信
[root@node1 ~]# ssh-keygen -t dsa -f ~/.ssh/id_dsa -N "" -q
[root@node1 ~]# ssh-copy-id node1
[root@node1 ~]# ssh-copy-id node2
3.两台主机时间同步
[root@node1 ~]# ntpdate ntp1.aliyun.com
29 Aug 17:53:14 ntpdate[36989]: step time server 120.25.115.20 offset 662121.506464 sec
步骤:
1.配置两台主机的epel源,安装drbd,并且加载模块
[root@node1 ~]# cat /etc/yum.repos.d/elrepo.repo
[elrepo]
name=ELRepo.org Community Enterprise Linux Repository - el7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/elrepo/elrepo/el7/x86_64/
enabled=1
gpgcheck=0
[root@node1 ~]# yum list | grep -i drbd
Repository base is listed more than once in the configuration
drbd84-utils.x86_64 9.12.2-1.el7.elrepo @elrepo
kmod-drbd84.x86_64 8.4.11-1.2.el7_8.elrepo @elrepo
collectd-drbd.x86_64 5.8.1-1.el7 epel
drbd.x86_64 9.13.1-1.el7 epel
drbd-bash-completion.x86_64 9.13.1-1.el7 epel
drbd-pacemaker.x86_64 9.13.1-1.el7 epel
drbd-rgmanager.x86_64 9.13.1-1.el7 epel
drbd-udev.x86_64 9.13.1-1.el7 epel
drbd-utils.x86_64 9.13.1-1.el7 epel
drbd-xen.x86_64 9.13.1-1.el7 epel
drbd84-utils-sysvinit.x86_64 9.12.2-1.el7.elrepo elrepo
drbd90-utils.x86_64 9.12.2-1.el7.elrepo elrepo
drbd90-utils-sysvinit.x86_64 9.12.2-1.el7.elrepo elrepo
drbdlinks.noarch 1.29-1.el7 epel
kmod-drbd90.x86_64 9.0.22-2.el7_8.elrepo elrepo
[root@node1 ~]# yum install -y drbd84-utils kmod-drbd84
#加载模块
[root@node1 ~]# modprobe drbd
#查看模块是否加载成功
[root@node1 ~]# lsmod |grep drbd
drbd 397041 0
libcrc32c 12644 5 xfs,drbd,ip_vs,nf_nat,nf_conntrack
2.两台主机添加一个分区
[root@node1 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 942M 0 rom /mnt
3.修改全局配置文件,并且编辑drbd资源文件
[root@node1 ~]# cat /etc/drbd.conf
include "drbd.d/global_common.conf"; #指定了启动配置文件位置,将其注释掉避免和自己写的冲突
include "drbd.d/*.res"; #指定了资源配置文件
#修改全局配置文件
[root@node1 ~]# vim /etc/drbd.d/global_common.conf
global {
usage-count no; #不统计
}
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";
}
}
disk {
on-io-error detach; #配置I/O错误处理策略为分离
}
syncer {
rate 1000M; #速率
}
#编辑资源文件data.res
[root@node2 ~]# cat /etc/drbd.d/data.res
resource data { #资源名
protocol C;
meta-disk internal; #源数据策略
device /dev/drbd1; #设备名
syncer {
verify-alg sha1; #加密算法
}
net {
allow-two-primaries; #允许双主
}
on node1 { #node1主机节点
disk /dev/sdb1; #对应的设备:磁盘
address 192.168.131.107:7789; #地址:默认端口
}
on node2 {
disk /dev/sdb1;
address 192.168.131.108:7789;
}
}
4.在两台机器上分别创建DRBD资源并启用data资源
[root@node1 ~]# drbdadm create-md data
initializing activity log
initializing bitmap (64 KB) to all zero
Writing meta data...
New drbd meta data block successfully created.
[root@node1 ~]# drbdadm up data
5.启动drbd服务,并且node1设置为主
[root@node1 ~]# systemctl start drbd
[root@node1 ~]# cat /proc/drbd #查看drbd状态
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
1: 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:2097052
#node1设置为主
[root@node1 ~]# drbdsetup /dev/drbd1 primary --force
[root@node1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:364 nr:0 dw:0 dr:2484 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2096688
[>....................] sync'ed: 0.2% (2096688/2097052)K
finish: 1:27:21 speed: 364 (364) K/sec
6.在主服务器上,格式化并挂载磁盘,从服务器不需要做任何操作
[root@node1 ~]# mkdir /data1
[root@node1 ~]# mkfs.xfs /dev/drbd1
meta-data=/dev/drbd1 isize=512 agcount=4, agsize=131066 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524263, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@node1 ~]# mount /dev/drbd1 /data1
[root@node1 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 18M 893M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 7.4G 9.6G 44% /
/dev/sr0 iso9660 942M 942M 0 100% /mnt
/dev/sda1 xfs 1014M 268M 747M 27% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
/dev/drbd1 xfs 2.0G 33M 2.0G 2% /data1
7.手动切换进行测试:当将主取消挂载主并切换为备,将备设置为主并且挂载,查看之前在主上面创建的是否存在
#node1主
[root@node1 ~]# touch /data1/1
[root@node1 ~]# ll /data1
-rw-r--r-- 1 root root 0 8月 29 18:55 1
[root@node1 ~]# umount /data1
[root@node1 ~]# drbdsetup /dev/drbd1 secondary
#node2备
[root@node2 ~]# mkdir /data1
[root@node2 ~]# drbdsetup /dev/drbd1 primary
[root@node2 ~]# mount /dev/drbd1 /data1
[root@node2 ~]# ll /data1
-rw-r--r-- 1 root root 0 8月 29 18:55 1
三、drbd相关配置操作指令
1.查看资源连接状态
[root@node1 ~]# drbdadm cstate data
Connected
2.查看资源角色
[root@node1 ~]# drbdadm role data
Primary/Secondary
3.手动启动/禁用资源
[root@node1 ~]# drbdadm up data
[root@node1 ~]# drbdadm down data
4.手动升级资源/降级资源
[root@node1 ~]# drbdadm primary data
[root@node1 ~]# drbdadm secondary data
5.初始化设备同步
选择一个初始同步源;若是新初始化的或是空盘,这个选择可以是 任意的;若其中一个节点在使用并包含有用的数据,那么选择同步源是至关重要的;如果选错了初始化同步方向,就会造成数据丢失。
drbdadm -- --overwrite-data-of-peer primary data
四、drbd脑裂的模拟及修复
1.模拟drbd脑裂:
现node2为主,可以将node2主节点断开,有如下方法:关机、断开网络、重新配置IP;我们这里采用的是断开网络
[root@node2 ~]# ifconfig ens33 down
此时在node1上查看drbd状态:出现unknown
[root@node1 ~]# drbdadm role data
Secondary/Unknown
[root@node1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2020-04-05 02:58:18
1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
ns:2109714 nr:2048 dw:14710 dr:2102407 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
由此看到两个节点已经无法通信。
在node1设置为主(node2恢复网络ifconfig ens33 up),并且查看node1和node2的drbd状态
[root@node1 ~]# drbdadm primary data
[root@node1 ~]# drbdadm role data
Primary/Unknown
[root@node2 ~]# drbdadm role data
Primary/Unknown
此时,出现脑裂的情况。
2.修复drbd脑裂
若主上有挂载先取消挂载
[root@node2 ~]# umount /data1
接下来在备上先断开连接,然后状态切换成备,然后再进行连接
[root@node1 ~]# drbdadm disconnect data
[root@node1 ~]# drbdadm secondary data
[root@node1 ~]# drbdadm connect --discard-my-data data
[root@node1 ~]# drbdadm role data
Secondary/Unknown
接下来在主上进行连接
[root@node2 ~]# drbdadm connect data
最后查看裂脑是否解决
[root@node2 ~]# drbdadm role data
Primary/Secondary
[root@node1 ~]# drbdadm role data
Secondary/Primary
完美解决裂脑。