DRBD+Heartbeat让MySQL提供的服务更加稳定

这段时间对DRBDHeartbeat有了一个初步的了解,因为公司目前也在用,所以要好好搞一下,今天就在虚拟机打个了环境,亲自动手学习一下。这两个软件的安装都不复杂,如果你能用yum,那就是瞬间搞定的事情,没有的话用rpm包安装也是很轻松的事情,个人觉得,如果不是说地球上真的找不到和你平台对应的rpm包/tar包的话,那你就用源码包好了,自己享受编译带给你的“成就感”吧。不知道为什么很多时候大家都喜欢源码编来编去的,其实,你编译出来的东西不一定比人家专门的开发人员编出的软件效果要好,也可能你会说了,自己编译自由想放哪儿就放哪儿(难道就这么点追求),如果你习惯了rpm,其实,它的安装目录就那么几个位置,况且rpm也有命名选项帮你找出来。

实验环境:

centos 5.5 32位 + drbd-8.0.16 + heartbeat-2.1.3

node1:  drbd-one  192.168.209.12 (primary)

node2: drbd-two 192.168.209.11 (secondary)

vip: 192.168.209.13 ( for heartbeat )

NOTE: drdb和heartbeat的安装配置都需要在两台机器上,做相应的操作,大家需要注意操作步骤上的不同。

– Primary Node : drdb-one –

1.安装drbd和heartbeat

从这个链接下载http://mirror.centos.org/centos/5/extras/i386/RPMS/, 里面drbd和heartbeat的包都有了,找到和自己系统对应的包下好了,下面是我需要的包:

drbd-8.0.16-5.el5.centos.i386.rpm,kmod-drbd-8.0.16-5.el5_3.i686.rpm,heartbeat-2.1.3-3.el5.centos.i386.rpm,heartbeat-pils-2.1.3-3.el5.centos.i386.rpm,heartbeat-stonith-2.1.3-3.el5.centos.i386.rpm,libnet-1.1.2.1-2.rf.i386.rpm。但是有点小意外,heartbeat-2.1.3-3这个包就是安装不上。于是,没办法我就到这里下了一个heartbeat的源码包,不过我还是想rpm安的省心,就额外做了下面一步操作,rpmbuilt -ta heartbeat-2.1.3.tar.gz,作成rpm包再来安装,生成的rpm包放在了/usr/src/redhat/RPMS/i386下面了,一共生成7个rpm包,只需要这3个就行:heartbeat-2.1.3-1.i386.rpm,pils-2.1.3-1.i386.rpm,stonith-2.1.3-1.i386.rpm。

Trip: 安装命令:rpm -ivh heartbeat-2.1.3-1.i386.rpm;卸载命令:rpm -e heartbeat-pils-2.1.3-3.el5.centos.i386;查找路径:rpm -q drbd -d。这些都是大家在熟悉不过的了,其实我就是弄明白了两组短语的意思:package file和package name,所以很开心lol..

另外,安装完heartbeat后,会提示你需要对一些drbd的命令进行权限修改,如下:

SHELL> chgrp haclient /sbin/drbdsetup; chmod o-x /sbin/drbdsetup; chmod u+s /sbin/drdbsetup

SHELL> chgrp haclient /sbin/drbdmeta; chmod o-x /sbin/drbdmeta; chmod u+s /sbin/drdbmeta

2.配置drbd

照着手册来,也很容易,关键是你要把那些配置文件中的配置项都弄明白了。具体步骤和一些意外如下:

1> 创建一个lower level device出来,你需要从现有磁盘划出一个空的分区来(不需要文件系统),或是整个磁盘作为一个分区,我在vmware下加了一个5GB大小的一块磁盘并将其划成了一个分区,操作如下:

[root@drdb-one ~]# fdisk /dev/sdb –> n –> p –> 1 –> w

2> drbd.conf中最基础的配置如下(可以从/usr/share/doc/drbd-8.0.16获得配置模板):

[root@drdb-one ~]# vi /etc/drbd.conf

global {
usage-count yes;          — 帮LINBIT公司统计drbd使用量
}
common {
syncer { rate 10M; }     — 同步的速率,是在100MB的网口下
}
resource r0 {                     — r0资源名称,以后很多地方会用到
protocol C;                       — C为最安全同时也是性能最好的一种确认写操作完成的方法

net {      — 以下为当发生脑裂时,各种不正常的角色匹配状态下,脑裂的处理方法
after-sb-0pri discard-zero-changes;        — 两台主机角色均为secondary
after-sb-1pri discard-secondary;              — 两台主机角色中,其中一台为primary
after-sb-2pri disconnect;                            — 两台主机角色均为primary
}

on drbd-one {
device     /dev/drbd0;        — 逻辑设备的路径
disk       /dev/sdb1;               — 物理设备(lower-level device)
address    192.168.209.12:7788;       — 主节点
meta-disk  internal;             — 元数据(drbd的相关信息)保存的位置,internal为drbd物理设备的最后一个section上
}
on drbd-two {                — 这里的名称要与你uname -n出的结果一致
device    /dev/drbd0;
disk      /dev/sdb1;
address   192.168.209.11:7788;    — 次节点
meta-disk internal;
}
}

3> 初始化drbd的metadata

[root@drdb-one ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.

4> 启动配置的资源

Option1: [root@drdb-one ~]# drbdadm up r0     (drbd官方手册

Option2: [root@drdb-one ~]# /etc/init.d/drbd start     (mysql官方手册
Starting DRBD resources: [ d(r0) ]……….
***************************************************************
DRBD’s startup script waits for the peer node(s) to appear.
- In case this node was already a degraded cluster before the
reboot the timeout is 0 seconds. [degr-wfc-timeout]
- If the peer was available before the reboot the timeout will
expire after 0 seconds. [wfc-timeout]
(These values are for resource ‘r0′; 0 sec -> wait forever)
To abort waiting enter ‘yes’ [  43]:yes

NOTE: 之前一直尝试按照option2的方式开启drbd,但是每次都是下面一堆提示,不知道是个什么状况,最后选择了option1的方法。

5> 初始化同步源

[root@drdb-one ~]# drbdadm — –overwrite-data-of-peer primary r0

6> 创建文件系统并挂载

[root@drdb-one ~]# mkfs.ext3 /dev/drbd0 &&  mkdir -p /data/drbd && mount /dev/drbd0 /data/drbd

NOTE: 以后/data/drbd这个目录下就对应drbd设备中的数据。

– Secondary Node: drbd-two –

在次节点上,我们只需要执行前四部即可;其中,当我执行第4步的时候,再次尝试option2的方法启动drbd就没有问题,成功开启(咋回事呢?— drbd两个节点要彼此通信,所以,当drbd-two的drbd服务开启后,之前drbd-one上执行/etc/init.d/drbd start时的等待就会自动停止,可以通过这个判断你的drbd的节点间网络连接是否正常)。

到此drdb部分的配置就全部完成,可以通过下面各种命令来查看当前drbd设备间的同步情况,当前drbd处在同步数据块的状态,两端信息并不一致:

[root@drdb-one ~]# cat /proc/drbd
version: 8.0.16 (api:86/proto:86)
GIT-hash: d30881451c988619e243d6294a899139eed1183d build by
mockbuild@v20z-x86-64.home.local, 2009-08-22 13:23:34
0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
ns:340864 nr:0 dw:214960 dr:341001 al:73 bm:20 lo:0 pe:1 ua:0 ap:0
[>...................] sync’ed:  6.6% (4780/5112)M
finish: 0:05:54 speed: 13,792 (10,648) K/sec
resync: used:0/61 hits:21282 misses:21 starving:0 dirty:0 changed:21
act_log: used:0/127 hits:53667 misses:73 starving:0 dirty:0 changed:73

[root@drdb-one ~]# drbdadm cstate r0
SyncSource
[root@drdb-one ~]# drbdadm dstate r0
UpToDate/Inconsistent

3. 配置heartbeat

配置heartbeat需要在/etc/ha.d下配置3个文件:ha.cf、haresources、authkeys,在/usr/share/doc/heartbeat-2.1.3目录下有这3个配置文件的模板,里面对各个参数做了详细的说明。

NOTE: 以下3个配置文件中的内容在两个机器上均需要保持一致。

1>.  shell> vi ha.cf

debugfile /var/log/ha-debug
logfile /var/log/ha-log
autojoin none
logfacility local0
keepalive 2
deadtime 30
warntime 10
initdead 120
udpport 694                 — 用于ucast通讯的UDP端口
ucast eth0 192.168.209.11             — ip为对方的IP地址,即primary上的配置文件中该ip为secondary的ip地址,而secondary上的为primary的ip地址,监控彼此的“死活”
auto_failback off
node drbd-one           — heartbeat所监控的主机名
node drbd-two

ping 192.168.209.14     — 网关ip
respawn hacluster /usr/lib/heartbeat/ipfail               — ipfail不理解这个脚本的用途(请指点)
apiauth ipfail gid=haclient uid=hacluster                      — 这里的hacluster用户以及haclient组,是安装完heartbeat后被自动创建的

2>. shell> vi authkeys    (Note: chmod 600 /etc/ha.d/authkeys,否则,启动heartbeat服务时会报error)

auth 1       — 1类似一个序列号,从1开始
1 crc         — crc是一种校验算法,还有sha1、md5,这两种还需要设置共享的字串

3>. shell> vi haresources

drbd-one drbddisk::r0 Filesystem::/dev/drbd0::/data/drbd::ext3 mysql 192.168.209.13

该配置文件必须在所有的节点上都要保持一致,这个提示是在haresources的模板文件中看到的,同时,它也解释了我的疑惑,就是在最开头的节点名称,没有必要非的是当前节点的主机名,只保证我们选择的主节点(preferred note)上的服务都自动开启就够了,避免开启所有节点上的服务。其配置格式为:<node-name >  <resource 1>  <resource 2> … 在上面的例子中,提供了对mysql资源的启动和关闭,所以需要在/etc/ha.d/resource.d这个目录下去创建一个控制该资源启动脚本,命令为: ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysql,其实就是你安装完mysql后,提供的那个mysql.server的脚本。192.168.209.13这个ip让我郁闷了两天,之前一直以为这个IP是前面节点(drbd-one)对应的ip呢,结果导致测试故障转移时总是失败,最后还是韩老师指引我走上征途。这里的这个ip一个浮动ip,或是有人叫虚ip(这个名字不好,不容易让人理解),提供服务时对外公布的ip,可以被cluster中各个node使用,但并不会固定绑定到某一个节点上,在HA这种架构中,随着服务资源的转移而在节点间自由漂移,以保证对外提供稳定的服务。

现在,heartbeat也已经配置完毕,分别在两台机器上启动heartbeat服务,执行命令:service heartbeat start

4. 故障转移测试

资源转移有这么两种方式:Failover(资源从primary切换到secondary上);Takeover(资源又被primary从secondary夺回),执行failover和takeover时要分清当前资源所在的主机,下面是failover的操作和日志分析。

shell> service heartbeat standby   OR     /usr/lib/heartbeat/hb_standby

执行上面的命令,就会将haresources里面指定的资源从drbd-one正常的转移到drbd-two上,这时通过cat /proc/drbd在两台机器上查看,角色已发生了改变,mysql的服务也已在从服务器上成功开启,通过查看两台机器上的heartbeat日志便可清楚可见资源切换的整个过程,下面我们就具体看下,heartbeat是怎么做的。

drbd-one :: /var/log/ha-log,如下(为了便于说明将上面日志输出行都加了行号):

1-heartbeat[499]: 2010/11/18_19:20:44 info: drbd-one wants to go standby [all]
2-heartbeat[499]: 2010/11/18_19:20:45 info: standby: drbd-two can take our all resources
3-heartbeat[641]: 2010/11/18_19:20:45 info: give up all HA resources (standby).
4-ResourceManager[654]:   2010/11/18_19:20:45 info: Releasing resource group: drbd-one drbddisk::r0 Filesystem::/dev/drbd0::/data/drbd::ext3 mysql 192.168.209.13
5-ResourceManager[654]:   2010/11/18_19:20:45 info: Running /etc/ha.d/resource.d/IPaddr 192.168.209.13 stop
6-IPaddr[694]:    2010/11/18_19:20:45 INFO:  Success
7-ResourceManager[654]:   2010/11/18_19:20:45 info: Running /etc/ha.d/resource.d/mysql  stop
8-ResourceManager[654]:   2010/11/18_19:20:47 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /data/drbd ext3 stop
9-Filesystem[824]:        2010/11/18_19:20:47 INFO: Running stop for /dev/drbd0 on /data/drbd
10-Filesystem[824]:        2010/11/18_19:20:47 INFO: Trying to unmount /data/drbd
11-Filesystem[824]:        2010/11/18_19:20:47 INFO: unmounted /data/drbd successfully
12-Filesystem[813]:        2010/11/18_19:20:47 INFO:  Success
13-ResourceManager[654]:   2010/11/18_19:20:47 info: Running /etc/ha.d/resource.d/drbddisk r0 stop
14-heartbeat[641]: 2010/11/18_19:20:47 info: all HA resource release completed (standby).
15-heartbeat[499]: 2010/11/18_19:20:47 info: Local standby process completed [all].
16-heartbeat[499]: 2010/11/18_19:20:51 WARN: 1 lost packet(s) for [drbd-two] [111:113]
17-heartbeat[499]: 2010/11/18_19:20:51 info: remote resource transition completed.
18-heartbeat[499]: 2010/11/18_19:20:51 info: No pkts missing from drbd-two!
19-heartbeat[499]: 2010/11/18_19:20:51 info: Other node completed standby takeover of all resources.
20-heartbeat[499]: 2010/11/18_19:27:56 WARN: Late heartbeat: Node drbd-two: interval 57030 ms

注释: 1-3 — 这三行提示heartbeat要将drbd-one的资源释放,同时将有对端的drbd-two来接管所有资源服务。

4 — ResourceManage这是一个资源管理脚本,可以在/usr/lib/heartbeat下找到,通过调用定义好的“命令”(都是些控制资源启动关闭的脚本)和语法规则,来关闭和启动资源服务;这行表示当前有哪些资源需要释放。

5-6 — 通过IPaddr脚本将浮动ip从drbd-one上成功停掉。

7 — mysql服务被停止。

8-12 — 将mysql的数据目录卸载。

13 — 停止drbd服务。

14-20  — 这些行是heartbeat成功将服务切换到对端主机后的一些信息提示,有正常的有警告的。其中,20行,提示drbd-two的时间别drbd-one落后57秒,所以,配置前最好将cluster中的所有节点的时钟保持一致以免发生异常。

drbd-two :: /var/log/ha-log,该日志呈现的是一个获得资源的过程,如下:

heartbeat[9902]: 2010/11/19_19:20:17 info: drbd-one wants to go standby [all]
heartbeat[9902]: 2010/11/19_19:20:21 info: standby: acquire [all] resources from drbd-one
heartbeat[9948]: 2010/11/19_19:20:21 info: acquire all HA resources (standby).
ResourceManager[9961]:  2010/11/19_19:20:21 info: Acquiring resource group: drbd-one drbddisk::r0 Filesystem::/dev/drbd0::/data/drbd::ext3 mysql 192.168.209.13
ResourceManager[9961]:  2010/11/19_19:20:21 info: Running /etc/ha.d/resource.d/drbddisk r0 start
Filesystem[10029]:      2010/11/19_19:20:21 INFO:  Resource is stopped
ResourceManager[9961]:  2010/11/19_19:20:21 info: Running /etc/ha.d/resource.d/Filesystem /dev/drbd0 /data/drbd ext3 start
Filesystem[10110]:      2010/11/19_19:20:22 INFO: Running start for /dev/drbd0 on /data/drbd
Filesystem[10099]:      2010/11/19_19:20:22 INFO:  Success
ResourceManager[9961]:  2010/11/19_19:20:22 info: Running /etc/ha.d/resource.d/mysql  start
IPaddr[10325]:  2010/11/19_19:20:23 INFO:  Resource is stopped
ResourceManager[9961]:  2010/11/19_19:20:23 info: Running /etc/ha.d/resource.d/IPaddr 192.168.209.13 start
IPaddr[10405]:  2010/11/19_19:20:23 INFO: Using calculated nic for 192.168.209.13: eth0
IPaddr[10405]:  2010/11/19_19:20:23 INFO: Using calculated netmask for 192.168.209.13: 255.255.255.0
IPaddr[10405]:  2010/11/19_19:20:23 INFO: eval ifconfig eth0:0 192.168.209.13 netmask 255.255.255.0 broadcast 192.168.209.255
IPaddr[10388]:  2010/11/19_19:20:23 INFO:  Success
heartbeat[9948]: 2010/11/19_19:20:23 info: all HA resource acquisition completed (standby).
heartbeat[9902]: 2010/11/19_19:20:23 info: Standby resource acquisition done [all].
heartbeat[9902]: 2010/11/19_19:20:24 info: remote resource transition completed.
heartbeat[9902]: 2010/11/19_19:25:59 WARN: 27 lost packet(s) for [drbd-one] [225:253]
heartbeat[9902]: 2010/11/19_19:26:00 info: No pkts missing from drbd-one!

注释:你会发现获得资源和释放资源的顺序是不同的,当获得资源时,资源的开启顺序是haresources中从左到右,而主服务器释放资源时是从右向左一次停止服务。在IPaddr的输出中,会看到这个浮动ip被配置到drbd-two的eth0上虚拟的一个网口上eth0:0。之前,haresources里面那个ip我设置成了主节点的对应ip,可想而知,当资源去换后,会将该ip设置到次节点上,这时就会发出,从节点能ping通主节点,而主节点ping不通从节点,这时drbd的两端状态开始时候主drbd-one为secondary/unknown,从drbd-two为primary/unknown,最后会都变成secondary/unknown,unknown说明是网络的配置有问题,同时,从日志中会看到此刻发生了SB(不要谐音哦lol),提示deadtime可能设置的过低,看来平时还真要小心脑裂的发生。

heartbeat这个东西呢,就是通过监控主机间网络的联通状况,作出一个宏观的判断,主服务器是好还是故障,从而将资源作出调整,不能判断具体提供资源的服务是否运行正常,R1-style 是做不到的;不过,现在通过配置CRM可以做到对服务的监控,配置还是比较复杂的。

觉得文章有用?立即: 和朋友一起 共学习 共进步!

猜您喜欢

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>