DRBD工作原理:
DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络(磁盘阵列)RAID-1功能。
当你将数据写入本地 文件系统时(DRBD Primary),数据还将会被发送到网络中另一台主机上(DRBD Secondary).以相同的形式记录在一个文件系统中。本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用.在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。
因为数据同时存在于本地主机和远程主机上,切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了。
三种复制模式:
(1)协议A:异步复制
一旦写入本地完成,数据包就在buffer队列中,则备认为是完成的,在一个节点发生故障时,可能造成数据丢失,因为被写入远程节点上的数据仍可能在发送队列。一般用在地理位置比较远的节点。
(2)协议B:半同步复制
本地磁盘写入并且已经完成复制数据包到达远端,则认为工作完成。不确定远端是否写入磁盘,这种情况下,当两个节点同时发生故障就可能造成数据丢失,比如两端同时掉电。
(3)协议C:同步复制
发送到远端并确保写入完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽。
生产环境一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。
工作原理图:
DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据
实验环境:
节点1:server1.example.com 172.25.29.1
节点2:server2.example.com 172.25.29.2
Vip:172.25.29.100
Selinux和iptables处于disabled状态
以上两台虚拟主机为redhat 6.5版本
一.安装
Server1
得到drbd-8.4.2.tar.gz包
yum install rpm-build -y ###安装rpm-build
tar zxf drbd-8.4.2.tar.gz ###解压
cd drbd-8.4.2 ###进入解压后目录
./configure --enable-spec --with-km(内核编译) ###编译
编译的过程中根据报错提示安装gcc flex
安装完成后需要重新编译
编译完成后生成三个文件 drbd.spec drbd-km.spec drbd-kernel.spec
rpmbuild -bb drbd.spec ###编译后做成*.rpm包
根据错误提示把未解压的包拷贝到指定目录下
重新编译
信息提示生成的rpm包的位置为/root/rpmbuild/RPMS/x86_64
[[email protected] x86_64]# rpm -ivh * ###安装
scp * [email protected]:/drbd ###server2只需要rpm -ivh *安装
二.配置
Server1
[[email protected] x86_64]# 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"; ###配置文件都是以res结尾
两台虚拟机都添加4G虚拟硬盘,fdisk -l 查看名称我这里是/dev/vda 两块硬盘一样大
cd /etc/drbd.d
vim example.res ###这个文件原本不存在,自己建立
resource example {
meta-disk internal;
device /dev/drbd1; ###设备/dev/drbd1,名称必须是drbd*
syncer {
verify-alg sha1;
}
on server1.example.com {
disk /dev/vda; ###硬盘名称
address 172.25.29.1:7789;
}
on server2.example.com {
disk /dev/vda;
address 172.25.29.2:7789;
}
}
[[email protected] drbd.d]# scp example.res [email protected]:/etc/drbd.d
远程复制到server2 中
工作方式为主备模式
三.初始化并载入数据
服务启动失败,需要加载内核模块,进入到解压目录,rpmbuild命令编译成rpm包,安装kernel-devel后需要重新编译生成rpm包
进入生成rpm包的目录/root/rpmbuild/RPMS/x86_64,安装与内核相关的包:
[[email protected] x86_64]# scp drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm [email protected]:/root
在server2中也安装此包
安装完这个包后,就可以成功开启服务/etc/init.d/drbd start
注意:两边都要开启服务,否则先开启服务的那一个主机会等待另一个主机开启服务,一直等待,直到另外一个主机开启服务为止
两个之间还,没有建立连接inconsistent
Server1
drbdadm primary example --force ####把server1设置为primary 进行数据的同步
Primary/Secondary ###Primary在前就表示自己是主设备
上面的图片表示server2是从设备;update已经建立连接
/dev/vda ---> /dev/drbd1
[[email protected] x86_64]# mkfs.ext4 /dev/drbd1 ###只能对/dev/drbd1 进行操作
四.挂载测试
格式化完成后,在server1中将/dev/drbd1挂载到/mnt目录下可以挂载
卸载之后,server2还是挂载不上
现象:主设备server1挂载再卸载,但是server2设备还是挂载失败
因为server2是从设备,只能在主设备上进行挂载
[[email protected] ~]# drbdadm secondary example ###把server1改成从设备
[[email protected] ~]# drbdadm primary example ###把server2改成主设备
然后就可以在server2上实现挂载
Server1 : 主
Server2:备
Server1:echo c > /proc/sysrq-trigger ###内核崩掉
Drbd-overciew ###查看是否连接还是等待连接
Forceoff 重启之后正常连接
Server1;stop network 出现如上现象独立工作
Server2在等待
Server2:drbdadm disconnect example ###断开连接
Drbdadm connect --discard-my-data example ###重新连接
Server1:drbdadm connect example
五.把drbd挂载到httpd默认发布目录上(drbd+heartbeat)
Server1.server2
/etc/init.d/heartbeat stop
Vim /etc/ha.d/haresources
参数说明:
server1.example.com ###主节点,两边都是主节点的主机名
IPaddr::172.25.29.100/24/eth0 ###vip
drbddisk::example ###因为只有primary才能挂载,转换身份为primary
Filesystem::/dev/drbd1::/var/www/html
Httpd ###服务
/etc/init.d/heartbeat start ###两边都开启服务
当前server1为primary,所以先挂载到server1上
Cd /var/www/html cat index.html linux ###创建测试页
[[email protected] ha.d]# /etc/init.d/heartbeat stop ##server1上停止心跳服务
就会自动挂载到server2上
Server1服务恢复时,又会自动挂载到server1上(主从设备)
当srver1httpd服务停止,挂载位置不变,curl 172.25.29.100 没有内容