HA-DRBD

HA-DRBD

DRBD(Distributed Replicated Block Device),DRBD 号称是 “网络 RAID”,开源软件,由LINBIT 公司开发。DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

我的理解就是,高可用集群各节点之间数据同步的配置,接下来,就让我们开始动手操作吧!

安装DRBD

在server1和server2上下载并安装DRBD

下载并解压:

1
2
3
4
5
6
7
[root@server1 drbd]# lftp 172.25.9.250
lftp 172.25.9.250:~> cd pub/heartbeat1
lftp 172.25.9.250:/pub/heartbeat1> get drbd-8.4.3.tar.gz

[root@server1 drbd]# tar zxf drbd-8.4.3.tar.gz
[root@server1 drbd]# ls
drbd-8.4.3 drbd-8.4.3.tar.gz

解决依赖软件包及做rpm包的工具:

1
[root@server1 drbd-8.4.3]# yum install gcc flex rpm-build -y

编译:

1
[root@server1 drbd-8.4.3]# ./configure --enable-spec --with-km

编译完成之后,dbrb-8.4.3目录里面会多出文件drbd.spec,现在要根据这些文件来生成rpm包

生成rpm包

1
2
3
4
5
6
7
8
9
10
[root@server1 drbd-8.4.3]#rpmbulid -bb drbd.spec
error: File /root/rpmbuild/SOURCES/drbd-8.4.3.tar.gz: No such file or directory
[root@server1 drbd-8.4.3]#cp ~/drbd/drbd-8.4.3.tar.gz ~/rpmbuild/SOURCES
[root@server1 drbd-8.4.3]# rpmbuild -bb drbd.spec
[root@server1 drbd-8.4.3]# rpmbuild -bb drbd-km.spec
error: Failed build dependencies:
kernel-devel is needed by drbd-km-8.4.3-2.el6.x86_64
[root@server1 drbd-8.4.3]# yum install kernel-devel
这个负责生成drbd的内核模块,这个模块是用来虚拟一个块儿设备的。就是在 执行下面的drbdadm create-md mysqldata(我自定义的资源名)后会生成一个你定义的设备(我下面设置的是drbd1)。对于用户来说,他只能看到drbd1这个设备,而看不到真正的物理磁盘。
[root@server1 drbd-8.4.3]# rpmbuild -bb drbd-km.spec

查看并安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@server1 x86_64]# pwd
/root/rpmbuild/RPMS/x86_64
[root@server1 x86_64]# ls
drbd-8.4.3-2.el6.x86_64.rpm
drbd-bash-completion-8.4.3-2.el6.x86_64.rpm
drbd-heartbeat-8.4.3-2.el6.x86_64.rpm
drbd-km-2.6.32_431.el6.x86_64-8.4.3-2.el6.x86_64.rpm
drbd-pacemaker-8.4.3-2.el6.x86_64.rpm
drbd-udev-8.4.3-2.el6.x86_64.rpm
drbd-utils-8.4.3-2.el6.x86_64.rpm
drbd-xen-8.4.3-2.el6.x86_64.rpm
[root@server1 x86_64]# rpm -ivh *
[root@server1 x86_64]# modprobe -l | grep drbd #用此命令查看刚才安装的模块
updates/drbd.ko

将生成rpm包直接传给server2,安装:

1
2
3
[root@server2 ~]# mkdir drbd
[root@server1 x86_64]# scp * 172.25.9.2:/root/drbd
[root@server2 drbd]# rpm -ivh *

配置DRBD

在server1和server2上都添加一个磁盘作为底层存储
可以是一块普通的磁盘,也可以是lvm,我做的两个磁盘大小都是4G
配置DRBD的配置文件

1
2
3
4
5
[root@server1 drbd.d]# 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的配置文件中可得到新文件必须以.res结尾,且在/etc/drbd.d目录下

1.创建文件mysqldata.res

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@server1 drbd.d]# pwd
/etc/drbd.d
[root@server1 drbd.d]# vim mysqldata.res
[root@server1 drbd.d]# cat mysqldata.res
resource mysqldata
{
meta-disk internal;
device /dev/drbd1;
syncer
{
verify-alg sha1;
}

# 每个主机的说明以"on"开头,后面是主机名
on server1.example.com
{
disk /dev/vda;
address 172.25.9.1:7789;
}

on server2.example.com
{
disk /dev/vda;
address 172.25.9.2:7789;
}
}

2.创建供DRBD记录信息的数据块(两台机子上都做)

1
2
3
4
5
[root@server1 drbd.d]# drbdadm create-md mysqldata
Writing meta data...
initializing activity log
NOT initializing bitmap
New drbd meta data block successfully created.

3.启动drbd服务(两台机子上都做)

1
[root@server1 drbd.d]# /etc/init.d/drbd start

启动drbd服务之后:

1
2
3
4
5
6
[root@server1 drbd.d]# cat /proc/drbd 
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@server1.example.com, 2016-02-24 18:37:31

1: 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:4194140

指定master设备

补充:
单主模式:使用最广的一种,主要用于高可用集群,解决群众数据共享的问题。这种情况下,只有一个主用节点能进行读写操作,可以用在此模式下的文件系统有ext3,ext4,xfs等

双主模式:主要用于数据共享和群众,解决数据共享和一致性问题。由于集群中多个主用节点,所以每个主用节点都有可能进行读写,并发的,单一的文件系统无法解决此问题。需要使用共享的集群文件系统来解决此问题,如:GFS,OCFS2等,通过集群文件系统的锁机制来解决并发问题

1.第一次使用drbd时要指定主设备

1
2
3
4
5
6
7
8
9
[root@server1 drbd.d]# drbdsetup /dev/drbd1 primary --force
[root@server1 drbd.d]# cat /proc/drbd
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@server1.example.com, 2016-02-24 18:37:31


1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:259624 nr:0 dw:0 dr:262808 al:0 bm:15 lo:0 pe:1 ua:3 ap:0 ep:1 wo:f oos:3935068
[>...................] sync'ed: 6.3% (3935068/4194140)K
finish: 0:02:46 speed: 23,552 (23,552) K/sec

等到sync’ed到达百分百的时候,指定就完成了,此时的server2是secondary

1
2
3
4
5
6
[root@server2 ~]# cat /proc/drbd 
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@server1.example.com, 2016-02-24 18:37:31

1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:4194140 dw:4194140 dr:0 al:0 bm:256 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

【注】在以后的使用中,若再想把server2设置为primary时,使用此命令:

[root@server2 ~]# drbdadm primary mysqldata

挂载设备

只有主设备挂载drbd1这个设备,在主设备上写的数据才能同步到备用设备上
serevr1:

1
2
3
4
5
6
7
[root@server1 drbd.d]# mkfs.ext4 /dev/drbd1		#格式化(此步骤只能在主设备上完成)
[root@server1 drbd.d]# mount /dev/drbd1 /mnt/
[root@server1 drbd.d]# cd /mnt/
[root@server1 mnt]# echo hello,server1 > serevr1
[root@server1 mnt]# cd
[root@server1 ~]# umount /mnt/
[root@server1 ~]# drbdadm secondary mysqldata #改变主设备

server2:

1
2
3
4
[root@server2 ~]# mount /dev/drbd1 /mnt/
[root@server2 ~]# cd /mnt/
[root@server2 mnt]# ls #此时,可以看到数据已同步
lost+found serevr1

其他知识点:
如果做实验时用的是lvm做底层存储的。
拉伸lvm时的步骤:
lvmextent——> drbdadm resize ——> resize2fs

1
2
3
4
[root@server2 mnt]# lvextend -l +200 /dev/cluster/demo
[root@server2 mnt]# drbdadm resize mysqldata
[root@server2 mnt]# cat /proc/drbd
[root@server2 mnt]# df -h