记一个典型的高可用(HA)方案:drbd+heartbeat

【参考文献】

1. http://www.drbd.org/home/what-is-drbd/

注:DRBD by LINBIT,对DRBD和Heartbeat做了详细生动的介绍,你不得不读的入门教材,还有可以学英语哟。

2. http://freeloda.blog.51cto.com/2033581/1275384

3. http://www.xifenfei.com/1438.html

注:技术博客,描述了DRBD的安装配置实验,值得参考。

4. http://www.drbd.org/users-guide/

注:DRBD官方用户指导文档。

【实验背景】

网络存储课堂实验,打造一个典型的HA方案。经过调研,最后敲定为:DRBD+Heartbeat。

【实验环境】

硬件:磁盘阵列,带硬RAID卡。

系统:CentOS 6.3系统,升级后的内核版本为3.2.24。

一、 安装DRBD

DRBD共有两部分构成:内核模块和用户空间和管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果你的内核版本高于此版本的话,你只需要安装管理工具即可。否则,你需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号最后是保持对应。实验所用的是CentOS6.3系统,我的本意是将它的内核从.2.6.32升级到目前的.3.2.24,因为.3.2.24版本的内核源码中已经内嵌了drbd模块代码。接下来你要做的就是编译内核,首先要你需要做内核选项配置,在内核源码目录下执行make menuconfig,在Device drivers->Block devices菜单下存在DRBD选项。 

:如果你在做内核选项配置的时候已经勾选了DRBD选项的话,升级完内核后,你只需要再安装管理工具就可以了。

 

遗憾的是我之前在做选配配置的时候没有勾选此选项,因为我不知道有这个选项。怎么办呢?

【方案一】

进入内核源码树主目录,重新make menuconfig,勾选“DRBD Distributed Replicated Block Device support”为M,即将它编译为模块。

然后,重新编译模块。

[root@localhost linux-3.2.24]# make ./drivers/block/drbd/ modules

[root@localhost linux-3.2.24]# cd ./drivers/block/drbd

[root@localhost drbd]# mkdir /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd

[root@localhost drbd]# cp drbd.ko /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/

[root@localhost drbd]# cd /

提示:以上指令执行的结果是重新编译所有的模块,而不仅仅是./drivers/block/drbd目录下的模块。你满心以为会快速地在drbd目录下生成drbd.ko,但事实上并不是这样子的。那么有没有什么办法能只单独编译某一个模块呢?答案是肯定的!但是我现在还不知道怎么弄,嘿嘿! 

lib/modules/3.2.24.scst2.2.0/

[root@localhost linux-3.2.24]# depmod –a

:这一步至关重要,进/lib/modules/$(shell uname -r)/目录下执行此命令,depmod会检测模块的相依性,供modprobe在安装模块时使用,参数-a或--all会分析所有可用的模块

下面来试试通过modprobe加载drbd模块。

[root@localhost ~]# modprobe drbd

FATAL: Error inserting drbd (/lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/drbd.ko): Unknown symbol in module, or unknown parameter (see dmesg)

显然,模块加载失败,并建议查看dmesg信息如下。

[root@localhost 3.2.24.scst2.2.0]# dmesg | grep drbd

drbd: Unknown symbol lc_seq_printf_stats (err 0)

drbd: Unknown symbol lc_index_of (err 0)

drbd: Unknown symbol lc_del (err 0)

drbd: Unknown symbol lc_put (err 0)

drbd: Unknown symbol lc_find (err 0)

..........此处省略数十行.........

各种未定义的lc_xxx函数,由此猜想是不是drdb所依赖的模块没有加载。但是没有道理呀,我已经做过依赖性检查了(depmod –a),如果所依赖的模块各就各位的话应该会先加载依赖模块。所以,有可能依赖模块本身就不存在。先用“modinfo drbd.ko”检查drbd所依赖的模块。

[root@localhost drbd]# modinfo drbd.ko 

filename:       drbd.ko

alias:          block-major-147-*

license:        GPL

version:        8.3.11

description:    drbd - Distributed Replicated Block Device v8.3.11

author:         Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>

srcversion:     2D876214BAAD53B31ADC1D6

depends:        lru_cache       //依赖模块

intree:         Y

vermagic:       3.2.24.scst2.2.0 SMP mod_unload modversions 

parm:           minor_count:Maximum number of drbd devices (1-256) (uint)

parm:           disable_sendpage:bool

parm:           allow_oos:DONT USE! (bool)

parm:           cn_idx:uint

parm:           proc_details:int

parm:           usermode_helper:string

从modinfo给出的信息来看,drbd.ko依赖于lru_cache.ko模块,所以我们尝试用modprobe加载lru_cache。

[root@localhost ~]# modprobe lru_cache

FATAL: Module lru_cache not found.

错误提示找不到该模块,哎呀,先解决这个依赖问题!lru_cache.ko是lru(近期最少使用)算法模块,该模块的源码位于linux-3.2.24/lib/目录下。

[root@localhost lib]# pwd

/usr/src/dm-cache/linux-3.2.24/lib

[root@localhost lib]# ll lru_cache.*

-rw-rw-r--. 1 root root  14933 Jul 25  2012 lru_cache.c

-rw-r--r--. 1 root root 149295 Nov  5 00:05 lru_cache.ko

-rw-r--r--. 1 root root    937 Nov  5 00:02 lru_cache.mod.c

-rw-r--r--. 1 root root  52952 Nov  5 00:05 lru_cache.mod.o

-rw-r--r--. 1 root root 102761 Nov  5 00:01 lru_cache.o

[root@localhost lib]# cp lru_cache.ko /lib/modules/3.2.24.scst2.2.0/kernel/lib/

[root@localhost lib]# modinfo lru_cache.ko 

filename:       lru_cache.ko

license:        GPL

description:    lru_cache - Track sets of hot objects

author:         Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>

srcversion:     806E4E4AD189DC2826C6B8F

depends:        

intree:         Y

vermagic:       3.2.24.scst2.2.0 SMP mod_unload modversions

[root@localhost linux-3.2.24]# depmod –a

再次尝试加载drbd。

[root@localhost ~]# modprobe drbd

[root@localhost ~]# lsmod | grep drbd

drbd                  253694  0 

lru_cache               7353  1 drbd

嗯,成功!

实际应用中我们当然不是每次都要通过modprobe手动来加载该模块,因为我们有drbd的用户空间管理工具,利用该工具会自动加载drbd模块,下面就是下载安装drbd的用户空间管理工具。

[root@localhost drbd]# rpm -ivh drbd83-8.3.15-2.el5.centos.x86_64.rpm 

warning: drbd83-8.3.15-2.el5.centos.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID e8562897: NOKEY

Preparing...                ########################################### [100%]

   1:drbd83                 ########################################### [100%]

提示:drbd管理工具

drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令。

drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用。

drbdmeta:管理META数据结构,平时很少直接用。

以后我们要启动drbd就直接执行下面这条指令。现在先不执行,因为还有一些配置没有完成。

[root@localhost ~]# service drbd start

思:通过service启动drbd实际上是调用了/etc/init.d/drbd脚本,可以仔细研究一番。

【方案二】

提示:纯粹用rpm包方式安装。

【方案三】

提示:更改yum源

【方案四】

提示:源码编译

【方案五】

提示:推倒重来

二、DRBD配置

我有两台机器,机器名分别叫super和zm。

[root@super drbd.d]# cat mpx.res 

resource mpx {

on super {

device /dev/drbd0;

disk /dev/dm-1;

address 222.31.76.144:7789;

meta-disk internal;

}

on zm 

{

device /dev/drbd0;

disk /dev/sda4;

address 222.31.76.57:7789;

meta-disk internal;

}

}

注:[root@super drbd.d]# ll /dev/mapper/vgSuper-lv0Super 

lrwxrwxrwx. 1 root root 7 Nov  5 21:09 /dev/mapper/vgSuper-lv0Super -> ../dm-1

初始化资源。

[root@super ~]# drbdadm create-md mpx

DRBD module version: 8.3.11

   userland version: 8.3.15

preferably kernel and userland versions should match.

提示:此处提醒drbd内核模块版本与drbd用户空间管理工具版本不匹配,建议版本匹配。这是我之前安装的疏忽,经查证确实如此,这个问题留待稍后解决(其实也就不会再去解决了!)

[root@super ~]# rpm -qa | grep drbd

drbd83-8.3.15-2.el5.centos.x86_64

[root@super ~]# cd /lib/modules/3.2.24.scst2.2.0/kernel/drivers/block/drbd/

[root@super drbd]# ls

drbd.ko

[root@super drbd]# modinfo drbd.ko 

filename:       drbd.ko

alias:          block-major-147-*

license:        GPL

version:        8.3.11 //版本果然有问题

description:    drbd - Distributed Replicated Block Device v8.3.11

author:         Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>

srcversion:     2D876214BAAD53B31ADC1D6

depends:        lru_cache

intree:         Y

vermagic:       3.2.24.scst2.2.0 SMP mod_unload modversions 

parm:           minor_count:Maximum number of drbd devices (1-256) (uint)

parm:           disable_sendpage:bool

parm:           allow_oos:DONT USE! (bool)

parm:           cn_idx:uint

parm:           proc_details:int

parm:           usermode_helper:string

You have new mail in /var/spool/mail/root

//此处省略若干空行…

  --==  Thank you for participating in the global usage survey  ==--

The server's response is:

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

super节点初始化失败!!怎么回事呢?

[root@super drbd.d]# cat mpx.res 

resource mpx {

on super {

device /dev/drbd0;

disk /dev/mapper/vgSuper-lv0Super;

address 222.31.76.144:7789;

meta-disk internal;

}

on zm {

device /dev/drbd0;

disk /dev/sda4;

address 222.31.76.57:7789;

meta-disk internal;

}

}

[root@super /]# drbdadm create-md mpx

DRBD module version: 8.3.11

   userland version: 8.3.15

preferably kernel and userland versions should match.

You want me to create a v08 style flexible-size internal meta data block.

There appears to be a v08 flexible-size internal meta data block

already in place on /dev/mapper/vgSuper-lv0Super at byte offset 117436416

Do you really want to overwrite the existing v08 meta-data?

[need to type 'yes' to confirm] yes

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

提示:drbd.conf红色加粗部分为修改处,注意将修改后的文件同步到备份节点。

[root@zm ~]# drbdadm create-md mpx

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

在zm节点上初始化成功。

在super和zm上启动drbd服务。

[root@super ~]# service drbd start

[root@zm ~]# service drbd start

查看一下状态。

[root@super ~]# drbd-overview 

  0:mpx  Connected Secondary/Secondary Inconsistent/Inconsistent C r----- 

You have new mail in /var/spool/mail/root

[root@zm ~]# drbd-overview 

  0:mpx  Connected Secondary/Secondary Inconsistent/Inconsistent C r-----

从上面的信息中可以看出此时两上节点都处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:

drbdsetup /dev/drbd0 primary –o

或者

drbdadm -- --overwrite-data-of-peer primary mpx

将super设置为主节点。

[root@super ~]# drbdsetup /dev/drbd0 primary -o

You have new mail in /var/spool/mail/root

[root@super ~]# drbd-overview 

  0:mpx  SyncSource Primary/Secondary UpToDate/Inconsistent C r----- 

[==>.................] sync'ed: 15.4% (91964/104380)K

格式化并挂载。

[root@super ~]# mke2fs -j /dev/drbd0 

mke2fs 1.41.12 (17-May-2010)

Filesystem label=

OS type: Linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

Stride=0 blocks, Stripe width=0 blocks

26104 inodes, 104380 blocks

5219 blocks (5.00%) reserved for the super user

First data block=1

Maximum filesystem blocks=67371008

13 block groups

8192 blocks per group, 8192 fragments per group

2008 inodes per group

Superblock backups stored on blocks: 

8193, 24577, 40961, 57345, 73729

 

Writing inode tables: done                            

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 29 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

注:drbd0是在启动drbd服务后依据配置文件mpx.res所生成的。

[root@super ~]# mkdir /mnt/mpx

You have new mail in /var/spool/mail/root

[root@super ~]# mount /dev/drbd0 /mnt/mpx/

[root@super ~]# mount -l | grep drbd0

/dev/drbd0 on /mnt/mpx type ext3 (rw)

好啦,现在拷贝一些文件到挂载目录上去。

[root@super ~]# cd /mnt/mpx/

[root@super mpx]# ls

lost+found

[root@super mpx]# cp -r /opt/htdocs/ ./

[root@super mpx]# ls

htdocs  lost+found

[root@super mpx]# du -sh *

52M htdocs

12K lost+found

切换一下Primary和Secondary节点,检查一下文件是否同步到了备份节点上。

[root@super ~]# umount /mnt/mpx///卸载

[root@super ~]# drbdadm secondary mpx//降级

DRBD module version: 8.3.11

   userland version: 8.3.15

preferably kernel and userland versions should match.

[root@zm ~]# drbdsetup /dev/drbd0 primary –o//升级

You have new mail in /var/spool/mail/root

[root@super ~]# drbd-overview 

  0:mpx  SyncSource Secondary/Secondary UpToDate/Inconsistent C r----- 

[=================>..] sync'ed: 92.5% (63104/812828)K

You have new mail in /var/spool/mail/root

[root@zm ~]# drbd-overview 

  0:mpx  SyncTarget Primary/Secondary Inconsistent/UpToDate C r----- 

[==================>.] sync'ed: 97.5% (22656/812828)K

[root@zm ~]# mkdir /mnt/mpx

[root@zm ~]# mount /dev/drbd0 /mnt/mpx

[root@zm ~]# cd /mnt/mpx

[root@zm mpx]# ls

htdocs  lost+found

[root@zm mpx]# du -sh *

72M htdocs

16K lost+found

嗯,drbd这一部分已经ok啦!

三、Heartbeat

省略!

四、常见问题与答案

1.DRBD主从节点的磁盘空间必须是同种类型同样大小吗?

思:主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd磁盘镜像相当于raid 1。

2.DRBD可以支持的底层设备有哪些?

DRBD需要构建在底层设备之上,然后构建出一个块设备出来。对于用户来说,一个DRBD设备,就像是一块物理的磁盘并且可以创建文件系统。DRBD所支持的底层设备有以下这些类:

一个磁盘,或者是磁盘的某一个分区;

一个soft raid 设备;

一个LVM的逻辑卷;

一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷;

其他任何的块设备。

3.DRBD有哪几种复制模式?

协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。

协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。

协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。

4.在从节点的drbd服务已经停止的状态下,卸载主节点的挂载资源为什么会失败?

答:求解答

5.利用drbdadm初始化资源失败的几种原因?

(1)、在已格式化的文件系统上进行drbd初始始化。

[root@zm ~]# drbdadm create-md mpx

md_offset 106921984

al_offset 106889216

bm_offset 106885120

Found ext3 filesystem

      104420 kB data area apparently used

      104380 kB left usable by current configuration

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 0 v08 /dev/sda4 internal create-md' terminated with exit code 40

drbdadm create-md mpx: exited with code 40

参考办法:用dd命令从块层次覆盖掉这些数据。

(2)、drbd.conf文件配置错误

6.文件系统格式化失败

[root@zm ~]# mke2fs -j /dev/drbd0 

mke2fs 1.39 (29-May-2006)

mke2fs: Wrong medium type while trying to determine filesystem size

【解决办法】

提示:切换到Primary模式

[root@zm ~]# drbd-overview 

  0:mpx  Connected Secondary/Secondary Inconsistent/Inconsistent C r----- 

[root@zm ~]# mke2fs -j /dev/drbd0 

mke2fs 1.39 (29-May-2006)

mke2fs: Wrong medium type while trying to determine filesystem size

[root@zm ~]# service drbd stop

Stopping all DRBD resources: .

[root@zm ~]# service drbd start

Starting DRBD resources: [ d(mpx) n(mpx) ].

[root@zm ~]# service drbd stop

Stopping all DRBD resources: .

[root@zm ~]# service drbd start

Starting DRBD resources: [ d(mpx) n(mpx) ]..........

[root@zm ~]# mke2fs -j /dev/drbd0 

mke2fs 1.39 (29-May-2006)

mke2fs: Wrong medium type while trying to determine filesystem size

[root@zm ~]# drbd-overview 

  0:mpx  SyncTarget Secondary/Secondary Inconsistent/UpToDate C r----- 

[=======>............] sync'ed: 41.8% (477216/812828)K

[root@zm ~]# drbd

drbdadm        drbdmeta       drbd-overview  drbdsetup      

[root@zm ~]# drbdsetup /dev/drbd0 primary -o

[root@zm ~]# drbd-overview 

  0:mpx  SyncTarget Primary/Secondary Inconsistent/UpToDate C r----- 

[========>...........] sync'ed: 47.8% (428116/812828)K

[root@zm ~]# mke2fs -j /dev/drbd0 

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

125696 inodes, 250998 blocks

12549 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=260046848

8 block groups

32768 blocks per group, 32768 fragments per group

15712 inodes per group

Superblock backups stored on blocks: 

32768, 98304, 163840, 229376

Writing inode tables: done                            

Creating journal (4096 blocks): done

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 39 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值