Chinaunix首页 | 论坛 | 博客
  • 博客访问: 360146
  • 博文数量: 42
  • 博客积分: 3970
  • 博客等级: 中校
  • 技术积分: 714
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-13 15:31
文章分类

全部博文(42)

文章存档

2009年(19)

2008年(23)

我的朋友

分类: Mysql/postgreSQL

2009-03-11 13:47:00

DRBD是一种块设备,可以被用于高可用(HA)之中.它类似于一个网络RAID-1功能.当你将数据写入本地
文件系统时,数据还将会被发送到网络中另一台主机上.以相同的形式记录在一个文件系统中.
本地(主节点)与远程主机(备节点)的数据可以保证实时同步.当本地系统出现故障时,远程主机上还会
保留有一份相同的数据,可以继续使用.

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上,
切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了.
DRBD的工作原理如下图:

        +--------+
| 文件系统 |
+--------+
|
V
+----------+
| 块设备层 |
| (/dev/drbd1) |
+----------+
| |
| |
V V
+----------+ +-----------+
| 本地硬盘 | | 远程主机硬盘 |
| (/dev/hdb1) | | (/dev/hdb1) |
+----------+ +-----------+
==========================================================
 下载地址 
# tar xvf  drbd-8.0.0.tar.tar 
# cd drbd-8.0.0
# make
# make install
make install执行之后: 
drbd.ko被安装到/lib/modules/$KernelVersion/kernel/drivers/block下.
drbd相关工具(drbdadm,drbdsetup)被安装到/sbin下.
并会在/etc/init.d/下建立drbd启动脚本.
=============================================================

你需要为本地主机和远程主机,指定一个DRBD使用的硬盘分区.这两个分区的大小必须相同.
我们指定两台主机的/dev/sdb1 分区作为DRBD的使用的分区.这两个分区大小都为8G.

 

 

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 配置文件同上

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

在启动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 , 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 , 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 , 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 , 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 , 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成为主机了。
===============================================================
参考文档:%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 2813038592
al_offset 2813005824
bm_offset 2812919808

Found ext3 filesystem which uses 2747112 kB
current configuration leaves usable 2746992 kB

Device size would be truncated, which
would 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 40
drbdadm 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_umount
mysql--->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:     
#
# License:      GNU Lesser General Public License (LGPL)
#
# Copyright:    (C) 2002 Matthew Soffen
#
#
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
prefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncs
case "$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 authkey
auth 1 
1 crc
===========================
[root@test7 ha.d]# cat ha.cf
debugfile /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.93
respawn 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 haresources
test7 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:     
#
# License:      GNU Lesser General Public License (LGPL)
#
# Copyright:    (C) 2002 Matthew Soffen
#
#
unset LC_ALL; export LC_ALL
unset LANGUAGE; export LANGUAGE
prefix=/usr
exec_prefix=/usr
. /etc/ha.d/shellfuncs
case "$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 0
ha.cf haresources authkeys mysql 同上
================================================================================
测试:首先在主从上分别启动drbd,heartbeat 此时在主的自动邦定虚拟ip,启动mysql,drbd初始化为
主的,挂载/dev/drbd1到/mnt上,停掉主的heartbeat,主的自动卸栽载p,停止mysql,drbd初始化为从的,
卸栽/dev/drbd1,在从的启动mysql,绑定虚拟ip,drbd初始化为主的,挂栽/dev/drbd1 到/mnt上.
=================================================================================
阅读(1246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~