mysql drbd heartbeat实现高可用性(转)

本文介绍了DRBD在Linux环境下实现高可用集群服务器的方法,重点阐述了DRBD的主要功能、应用及与MySQL集群结合的可靠性和特点,包括如何在RedHat Enterprise Linux AS release 4操作系统中编译、安装DRBD和heartbeat软件,配置DRBD设备实现数据实时同步,以及通过Heartbeat进行服务器间的节点切换。此外,文章还讨论了DRBD与MySQL的关系,包括性能优势、应用场景和试验环境设置,展示了DRBD如何增强MySQL集群的可用性。

1,什么是DRBD
DRBD(Distributed Replicated Block Device),DRBD 号称是 "网络 RAID",开源软件,由 LINBIT 公司开发。
2,DRBD的主要功能
DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。
3,DRBD的主要应用
如果主服务器宕机,造成的损失是不可估量的。要保证主服务器不间断服务,就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中,heartbeat为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat drbd在Linux下创建一个高可用(HA)的集群服务器,在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。
4,DRBD于mysql的关系
MySQL 与 LINBIT 达成了合作关系,大张旗鼓的搞了这个 "12 天 Scale-Out" 活动,也是这个商业合作驱动的吧。DRBD 助力 MySQL, 号称可以得到四个 9 的可靠性,这不低于任何一款商业数据库软件了。
DRBD 的出现的确对 MySQL 集群的可用性有很大提高。而且,有独到的特点,非常适合面向互联网的应用。因为是在存储层的数据块同步,很容易的做到应用层的 IO 负载均衡(备机承担一定的读压力),不但支持数据库失败接管,还能做到 IP 失败接管,接管时间小于 30 秒,真是穷人的绝佳集群解决方案。
本文所提到试验环境为:
操作系统:
Red Hat Enterprise Linux AS release 4 (Nahant Update 4)
软件:
drbd-8.2.6.tar.gz
heartbeat-2.1.3-3.el4.centos
heartbeat-pils-2.1.3-3.el4.centos
heartbeat-stonith-2.1.3-3.el4.centos
mysql-5.1.26-rc-linux-i686-icc-glibc23.tar.gz
主机环境:
drbd 主机列表 IP 地址 主机名
主机1(primary) 192.168.1.241 drbd-1
主机2(secondary) 192.168.1.242 drbd-2
另外,2个主机都预留一个空白的分区:/dev/sdb1,不需要创建任何文件系统。
1,编译与安装DRBD,heartbeat
在2台主从机器上都要安装DRBD
[root@drbd-1 ~] tar -xvzf drbd-8.2.6.tar.gz
[root@drbd-1 ~] cd drbd-8.2.6 && make && make rpm
[root@drbd-1 ~] cd dist/RPMS/i386
[root@drbd-1 ~] ls
drbd-8.2.6-3.i386.rpm
drbd-debuginfo-8.2.6-3.i386.rpm
drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm
[root@drbd-1 ~] rpm -ivh drbd-8.2.6-3.i386.rpm
[root@drbd-1 ~] rpm -ivh drbd-debuginfo-8.2.6-3.i386.rpm
[root@drbd-1 ~] rpm -ivh drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm
[root@drbd-1 ~] yum install heartbeat
yum升级安装的软件包下载保存在:/var/cache/yum/extras/packages
安装mysql就太简单了,这里就不废话了!
2,加载DRBD模块
[root@drbd-1 ~] modprobe drbd
[root@drbd-1 ~] lsmod |grep drbd
drbd 242924 2
如果有,则表示成功了!!!
3,配置/etc/drbd.conf
编辑配置文件,2个主机上的内容一样,内容如下:
#让linbit公司收集目前drbd的使用情况,yes为参加。
global {
usage-count yes;
}
#drbd所管理的多个资源之间的common,主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等.
common {
syncer { rate 100M; }
}
#创建一个资源,名字叫”db”
resource db {
#使用协议C.表示收到远程主机的写入确认后,则认为写入完成。
protocol C;
startup {
wfc-timeout 0;
degr-wfc-timeout 120;
}
#由于实验环境下两台服务器硬盘大小可能不同,所以需要设置drbd的大小。
disk {
on-io-error detach;
size 6G;
}
net {
max-buffers 2048;
ko-count 4;
}
syncer {
rate 100M;
}
#设定一个节点,分别以各自的主机名命名
on drbd-1 {
#设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb1
device /dev/drbd0;
disk /dev/sdb1;
#设定监听地址以及端口

address 192.168.1.241:8888;
#设定元数据保存方式:可以用 internal(即保存在同一个物理分区下)
#也可以保存在其他分区上
meta-disk internal;
}
on drbd-2 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.242:8888;
meta-disk internal;
}
}
4,启动drbd
准备启动之前,需要分别在2个主机上的 /dev/sdb1 分区上创建相应的元数据保存的数据块:
[root@drbd-1 ~] drbdadm create-md db
[root@drbd-2 ~] drbdadm create-md db
2次输入“yes”,如果出现下面的提示信息,表示成功
[root@drbd-1 /]# drbdadm create-md db
md_offset 8587153408
al_offset 8587120640
bm_offset 8586858496
Found ext3 filesystem which uses 6291456 kB
current configuration leaves usable 8385604 kB
==> This might destroy existing data! wait forever)
To abort waiting enter 'yes' [ 47]:
此时,2台机器的DRBD服务都起来了,检查进程是否存在:
[root@drbd-1 /]# ps aux | grep drbd
root 3758 14.5 0.0 0 0 ? S 15:56 0:20 [drbd0_worker]
root 3762 9.6 0.0 0 0 ? S 15:56 0:13 [drbd0_receiver]
root 3787 2.4 0.0 0 0 ? S 15:56 0:03 [drbd0_asender]
root 3794 0.0 0.2 644 128 pts/0 R 15:58 0:00 grep drbd
可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。
看看刚启动后的drbd状态:
[root@drbd-1 /]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17 17:46:45
0: cs:Connected st: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 oos:6291456
[root@drbd-2 /]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-2, 2008-09-17 17:51:50
0: cs:Connected st: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 oos:6291456
注意:这个时候,2台服务器都为从节点状态(st:Secondary/Secondary),因为还没有指定哪一台为主节点。
然后,设置启动的一个节点为主节点,我们设置drbd-1为主节点:
[root@drbd-1 /]# drbdadm primary db
State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
Command 'drbdsetup /dev/drbd0 primary' terminated with exit code 11
[root@drbd-1 /]# drbdsetup /dev/drbd0 primary -o
可以看到,第一次设置主节点时用 drbdadm 命令会失败,所以先用drbdsetup 来做,以后就可以用 drbdadm 了。
再次查看2台服务器的drbd状态:
[root@drbd-1 /]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17 17:46:45
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
ns:3483280 nr:0 dw:0 dr:3491456 al:0 bm:212 lo:1 pe:8 ua:256 ap:0 oos:2808416
[==========>.........] sync'ed: 55.5% (2742/6144)M
finish: 0:11:24 speed: 4,084 (4,648) K/sec
[root@drbd-2 /]# cat /proc/drbd
version: 8.2.6 (api:88/proto:86-88)
GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-2, 2008-09-17 17:51:50
0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r---
ns:0 nr:3556832 dw:3556832 dr:0 al:0 bm:217 lo:1 pe:2464 ua:0 ap:0 oos:2734624
[==========>.........] sync'ed: 56.7% (2670/6144)M
finish: 0:07:35 speed: 5,856 (4,128) K/sec
此时可以看到,已经开始同步数据了。设置完之后的第一次同步耗时比较长,因为需要把整个分区的数据全部同步一遍。
第一次同步完成之后,就可以对drbd的设备创建文件系统了:
[root@drbd-1 /]# mkfs.ext3 /dev/drbd0
将文件系统mount上:
[root@drbd-1 /]# mount /dev/drbd0 /drbddata
在主节点上测试数据写入:
[root@drbd-1 drbddata]# ll
total 4
drwx------ 4 mysql root 4096 Oct 13 16:29 mysql
然后,我们把primary降级成secondary,把secondary提升成primary:
[root@drbd-1 /]# umount /drbddata/
[root@drbd-1 /]# drbdadm secondary db
把primary降级前,一定要先umount设备才行。然后提升secondary:
[root@drbd-2 /]# drbdadm primary db
[root@drbd-2 /]# mount /dev/drbd0 /drbddata/
[root@drbd-2 drbddata]# ll
total 4
drwx------ 4 mysql root 4096 Oct 13 16:29 mysql
可以看到,数据已经完全同步过去了。
下面就要开始和heartbeat的整合了,前面heartbeat已经安装过,只需要修改下配置文件就可以了,
cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
cp /usr/share/doc/heartbeat-2.1.3/authkeys .
cp /usr/share/doc/heartbeat-2.1.3/haresources .
配置ha.cf(ha主要配置文件):
[root@drbd-1 ha.d]# more ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694
bcast eth0
auto_failback off
node drbd-1
node drbd-2
ping_group group1 192.168.1.1 192.168.1.254
respawn root /usr/lib/heartbeat/ipfail
apiauth ipfail gid=root uid=root
配置authkeys认证:
[root@drbd-1 ha.d]# more authkeys
auth 1
1 crc
配置haresources资源文件:
drbd-1 drbddisk Filesystem::/dev/drbd0::/drbddata::ext3 mysql 192.168.1.243
注意:
资源组配置文件主要是配置切换过程需要管理的各种资源的,有一个很关键的点,那就是一个资源组中的各个资源的排列顺序是需要注意的,在hearbeat管理资源组的时候,获取资源的过程是从左往右依次处理,释放资源的时候是从右往左依次处理。
资源组的第一列是我们在ha.cf配置文件中的node之一,而且应该是当前准备作为primary节点的那一个node。
上面资源组中的各项含义如下:
drbd-1 当前primary节点名(uname -n)

drbddisk 告诉heartbeat要管理drbd的资源
Filesystem 这里是告诉heartbeat需要管理文件系统资源,其实实际上就是执行mount/umount命令,后面的“::”符号之后是跟的Filesystem的参数 设备名和mount点)
mysql 告诉需要管理mysql
192.168.1.243 这里是让heartbeat帮你管理一个service ip,会跟着主节点一起漂移

测试切换:
1) 手工调用heartbeat的节点切换脚本:
执行/usr/lib/heartbeat/hb_standby 脚本,让heartbeat通知对方节点自己请求变成standby节点,请求对方成为primary节点,切换工作在10s左右即完成.
2) 拔掉网线,测试在primary节点的网络断开后的切换情况
通过测试,在拔掉网线后,当主节点发现无法和standby节点无法通信后,会在log中记录warn信息,如果延续时间达到在ha.cf中设定的时长后,会开始释放资 源,standby节点发现无法和主节点通信一段时间(ha.cf设定)后,开始尝试启动资源并将自己active成primary节点。切换过程除开ha.cf中设定的时长之外 的时间段同样非常短。
3) shutdown primary主机,测试是否能够正常切换,基本上和上面测试2差不多。
4) primary node 掉电测试,这里还没有到机房实际操作过,后面会继续测试这个操作。
测试结果:
1,正常切换,数据完整。
2,正常切换,但是主从数据相差一条。
3,正常切换,数据完整。
4,正常切换,数据完整。

 

 

 

====================================================

1、下载对应版本的heartbeat包
     由于安装beartbeat的rpm包需要其他一些包为前提条件,所以可能还需要下载对应版本的其他的几个rpm包,像如下:
     [root@mysql1 heartbeat]# rpm -ivh heartbeat-2.1.3-3.el4.centos.i386.rpm
     warning: heartbeat-2.1.3-3.el4.centos.i386.rpm: V3 DSA signature: NOKEY, key ID 443e1821
     error: Failed dependencies:
             heartbeat-pils = 2.1.3-3.el4.centos is needed by heartbeat-2.1.3-3.el4.centos.i386
             heartbeat-stonith = 2.1.3-3.el4.centos is needed by heartbeat-2.1.3-3.el4.centos.i386
             libpils.so.1 is needed by heartbeat-2.1.3-3.el4.centos.i386
             libstonith.so.1 is needed by heartbeat-2.1.3-3.el4.centos.i386

      然后下载heartbeat-pils-2.1.3-3.el4.centos.i386.rpm和heartbeat-stonith-2.1.3-3.el4.centos.i386.rpm,
在安装这两个包之后,即可正常安装heartbeat了。
2、配置相关文件
      1) 找到安装后heartbeat的文档目录,将三个需要的配置文件样例copy到/etc/ha.d目录下准备后面的配置设
置(这样会更方便,而且有较为详细的配置说明):
      [root@mysql1 ha.d]# rpm -q heartbeat -d
      …   

      /usr/share/doc/heartbeat-2.1.3/AUTHORS
      …   

      [root@mysql1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
      [root@mysql1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/authkeys .
      [root@mysql1 ha.d]# cp /usr/share/doc/heartbeat-2.1.3/haresources .
    
      2) 配置ha.cf(ha主要配置文件):
      logfacility               local0          #这个是设置heartbeat的日志,这里是用的系统日志
      keepalive                 500ms           #多长时间检测一次
      deadtime                  10              #连续多长时间联系不上后认为对方挂掉了(单位是妙)
      warntime                  5               #连续多长时间联系不上后开始警告提示    
      initdead                  100             #这里主要是给重启后预留的一段忽略时间段(比如:重启后启动网络等,
     如果在网络还没有通,keepalive检测肯定通不过,但这时候并不能切换)
      bcast                     eth0
      auto_failback             off             #恢复正常后是否需要再自动切换回来
      node                      mysql1          #节点名(必须是集群中机器的主机名,通过uname -n取得)
      node                      mysql2          #节点名(必须是集群中机器的主机名,通过uname -n取得)   

      ping                      10.0.65.250    
      respawn                   hacluster       /usr/lib/heartbeat/ipfail      #这里是配置ip绑定和切换的功能,
        ipfail就是控制ip切换的程序
      apiauth                   ipfail          gid=haclient      uid=hacluster      #控制ip切换的时候所使用的用户
      deadping 5
      2) haresources 资源组文件配置(v1 style):
      [root@mysql1 ha.d]# cat haresources
      mysql1 drbddisk Filesystem::/dev/drbd0::/drbddata::ext3 mysql 10.0.65.44
      资源组配置文件主要是配置切换过程需要管理的各种资源的,有一个很关键的点,那就是一个资源组中的各个资源
的排列顺序是需要注意的,在hearbeat管理资源组的时候,获取资源的过程是从左往右依次处理,释放资源的时候是从
右往左依次处理。
      资源组里面的资源可以是ip的管理,可以是各种服务,也可以是我们自己写的各种脚本,甚至可以是需要传参数的
脚本(通过::来分割参数)。每一行代表一个资源组,每个资源组之间没有必然的关系。
      资源组的第一列是我们在ha.cf配置文件中的node之一,而且应该是当前准备作为primary节点的那一个node。
      上面资源组中的各项含义如下:
          mysql1          当前primary节点名(uname -n)
          drbddisk        告诉heartbeat要管理drbd的资源
          Filesystem      这里是告诉heartbeat需要管理文件系统资源,其实实际上就是执行mount/umount命令,
   后面的“::”符号之后是跟的Filesystem的参数(设备名和mount点)
          mysql           告诉需要管理mysql
          10.0.65.44      这里是让heartbeat帮你管理一个service ip,会跟着主节点一起漂移
      3) authkeys 通信认证配置文件
    root@mysql2:/root>cat /etc/ha.d/authkeys
      auth 2              #认证方式,有如下三种
      #1 crc              #
      2 sha1 HI!
      #3 md5 Hello!
3、测试切换:
      1) 手工调用heartbeat的节点切换脚本:
      执行/usr/lib/heartbeat/hb_standby 脚本,让heartbeat通知对方节点自己请求变成standby节点,
请求对方成为primary节点,切换工作在10s左右即完成.
      2) 拔掉网线,测试在primary节点的网络断开后的切换情况
      通过测试,在拔掉网线后,当主节点发现无法和standby节点无法通信后,会在log中记录warn信息,
如果延续时间达到在ha.cf中设定的时长后,会开始释放资源,standby节点发现无法和主节点通信一段时间(ha.cf设定)后,
开始尝试启动资源并将自己active成primary节点。切换过程除开ha.cf中设定的时长之外的时间段同样非常短。
      3) shutdown primary主机,测试是否能够正常切换,基本上和上面测试2差不多。
      4) primary node 掉电测试,这里还没有到机房实际操作过,后面会继续测试这个操作。
    
注:以上测试都是基于Heartbeat v1 style的设置情况下所作,由于v1 style配置的heartbeat没办法做到对资源状态的监控,
主要职能通过监控与对方节点以及集群对外的网络状况的监控,而v2 style的配置已经提控了对资源状态的监控,所以后面准备再
针对v2 style的heartbeat进行详细一点的测试。不过,在linux-ha网站上面发现有一个声明,说drbd的作者建议用户继续
使用v1 style来让heartbeat管理drbd资源(http://www.linux-ha.org/DRBD/HowTov2),详细的原因并没有说明。
原文如下:
Note: as of 2008-02-15, the DRBD developers recommend to use the v1 drbddisk RA, although
the v2 drbd RA has been reported to work by some users (decide on your own!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值