付出,终有回报!
分类: 系统运维
2015-05-24 20:37:36
先来大概的了解下drbd
DRBD(Distributed Replicated Block Device),DRBD 号称是“网络RAID”,开源软件,由LINBIT 公司开发。DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之
中。它由内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID-1的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在文件系统中。本地节点与远程节点的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
这个是它的工作原理图
为了能够管理和配置 DRBD 的资源,DRBD 配备了一些管理工具与内核模块进行通信。
drbdadm:高层的 DRBD 程序管理套件工具。它从配置文件/etc/drbd.conf 中获取所有配置参数。drbdadm 为 drbdsetup 和 drbdeta 两个命令充当程序的前端应用,执行 drbdadm
实际是执行的 drbdsetup 和 drbdeta 两个命令。
drbdsetup:drbdsetup 可以让用户配置已经加载在内核中运行的 DRBD 模块,它是底层的 DRBD 程序管理套件工具。使用该命令时,所有的配置参数都需要直接在命令行中定义,
虽然命令和灵活,但是大大的降低了命令的简单易用性,因此很多的用户很少使用。
drbdmeta:drbdmeta 允许用户创建、转储、还原和修改 drbd 的原数据结构。
三、添加存储
1、 添加磁盘
分别在两个节点上添加一块虚拟磁盘
fdisk -l 查看添加的磁盘信息
Disk /dev/vda: 8589 MB, 8589934592 bytes
16 heads, 63 sectors/track, 16644 cylinders
2、软件包安装
在本次的实验中,我用的是8.4.4版本的,目前最新版本是8.4.6,不过8.4.5和8.4.6与之前的版本相比,变动挺大。
这是我网盘中的资源
(1)解压及编译
[root@new ~]# tar -zxf drbd-8.4.4.tar.gz
[root@new ~]# cd drbd-8.4.4
[root@new drbd-8.4.4]# ./configure --enable-spec —with-km
--with-km,指定编译内核模块
[root@new drbd-8.4.4]# yum install flex -y
解决依赖性后,再次编译
[root@new drbd-8.4.4]# ./configure --enable-spec —with-km
既然要用到内核模块,那么就必须安装内核模块
[root@new drbd-8.4.4]# rpm -q kernel-devel
package kernel-devel is not installed
[root@new drbd-8.4.4]# yum install kernel-devel -y
(2)制作RPM包
此处用的软件包是源码,为了便于后期的维护,把它制作成RPM包
[root@new ~]# yum install -y rpm-build
以下这些都是编译安装过程中会用到的软件,如果缺少,请根据相应的提示进行安装
[root@new drbd-8.4.4]# rpm -q flex rpm-build gcc kernel-devel
flex-2.5.35-8.el6.x86_64
rpm-build-4.8.0-37.el6.x86_64
gcc-4.4.7-4.el6.x86_64
kernel-devel-2.6.32-431.el6.x86_64
开始制作RPM包,具体的参数使用可以查看,rpmbuild --help
[root@new drbd-8.4.4]# rpmbuild -bb drbd.spec
error: File /root/rpmbuild/SOURCES/drbd-8.4.4.tar.gz: No such file or directory
从给出的提示可知,需要把待制作的软件包拷贝到root/rpmbuild/SOURCES/目录下
[root@new drbd-8.4.4]# cp /root/drbd-8.4.4.tar.gz /root/rpmbuild/SOURCES/
[root@new drbd-8.4.4]# rpmbuild -bb drbd.spec
制作成功,将会有下图所示的7个rpm包
[root@new drbd-8.4.4]# rpmbuild -bb drbd-km.spec
如果没有关于内核模块的这个包,那么服务drbd将无法启动
[root@new drbd-8.4.4]# rpm -ql drbd-km-2.6.32_431.el6.x86_64-8.4.4-4.el6.x86_64
/lib/modules/2.6.32-431.el6.x86_64
/lib/modules/2.6.32-431.el6.x86_64/updates
/lib/modules/2.6.32-431.el6.x86_64/updates/drbd.ko
/usr/share/doc/drbd-km-2.6.32_431.el6.x86_64-8.4.4
/usr/share/doc/drbd-km-2.6.32_431.el6.x86_64-8.4.4/COPYING
/usr/share/doc/drbd-km-2.6.32_431.el6.x86_64-8.4.4/ChangeLog
/usr/share/doc/drbd-km-2.6.32_431.el6.x86_64-8.4.4/k-config-2.6.32-431.el6.x86_64.gz
rpm包制作成功后,自动添加了/lib/modules/2.6.32-431.el6.x86_64/updates/drbd.ko模块
所有制作好的rpm包都在/root/rpmbuild/RPMS/x86_64/这个目录下,一共8个,一个都不能少
[root@new drbd-8.4.4]# cd /root/rpmbuild/RPMS/x86_64/
[root@new x86_64]# ls
drbd-8.4.4-4.el6.x86_64.rpm
drbd-bash-completion-8.4.4-4.el6.x86_64.rpm
drbd-heartbeat-8.4.4-4.el6.x86_64.rpm
drbd-km-2.6.32_431.el6.x86_64-8.4.4-4.el6.x86_64.rpm
drbd-pacemaker-8.4.4-4.el6.x86_64.rpm
drbd-udev-8.4.4-4.el6.x86_64.rpm
drbd-utils-8.4.4-4.el6.x86_64.rpm
drbd-xen-8.4.4-4.el6.x86_64.rpm
这些包制作时,都挺简单的,基本上也不会出现什么错误,在此,我就不提供下载路径了。
将制作好的这些包拷贝到另一个节点上
[root@new x86_64]# scp * 172.25.18.13:/root
(3)安装软件包
在两个节点上同时安装刚制作的rpm包
[root@new x86_64]# rpm -ivh drbd-*
在/usr/share/doc/drbd-utils-8.4.4下有配置模板
[root@new x86_64]# cd /usr/share/doc/drbd-utils-8.4.4
[root@new drbd-utils-8.4.4]# ls
ChangeLog COPYING drbd.conf.example README
进入/etc/drbd.d,编辑一个以.res结尾的文件,文件名可以随意取
[root@new drbd-utils-8.4.4]# cd /etc/drbd.d
[root@new drbd.d]# vim drbd.res
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
resource mysqldata { #mysqldata,是指定的资源的名字
meta-disk internal; # internal表示将metadata存放到drbd挂在的磁盘分区的最后的位置上
device /dev/drbd1;
syncer {
verify-alg sha1;
}
#每个主机的说明以"on"开头,后面必须是主机名
on new.example.com {
disk /dev/vda; #此处的disk必须是添加磁盘时 fdisk -l 显示的
address 172.25.18.12:7789; # 设置DRBD的监听端口,用于与另一台主机通信
}
on new1.example.com {
disk /dev/vda;
address 172.25.18.13:7789;
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
此处的配置文件,仅供简单的参考,可以根据不同的需求做以修改
metadata的存储方式有内部和外部两种方式,使用哪种配置都是在资源配置中定义的
内部metadata:内部metadata存放在同一块硬盘或分区的最后的位置上
优点:metadata和数据是紧密联系在一起的,如果硬盘损坏,metadata同样就没有了,同样在恢复的时候,metadata也会一起被恢复回来
缺点:metadata和数据在同一块硬盘上,对于写操作的吞吐量会带来负面的影响,因为应用程序的写请求会触发metadata的更新,这样写操作就会造成两次额外的磁头读写移动。
外部metadata:外部的metadata存放在和数据磁盘分开的独立的块设备上
优点:对于一些写操作可以对一些潜在的行为提供一些改进
缺点:metadata和数据不是联系在一起的,所以如果数据盘出现故障,在更换新盘的时候就需要人工干预操作来进行现有node新硬盘的同步了
将编辑好的配置文件拷贝到另一个节点上
[root@new drbd.d]# scp drbd.res 172.25.18.13:/etc/drbd.d。
[root@new drbd.d]# drbdadm create-md mysqldata
[root@new drbd.d]# /etc/init.d/drbd start
Starting DRBD resources: [
create res: mysqldata
prepare disk: mysqldata
adjust disk: mysqldata
adjust net: mysqldata
]
........
此处表明它在等待另一个节点
初始化系统上的DRBD服务,如果没有初始化,后面的测试将会出现问题
[root@new1 ~]# drbdadm create-md mysqldata
[root@new1 ~]# /etc/init.d/drbd start
初始化成功,并启动服务都,在/dev/下会生成 /dev/drbd1这个设备名。后面的存储,使用的也是 /dev/drbd1
[root@new drbd.d]# ll /dev/drbd1
brw-rw---- 1 root disk 147, 1 May 23 15:14 /dev/drbd1
[root@new drbd.d]# cat /proc/drbd
version: 8.4.4 (api:1/proto:86-101)
GIT-hash: 74402fecf24da8e5438171ee8c19e28627e1c98a build by root@new.example.com, 2015-05-23 14:48:22
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:8388316
/proc/drbd 是一个虚拟的文件,用于显示当前配置的所有 drbd 资源的实时状态。
简单介绍下/proc/drbd文件中各字段的含义:
第一行显示的为当前系统使用的 drbd 的版本,第二行包含一些特定的编译信息。
CS(connnection state):网络连接状态
使用命令 drbdadm cstate 查看资源的连接状态。常见的状态有:
Connected 连接:Drbd 已经建立连接,数据镜像现在可用,节点处于正常状态。
Disconnecting 断开:断开只是临时状态,下一个状态将是 StandAlone 独立的。
Unconnected 悬 空 : 是 尝 试 连 接 前 的 临 时 状 态 , 可 能 的 下 一 个 状 态 为 WFconnection 和WFReportParams。
Timeout 超时:与对等节点连接超时,也是临时状态,下一个状态为 Unconected 悬空。
RO(role 角色):节点的角色
本地节点一般显示在前,对等节点资源显示在后。资源的角色一般为如下之一:
Primary 主:资源目前为主,并且可能正在被读取或者写入。若不是双主模式被激活,这种角色只可能出现在两节点中的一个上。
Secondary 次:资源目前为次。正常接收对等节点的更新(除非运行在断开模式下才不是),但是它既不能被读取也不能被写入。这种角色只能是两节点中的一个。
Unknown 未知:资源角色目前未知。本地资源不会出现这种状态,只有对等节点在断开模式下才会出现在这种情况。
DS(disk stats): 磁盘状态
本地和对等节点的磁盘状态都有可能是以下状态之一:
Consistent:一个没有连接的节点数据一致。当建立连接时,它决定数据是 UpToDate 或者是Outdated。
UpToDate:一致的最新的数据状态,这个状态是正常的状态。
Failed 失败:本地块设备报告 I/O 错误的下一个状态。其下一个状态为 Diskless 无盘。
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态。
Outdated:数据资源是一致的,但是已经过时。
DUnknown:当对等节点网络连接不可用时出现这种状态。