Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373116
  • 博文数量: 75
  • 博客积分: 1732
  • 博客等级: 上尉
  • 技术积分: 812
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-11 16:02
个人简介

博客很久没有更新了,原因是大多数时间都忙在研究技术上,却懒得腾时间出来把技术分享,最近在开源力量上开课《Mongodb管理与维护》,让屌丝们从0到精通,敬请关注。本博客技术原创更新滞后一些,找时间更新有关mysql,mongodb等内容,谢谢大家关注。

文章分类

全部博文(75)

文章存档

2021年(1)

2011年(20)

2010年(40)

2009年(7)

2008年(7)

分类:

2011-08-17 15:34:05

原文地址:DRBD 配置 作者:zhiming.yk

 

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
==============================================================
 
 
 
(二).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上.
=================================================================================
阅读(2252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~