免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2270 | 回复: 0
打印 上一主题 下一主题

drbd+mysql+heartbeat [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-11 13:47 |只看该作者 |倒序浏览

DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地
文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中.
本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会
保留有一份相同的数据,可以继续使用.
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,
切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
DRBD的工作原理如下图:
        +--------+
        |  文件系统 |
        +--------+
             |
             V
        +----------+
        |   块设备层  |
        | (/dev/drbd1) |
        +----------+
         |            |
         |            |
         V           V
   +----------+  +-----------+
   |  本地硬盘   |   | 远程主机硬盘 |
   | (/dev/hdb1)  |   | (/dev/hdb1)  |
   +----------+  +-----------+
==========================================================二. DRBD的安装 下载地址
http://oss.linbit.com/drbd/
# tar xvf  drbd-8.0.0.tar.tar
# cd drbd-8.0.0
# make
# make installmake install执行之后:
drbd.ko被安装到/lib/modules/$KernelVersion/kernel/drivers/block下.
drbd相关工具(drbdadm,drbdsetup)被安装到/sbin下.
并会在/etc/init.d/下建立drbd启动脚本.
=============================================================1.DRBD使用的硬盘分区
你需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区.这两个分区的大小必须相同.
我们指定两台主机的/dev/sdb1 分区作为DRBD的使用的分区.这两个分区大小都为8G.


2.drbd.conf配置文件
DRBD运行时,会读取一个配置文件/etc/drbd.conf.这个文件里描述了DRBD设备与硬盘分区的映射关系,
和DRBD的一些配置参数.
下面是一个drbd.conf文件的简单示例:
2.6.11-1.1369_FC4操作系统,主机名为test7,IP地址为 172.18.3.208,DRBD分区为/dev/sdb1.
2.6.11-1.1369_FC4操作系统,主机名为test8,IP地址为 172.18.3.205,DRBD分区为/dev/sdb1.


172.18.3.208 配置文件如下
[root@test7 ~]# cat /etc/drbd.conf
# 是否参加DRBD使用者统计.默认是yes
       global { usage-count yes; }
       # 设置主备节点同步时的网络速率最大值,单位是字节.
       common { syncer { rate 1M; } }
       # 一个DRBD设备(即:/dev/drbdX),叫做一个"资源".里面包含一个DRBD设备的主备节点的
       # 相关信息.
       #
       resource r0 {
            # 使用协议C.表示收到远程主机的写入确认后,则认为写入完成.
            protocol C;
            net {
                 # 设置主备机之间通信使用的信息算法.
                 cram-hmac-alg sha1;
                 shared-secret "FooFunFactory";
            }
            # 每个主机的说明以"on"开头,后面是主机名.在后面的{}中为这个主机的配置.
            on test7 {
                 # /dev/drbd1使用的磁盘分区是/dev/hdb1
                 device    /dev/drbd1;
                 disk      /dev/sdb1;
                 # 设置DRBD的监听端口,用于与另一台主机通信
                 address   172.18.3.208:7898;
                 meta-disk  internal;
            }
            on test8 {
                 device    /dev/drbd1;
                 disk      /dev/sdb1;
                 address   172.18.3.205:7898;
                 meta-disk  internal;
            }
       }





172.18.3.205 配置文件同上
===========================================================3.DRBD的启动
在启动DRBD之前,你需要分别在两台主机的hdb1分区上,创建供DRBD记录信息的数据块.分别在
两台主机上执行:
[root@test7 local]#drbdadm create-md r0
[root@test8 local]#drbdadm create-md r0 “r0”是我们在drbd.conf里定义的资源名称.
现在我们可以启动DRBD了,分别在两台主机上执行:   [root@test7 local]#/etc/init.d/drbd start
[root@test8 local]#/etc/init.d/drbd start ========================================================
现在可以查看DRBD的状态,然后在test7主机上执行: [root@test7 ~]# cat /proc/drbd
version: 8.0.0 (api:86/proto:86)
SVN Revision: 2713 build by
[email=root@test7]root@test7[/email]
, 2008-06-27 14:07:14 1: 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
        resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0
        act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
”/proc/drbd”中显示了drbd当前的状态.第一行的st表示两台主机的状态,都是”备机”状态.
ds是磁盘状态,都是”不一致”状态.
这是由于,DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据.所以,我们需要初始化
一个主机.在test7上执行:  [root@test8 local]#drbdsetup /dev/drbd1 primary -o或:/sbin/drbdadm secondary r0  /sbin/drbdadm primary r0[root@test7 ~]# cat /proc/drbd
version: 8.0.0 (api:86/proto:86)
SVN Revision: 2713 build by
[email=root@test7]root@test7[/email]
, 2008-06-27 14:07:14 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:18528 nr:0 dw:0 dr:18528 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
        [>...................] sync'ed:  0.3% (8170/8189)M
        finish: 6:46:43 speed: 336 (324) K/sec
        resync: used:0/31 hits:1156 misses:2 starving:0 dirty:0 changed:2
        act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0 主备机状态分别是”主/备”,主机磁盘状态是”实时”,备机状态是”不一致”.
在第3行,可以看到数据正在同步中,即主机正在将磁盘上的数据,传递到备机上.现在的进度是0.3%.=================================================稍等一会,在数据同步完后,再查看一下test7的DRBD状态:  [root@test7 ~]# cat /proc/drbd
version: 8.0.0 (api:86/proto:86)
SVN Revision: 2713 build by
[email=root@test7]root@test7[/email]
, 2008-06-27 14:07:14 1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:497928 nr:0 dw:0 dr:497928 al:0 bm:31 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:31091 misses:31 starving:0 dirty:0 changed:31
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0磁盘状态都是”实时”,表示数据同步完成了.
======================================================
你现在可以把主机上的DRBD设备挂载到一个目录上进行使用.备机的DRBD设备无法被挂载,因为它是
用来接收主机数据的,由DRBD负责操作.
在test7上执行: [root@test7 /]# cd /mnt
[root@test7 mnt]# mkdir drbd1
[root@test7 mnt]# mount /dev/drbd1 /mnt/drbd1/
[root@test7 mnt]# cd drbd1/
[root@test7 drbd1]# touch aa
[root@test7 drbd1]# ls
aa  lost+found zai test8上执行[root@test8 mnt]# /etc/init.d/drbd stop
Stopping all DRBD resources.
[root@test8 mnt]# mkdir drbd1
[root@test8 mnt]# mount /dev/sdb1 /mnt/drbd1/
[root@test8 mnt]# cd drbd1/
[root@test8 drbd1]# ls
aa  lost+found可以看到,在主机test7上产生的文件aa,也完整的保存在备机test8的DRBD分区上.
这就是DRBD的网络RAID-1功能. 在主机上的任何操作,都会被同步到备机的相应磁盘分区上,达到数据备份的效果.
=========================================DRBD的主备机切换有时,你需要将DRBD的主备机互换一下.可以执行下面的操作:
在主机上,先要卸载掉DRBD设备.
[root@test7 mnt]# umount /dev/drbd1
将主机降级为”备机”.
[root@test7 mnt]# drbdadm secondary r0
[root@test7 mnt]# cat /proc/drbd
version: 8.0.0 (api:86/proto:86)
SVN Revision: 2713 build by
[email=root@test7]root@test7[/email]
, 2008-06-27 14:07:14
1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r---
    ns:497972 nr:0 dw:28 dr:498006 al:2 bm:36 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:31100 misses:34 starving:0 dirty:0 changed:34
        act_log: used:0/127 hits:26 misses:2 starving:0 dirty:0 changed:2
现在,两台主机都是”备机”.
在备机test8上,将它升级为”主机”.  [root@test8 mnt]# drbdadm primary r0
[root@test8 mnt]# cat /proc/dr
drbd    driver/
[root@test8 mnt]# cat /proc/drbd
version: 8.0.0 (api:86/proto:86)
SVN Revision: 2713 build by
[email=root@test8]root@test8[/email]
, 2008-06-27 14:11:24 1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r---
    ns:0 nr:16 dw:16 dr:0 al:0 bm:2 lo:0 pe:0 ua:0 ap:0
        resync: used:0/31 hits:6 misses:2 starving:0 dirty:0 changed:2
        act_log: used:0/127 hits:0 misses:0 starving:0 dirty:0 changed:0
   现在test8成为主机了。===============================================================参考文档:http://www.turbolinux.com.cn/turbo/wiki/doku.php?id=%E7%B3%BB%E7%BB%9F%E7%AE%A1%E7%90%86:drbd%E7%9A%84%E4%BD%BF%E7%94%A8==============================================================  
下面是我碰到的一个问题和解决方法:在执行这个命令“drbdadm create-md r0”,就是把其中一个服务器上的硬盘升级为主盘的时候出现下面错误:md_offset 2813038592al_offset 2813005824bm_offset 2812919808Found ext3 filesystem which uses 2747112 kBcurrent configuration leaves usable 2746992 kBDevice size would be truncated, whichwould corrupt data and result in'access beyond end of device' errors.You need to either   * use external meta data (recommended)   * shrink that filesystem first   * zero out the device (destroy the filesystem)Operation refused.Command 'drbdmeta /dev/drbd1 v08 /dev/sda3 internal create-md' terminated with exit code 40drbdadm create-md r0: exited with code 40用下面命令解决#dd if=/dev/zero bs=1M count=1 of=/dev/sda3  
(二).drbd+heartbeat+mysql在以上的基础上我构建drbd+heartbeat+mysql涉及到的文件和配置文件如下172.18.3.208[root@test7 resource.d]# cd /etc/ha.d/resource.d[root@test7 resource.d]# chmod 755 mysql
[root@test7 resource.d]# chmod 755 mysql_umountmysql--->mysql的启动文件从/usr/local/mysql/share/mysql/msyql.server拷贝过去.======================[root@test7 resource.d]# cat /etc/ha.d/resource.d/mysql_umount
#!/bin/sh
#
#       High-Availability Pre-Startup/Shutdown Script
#
# Description:  Runs on Startup or shutdown of heartbeat (not resource based).
#               Also runs before start, after start or before stop,
#               and after stop.
#
# Author:       Matthew Soffen
#
# Support:      
linux-ha@lists.linux-ha.org
#
# License:      GNU Lesser General Public License (LGPL)
#
# Copyright:    (C) 2002 Matthew Soffen
#
#
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGEprefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncscase "$1" in
'start')
#/sbin/drbdadm -- --do-what-I-say primary all
/sbin/drbdadm  primary all
#drbdsetup /dev/drbd1 primary -o
/bin/mount /dev/drbd1 /mnt
        ;;
'pre-start')
        ;;
'post-start')
        ;;
'stop')
/bin/umount /mnt
/sbin/drbdadm  secondary all        
;;
'pre-stop')
        ;;
'post-stop')
        ;;
*)
        echo "Usage: $0 { start | pre-start | post-start | stop | pre-stop | post-stop }"
        ;;
esac
exit 0============================[root@test7 ha.d]# cat authkeyauth 1
1 crc===========================[root@test7 ha.d]# cat ha.cfdebugfile /var/log/ha-debug
logfile /var/log/ha-log keepalive 2 deadtime 60 warntime 10 initdead 120 #udpport 694 bcast eth0 auto_failback on #ping_group group1 172.18.3.208 172.18.3.205#ping 172.18.3.208
ping 172.18.3.93respawn root /usr/lib/heartbeat/ipfail apiauth ipfail gid=root uid=root hopfudge 1 use_logd yes node test7 node test8 #crm on===================[root@test7 ha.d]# cat haresourcestest7 IPaddr::172.18.3.209/24/eth0 mysql_umount mysql =========================================172.18.3.205[root@test8 resource.d]# cd /etc/ha.d/resource.d/[root@test8 resource.d]# cat mysql_umount
#!/bin/sh
#
#       High-Availability Pre-Startup/Shutdown Script
#
# Description:  Runs on Startup or shutdown of heartbeat (not resource based).
#               Also runs before start, after start or before stop,
#               and after stop.
#
# Author:       Matthew Soffen
#
# Support:      
linux-ha@lists.linux-ha.org
#
# License:      GNU Lesser General Public License (LGPL)
#
# Copyright:    (C) 2002 Matthew Soffen
#
#
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGEprefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncscase "$1" in
'start')
/sbin/drbdadm  primary r0
#drbdsetup /dev/drbd1 primary -o
sleep 3
/sbin/drbdadm  primary r0
#drbdsetup /dev/drbd1 primary -o
/bin/mount /dev/drbd1 /mnt
        ;;
'pre-start')
        ;;
'post-start')
        ;;
'stop')
/bin/umount /mnt
/sbin/drbdadm secondary r0        
;;
'pre-stop')
        ;;
'post-stop')
        ;;
*)
        echo "Usage: $0 { start | pre-start | post-start | stop | pre-stop | post-stop }"
        ;;
esac
exit 0ha.cf haresources authkeys mysql 同上================================================================================测试:首先在主从上分别启动drbd,heartbeat 此时在主的自动邦定虚拟ip,启动mysql,drbd初始化为主的,挂载/dev/drbd1到/mnt上,停掉主的heartbeat,主的自动卸栽载p,停止mysql,drbd初始化为从的,卸栽/dev/drbd1,在从的启动mysql,绑定虚拟ip,drbd初始化为主的,挂栽/dev/drbd1 到/mnt上.=================================================================================
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/8111/showart_1859193.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP