DRBD 概述 一、DRBD简介 DRBD 的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD 是由内核模块和相关脚本而组成,用来构建数据的高可用性集群。其实现方式是通过网络来镜像整个磁盘设备(数据)。你可以把它看作是一种基于网络的 RAID1。它允许用户在远程机器上建立一个本地块设备的实时镜像。 二、DRBD工作原理 (DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存储到自己的磁盘中。目前,DRBD每次只允许对一个节 点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。 三、DRBD与HA的关系 一个 DRBD 系统由两个节点构成,与HA 集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问 DRBD 设备(/dev/drbd*)。在主节点写入的数据通过 DRBD 设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的 DRBD 设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD 只是将数据从 DRBD 设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而 DRBD 也可以作为一个共享存储设备,使用 DRBD 不需要太多的硬件的投资。因为它在TCP/IP 网络中运行,所以,利用DRBD 作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错。 四、DRBD复制模式 协议 A : 异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点。 协议 B : 内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了远程节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘。 协议 C : 同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但 I / O 吞吐量依赖于网络带宽一般使用协议 C,但选择 C 协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议。 Heartbeat 一、heartbeat简介 Heartbeat 是 Linux-HA 工程的一个组件,自1999 年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用,这里分析的是2007年1月18日发布的版本 2.0.8。 随着 Linux 在关键行业应用的逐渐增多,它必将提供一些原来由 IBM 和 SUN 这样的大型商业公司所提供的服务,这些商业公司所提供的服务都有一个关键特性,就是高可用集群。 二、heartbeat 工作原理 Heartbeat 最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过 网络链路和串口进行,而且支持冗余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未收到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运行在对方主机上的资源或者服务。 三、高可用集群 高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一系统,在这样的一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一组被称为“心跳”的代码完成。在 Linux-HA 里这个功能由一个叫做heartbeat 的程序完成。 环境描述:
操作系统
IP地址
主机名
软件包列表
CentOS release 6.5
192.168.200.101
server1
DRBD 、heartbeat 、mysql
CentOS release 6.5
192.168.200.102
server2
DRBD 、heartbeat 、mysql
CentOS release 6.5
192.168.200.103
Slave1
Mysql
CentOS release 6.5
192.168.200.104
Slave2
mysql
CentOS release 6.5
192.168.200.105
Lvs-m
Lvs+keepalived
CentOS release 6.5
192.168.200.106
Lvs-s
Lvs+keepalived
配置过程: 安装前准备配置: 所有主机需要添加一块60G的SCSI接口硬盘 配置所有机器: 关闭防火墙和selinux机制 [root@localhost ~]# service iptables stop [root@localhost ~]# setenforce 0 主从都要配置,分区不需要格式化 [root@localhost ~]# fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) P Partition number (1-4): 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610,default 2610): +10G Command (m for help): w [root@server1 ~]# partprobe /dev/sdb 从主机改为 server2 [root@localhost ~]# vim /etc/sysconfig/network 2 HOSTNAME=server1 [root@localhost ~]# hostname server1 [root@localhost ~]# bash [root@server1 ~]# vim /etc/hosts 3 192.168.200.101 server1 4 192.168.200.102 server2 Heartbeat安装: 主从都需要安装 把包上传到/root下,按照顺序安装。 [root@server1 ~]#rpm -ivhPyXML-0.8.4-19.el6.x86_64.rpm [root@server1 ~]#rpm -ivhperl-TimeDate-1.16-13.el6.noarch.rpm [root@server1 ~]#rpm -ivhresource-agents-3.9.5-24.el6_7.1.x86_64.rpm [root@server1 ~]#rpm -ivh lib64ltdl7-2.2.6-6.1mdv2009.1.x86_64.rpm [root@server1 ~]#rpm -ivhcluster-glue-libs-1.0.5-6.el6.x86_64.rpm [root@server1 ~]#rpm -ivhcluster-glue-1.0.5-6.el6.x86_64.rpm [root@server1 ~]#yum -y install kernel-devel kernel-headers [root@server1 ~]#rpm -ivh heartbeat-libs-3.0.4-2.el6.x86_64.rpmheartbeat-3.0.4-2.el6.x86_64.rpm 安装配置 DRBD: 主从都需要安装 [root@server1 ~]# tar xf drbd-8.4.3.tar.gz [root@server1 ~]# cd drbd-8.4.3 [root@server1 drbd-8.4.3]#./configure--prefix=/usr/local/drbd --with-km --with-heartbeat [root@server1 drbd-8.4.3]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/&& make && make install [root@server1 drbd-8.4.3]# mkdir -p/usr/local/drbd/var/run/drbd [root@server1 drbd-8.4.3]# cp/usr/local/drbd/etc/rc.d/init.d/drbd /etc/init.d/ [root@server1 drbd-8.4.3]# chkconfig --add drbd [root@server1 drbd-8.4.3]# cd drbd [root@server1 drbd]# make clean [root@server1 drbd]# make KDIR=/usr/src/kernels/2.6.32-504.el6.x86_64/ [root@server1 drbd]# cp drbd.ko /lib/modules/2.6.32-504.el6.x86_64/kernel/lib/ [root@server1 drbd]# depmod [root@server1 drbd]# cp -R/usr/local/drbd/etc/ha.d/resource.d/* /etc/ha.d/resource.d/ [root@server1 drbd]# cd /usr/local/drbd/etc/drbd.d/ [root@server1 drbd]# cat /usr/local/drbd/etc/drbd.conf # You can find an example in/usr/share/doc/drbd.../drbd.conf.example
//此目录下所有以.res 结尾的都为资源文件
include"drbd.d/global_common.conf";
include "drbd.d/*.res"; 配置global_common.conf文件(主从一致) [root@server1 drbd.d]# pwd /usr/local/drbd/etc/drbd.d [root@server1 drbd.d]# cp global_common.conf{,-$(date+%s)} [root@server1 drbd.d]# vim global_common.conf global { usage-count yes; // 是否对使用信息作统计, 默认为 yes } common { startup { wfc-timeout 120; // 等待连接的超时时间 degr-wfc-timeout 120; } disk { on-io-error detach; //当IO出现错误时执行的动作 } net { protocol C; // 复制模式为第 3种 } } 配置资源文件(主从一致) [root@server1 drbd.d]# vim r0.res resource r0 { //r0资源名称 on server1 { device /dev/drbd0; // 逻辑设备路径 disk /dev/sdb1; // 物理设备 address 192.168.200.101:7788; //主节点 meta-disk internal; } on server2 { device /dev/drbd0; disk /dev/sdb1; address 192.168.200.102:7788; // 备节点 meta-disk internal; } }
[root@server1 drbd.d]# scp global_common.conf r0.res 192.168.200.102:/usr/local/drbd/etc/drbd.d 创建元数据(两个节点上操作) [root@server1 drbd.d]# modprobe drbd [root@server1 drbd.d]# lsmod | grep drbd drbd 310268 0 libcrc32c 1246 1 drbd [root@server1 drbd.d]# dd if=/dev/zero bs=1M count=1of=/dev/sdb1 [root@server1 drbd.d]# drbdadm create-md r0 // 输出以下信息 The server's response is: you are the 57184th user to install this version Writing meta data... initializing activity log NOT initializing bitmap New drbd meta data block successfully created. //当输出成功信息后可 Ctrl+C结束
注意: 当执行命令”drbdadm create-md r0 ”时,出现以下错误信息。 Device sizewould be truncated, which would corruptdata and result in 'accessbeyond end of device' errors. You need toeither * useexternal meta data (recommended) * shrink thatfilesystem first * zero outthe device (destroy the filesystem) Operationrefused. Command'drbdmeta 0 v08 /dev/xvdb internal create-md' terminated with exit code 40 drbdadmcreate-md r0: exited with code 40 解决办法:初始化磁盘文件格式, dd if=/dev/zero bs=1M count=1 of=/dev/sdb1; sync 启动 DRBD(主从节点都要执行) [root@server1 drbd.d]# /etc/init.d/drbd start Starting DRBD resources: [ create res: r0 prepare disk: r0 adjust disk: r0 adjust net: r0 ] ........ [root@server1 drbd.d]# netstat -anpt | grep 7788 tcp 0 0 192.168.200.101:35654 192.168.200.102:7788 ESTABLISHED - tcp 0 0 192.168.200.101:7788 192.168.200.102:33034 ESTABLISHED - [root@server2 drbd.d]# netstat -anpt | grep 7788 tcp 0 0 192.168.200.102:7788 192.168.200.101:48501 ESTABLISHED - tcp 0 0 192.168.200.102:10354 192.168.200.101:7788 ESTABLISHED - 手动验证主从切换: 初始化网络磁盘(主节点上执行) [root@server1 drbd.d]# drbdadm -- --overwrite-data-of-peerprimary r0 [root@server1 drbd.d]#watch -n 2 cat /proc/drbd //动态显示同步内容 version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515build by root@bogon, 2016-12-04 13:39:22 0: cs:SyncSource ro:Primary/Secondaryds:UpToDate/Inconsistent C r----- ns:116024 nr:0 dw:0 dr:123552 al:0 bm:7 lo:0 pe:1 ua:7ap:0 ep:1 wo:f oos:10374340 [>....................] sync'ed: 1.2%(10128/