分布式复制模块(drbd)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的DRBD 镜像数据
实时性:当应用对磁盘的数据进行修改时,复制立即发生。
透明性:应用程序的数据存储在镜像设备上是独立和透明的,数据可存储在不同的服务器
上。
同步镜像和异步镜像:同步镜像,当本地发申请进行写操作进行时,同步写到两台服务器
上。异步镜像,当本地写申请已经完成对本地的写操作时,开始对对应的服务器进行写操作。堆块设备(硬盘,分区,逻辑卷等)进行镜像。
Drbd在linux中I/O堆栈中的位置
Drbd复制的模式有三种
协议 | 内容 | 特点 | 用途 |
协议A (异步复制) | 数据一旦写入磁盘发送到网络队列中就认为是完成里写入操作 | 一个节点发生故障时,可能发生数据丢失,数据还有可能在队列中 | 用于地理上分开的节点 |
协议B(半同步复制) | 收到接受确认就认为完成操作 | 数据丢失可能发生在参加的两个节点同时故障的情况下,因为在飞行中的数据可能不会 被提交到磁盘 | |
协议C(同步复制) | 收到写入确认就认为完成写入操作 | 没有任何数 据丢失,所以这是一个群集节点的流行模式,但 I/O 吞吐量依赖于网络带宽 | 数据的复制较慢但是最安全的一种。目前应用最多最广泛的一种协议。 |
实验(此实验用的是协议C)
Server6 与server7
需要包:drbd-8.4.2.tar.gz 要对这个tar包进行源码编译,所以需要rpm-bulid这个工具。
编译源码包解决依赖
两台虚拟机需要加一块4G的虚拟内存,内存的大小自己可以定义
Server7
cpdrbd-8.4.0.tar.gz rpmbuild/SOURCES/ 通常一般把源码包放在SOURCES/这个目录里
[root@server6drbd-8.4.2]# yum install gcc -y
[root@server6drbd-8.4.2]# yum install flex -y
[root@server6 ~]#yum install -y rpm-build
[root@server6 ~]#tar zxf drbd-8.4.2.tar.gz
[root@server6drbd-8.4.2]# ./configure --enable-spec--with-km 编译缺什么就补什么
[root@server6drbd-8.4.2]# rpmbuild -bb drbd.spec
[root@server6drbd-8.4.2]# cd /root/rpmbuild/RPMS/x86_64/ 进入这个目录就会看到生成的RPM包。
[root@server6x86_64]# rpm -ivh * 安装
[root@server6x86_64]# scp * 172.25.137.7:~ 把生成的rpm包传给server7
[root@server6drbd.d]# fdisk -l 查看添加磁盘信息
[root@server6drbd.d]# vim example.res 编辑的文件都以.res结尾。因为在/etc/drbd.conf的内容里规定"drbd.d/*.res";
resource example{ ###example这是名字是和文件的名字一样
meta-diskinternal;
device /dev/drbd1;
syncer {
verify-alg sha1;
}
on server6.example.com{ ###主备的主机名
disk/dev/vdb; ###在做之前添加一个虚拟磁盘,这是磁盘的名字
address172.25.137.6:7789;
}
onserver7.example.com {
disk /dev/vdb;
address172.25.137.:7789;
}
}
[root@server6drbd.d]# drbdadm create-md example 对资源做初始化
[root@server6drbd.d]# /etc/init.d/drbd start 会报这样的错是因为没有启动内核模块
[root@server6drbd-8.4.2]# rpmbuild -bb drbd-km.spec
[root@server6drbd-8.4.2]# yum install kernel-devel -y
[root@server6drbd-8.4.2]# rpmbuild -bb drbd-km.spec
[root@server6drbd-8.4.2]# cd /root/rpmbuild/RPMS/x86_64
[root@server6x86_64]# rpm -ivh drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm
[root@server6x86_64]# scp drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm172.25.137.7:~ 传给7
[root@server6x86_64]# /etc/init.d/drbd start 开启服务,
[root@server6x86_64]# cat /proc/drbd 此时看到的是secondary要把它手动设置为primary
[root@server6 x86_64]# drbdadm primaryexample --force
下面这个截图是在同步
[root@server6x86_64]# mkfs.ext4 /dev/drbd1 格式化磁盘
[root@server6 x86_64]#mount /dev/drbd1 /mnt/ 把drbd1 挂载
Server7
[root@server7 ~]#rpm -ivh *.rpm
[root@server7 ~]#fdisk -l
[root@server7 ~]#drbdadm create-md example
[root@server7 ~]#rpm -ivh drbd-km-2.6.32_431.el6.x86_64-8.4.2-2.el6.x86_64.rpm
[root@server7 ~]#/etc/init.d/drbd start
如果让server7成为主那么就的把server6设置为primary
[root@server7mnt]# drbdadm primary example
[root@server7mnt]# mount /dev/drbd1 /mnt/
[root@server7mnt]# df
[root@server7 /]# drbd-overview 查看状态
[root@server7 /]# drbdadm down example 关闭节点
[root@server7 /]# drbdadm up example 开启节点
在实验中记住解挂的时候一定不能在挂载的那个目录进行解挂,否则解不掉
Drbd服务起不来有可能是因为没有下载内核启动所以在做实验下载需要的程序的时候把kernel-devel下载好。
两台主机上的/dev/drbd1不能同时挂载,只有状态为 primary 时,才能被挂载使
用,而此时另一方的状态为 secondary。
Heartbeat + drbd
在做drbd的时候heartbeat是关闭的。现在要开启heartbeat来自动挂载
[root@server6ha.d]# vim haresources 在这个文件加入里磁盘自动挂载
server6.example.comIPaddr::172.25.137.100/24/eth0 drbddisk::exampleFilesystem::/dev/drbd1::/var/www/html::ext4 httpd
[root@server6ha.d]# /etc/init.d/heartbeat start
[root@server6ha.d]# ip addr show 我们可以看到vip在server6上
[root@server6 ha.d]# drbd-overview 此时6是主
/dev/drbd1 也自动挂载上了
如果关闭heartbeat服务此时server7是主备
[root@server7 ha.d]# ip addr show
[root@server7 ha.d]# drbd-overview
此时挂载在server7上
在drbd1上写一个测试页
在浏览器上看到的效果httpd服务一定要开启