天天看点

drbd+ocfs2构建的共享存储方案

 如下内容要利用到drbd的双主模型,并且要加上集群文件系统OCFS2,构建一个共享存储方案:

只用drbd设备的话,当两个节点同时网一个文件系统写数据会导致文件系统崩溃,而应以OCFS2集群文件系统,会提供一个文件锁管理器,防止文件系统崩溃。

一,DRBD的介绍及配置过程:

 DRBD:(distributed replication block device)即分布式复制块设备。它的工作原理是:在A主机上有对指定磁盘设备写请求时,数据发送给A主机的kernel,然后通过kernel中的一个模块,把相同的数据传送给B主机的kernel中一份,然后B主机再写入自己指定的磁盘设备,从而实现数据的备份,并能解决数据文件集中存放的问题,这是一种企业常用的廉价备份机制。

DRBD一般是一主一从,并且所有的读写操作只能在主服务器上进行,并且从节点设备也不能挂载,但是主从服务器之间是可以进行调换的。

下面为drbd的配置过程:

前提:

1)本配置共有两个测试节点,分别node1.magedu.com和node2.magedu.com,相应的IP地址分别为172.16.30.4和172.16.30.6;

2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为512M;(请事先建好)

# fdisk /dev/sda  (不要格式化)

# partprobe /dev/sda

3)系统为rhel5.4,x86平台;

1、准备工作

两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:

172.16.30.4 node1.magedu.com node1

172.16.30.6 node2.magedu.com node2

为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:

Node1:

# sed -i 's@\(HOSTNAME=\).*@\1node1.magedu.com@g' /etc/sysconfig/network

# hostname node1.magedu.com

Node2:

# sed -i 's@\(HOSTNAME=\).*@\1node2.magedu.com@g' /etc/sysconfig/network

# hostname node2.magedu.com

设定两个节点可以基于密钥进行ssh通信,这可以通过类似如下的命令实现:

# ssh-keygen -t rsa

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

Node2:

# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

2、安装软件包

drbd共有两部分组成:内核模块和用户空间的管理工具。其中drbd内核模块代码已经整合进Linux内核2.6.33以后的版本中,因此,如果您的内核版本高于此版本的话,你只需要安装管理工具即可;否则,您需要同时安装内核模块和管理工具两个软件包,并且此两者的版本号一定要保持对应。

目前在用的drbd版本主要有8.0、8.2和8.3三个版本,其对应的rpm包的名字分别为drbd, drbd82和drbd83,对应的内核模块的名字分别为kmod-drbd, kmod-drbd82和kmod-drbd83。各版本的功能和配置等略有差异;我们实验所用的平台为x86且系统为rhel5.4,因此需要同时安装内核模块和管理工具。我们这里选用最新的8.3的版本(drbd83-8.3.8-1.el5.centos.i386.rpm和kmod-drbd83-8.3.8-1.el5.centos.i686.rpm),下载地址为:http://mirrors.sohu.com/centos/5.6/extras/i386/RPMS/。

实际使用中,您需要根据自己的系统平台等下载符合您需要的软件包版本

下载完成后在两个节点上直接安装即可:

# yum -y --nogpgcheck localinstall drbd83-8.3.8-1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

3、配置drbd

drbd的主配置文件为/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,且都保存至/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。

在配置文件中,global段仅能出现一次,且如果所有的配置信息都保存至同一个配置文件中而不分开为多个文件的话,global段必须位于配置文件的最开始处。目前global段中可以定义的参数仅有minor-count, dialog-refresh, disable-ip-verification和usage-count。

common段则用于定义被每一个资源默认继承的参数,可以在资源定义中使用的参数都可以在common段中定义。实际应用中,common段并非必须,但建议将多个资源共享的参数定义为common段中的参数以降低配置文件的复杂度。

resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。

下面的操作在node1.magedu.com上完成

1)复制样例配置文件为即将使用的配置文件:

# cp /usr/share/doc/drbd83-8.3.8/drbd.conf  /etc

2)配置/etc/drbd.d/global-common.conf,添加启用这些向,#号为注释:

global {

        usage-count no;

        # minor-count dialog-refresh disable-ip-verification

}

common {

        protocol C;

        handlers {

                pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

                pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

                local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

                # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";

                # split-brain "/usr/lib/drbd/notify-split-brain.sh root";

                # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";

                # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";

                # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;

        }

        startup {

                #wfc-timeout 120;

                #degr-wfc-timeout 120;

        disk {

                #on-io-error detach;

#fencing resource-only;

#fencing dont-care;

        net {

cram-hmac-alg "sha1";

  shared-secret "mydrbdlab";

  allow-two-primaries;  这个的意思就是允许两台主节点,很重要

  #after-sb-0pri discard-zero-changes;

     #after-sb-1pri discard-secondary;

     #after-sb-2pri disconnect;

        syncer {

                rate 1000M;

以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。

# scp /etc/drbd.conf node2:/etc/

# scp  /etc/drbd.d/*  node2:/etc/drbd.d

4、在两个节点上初始化已定义的资源并启动服务:

1)初始化资源,在Node1和Node2上分别执行:

# drbdadm create-md web

2)启动服务,在Node1和Node2上同时执行:

/etc/init.d/drbd start

3)查看启动状态:

# cat /proc/drbd

version: 8.3.8 (api:88/proto:86-94)

GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16

 0: cs:Connected ro: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 ep:1 wo:b oos:505964

也可以使用drbd-overview命令来查看:

# drbd-overview 

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

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

# drbdsetup /dev/drbd0 primary –o

而后再次查看状态,可以发现数据同步过程已经开始:

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

[============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35

等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:

  0:web  Connected Primary/Secondary UpToDate/UpToDate C r---- 

我们把node2也设为主节点:

# drbdsetup /dev/drbd0 primary –o

  0:web  Connected Primary/Primary UpToDate/UpToDate C r---- 

到这里我们的drbd就是双主模型了!

虽然,现在的双主模型建立好了,并且都可以网drbd设备写文件,但是一旦两个节点同时向一个文件写入,drbd文件系统就会崩溃,这时候我们就用到了集群文件系统,下面我们介绍ocfs2集群文件系统

二、安装配置ocfs2

说明:ocfs2自己可以通过ocfs2专有的集群管理ocfs2文件系统

1、下载安装软件包:

我的系统是2.6.18.164的版本,故我要下载相对应的软件包,ocfs2的版本一定要和kernel的版本相对应,要不然不能使用:

ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm 

ocfs2-tools-1.4.4-1.el5.i386.rpm 

ocfs2console-1.4.4-1.el5.i386.rpm

2,安装(两个节点都要安装)

# rpm -ivh \

ocfs2-2.6.18-164.el5-1.4.7-1.el5.i686.rpm \

ocfs2-tools-1.4.4-1.el5.i386.rpm \

3、配置ocfs2集群文件系统

1)首先编辑主配置文件(这里在node1.magedu.com上进行)

# mkdir /etc/ocfs2

# vim  /etc/ocfs2/cluster.conf

添加如下内容:

node:

ip_port = 7777

ip_address = 172.16.30.4

number = 0

name = node1.magedu.com

cluster = ocfs2

ip_address = 172.16.30.6

number = 1

name = node2.magedu.com

cluster:

node_count = 2

name = ocfs2

而后需要将此配置文件同步至另一节点node2.magedu.com

# scp  -r  /etc/ocfs2  node2:/etc/

说明:以上配置过程也可以简单地通过ocfs2console来进行配置。执行ocfs2console命令会打开一个图形窗口:

# ocfs2console

配置过程如下:

Cluster > Configure Nodes

Node configuration > Add > node1.magedu.com / ... / 7777

Node configuration > Add > node2.magedu.com / ... / 7777

...

Cluster > Propagate Configuration

2)配置并启动ocfs2

以下命令需要在两个节点上分别执行:

# /etc/init.d/o2cb enable

# /etc/init.d/o2cb stop

# /etc/init.d/o2cb start

#/etc/init.d/ocfs2 stop

#/etc/init.d/ocfs2 start

3)查看ocfs2集群的运行状态

[[email protected] ~]# /etc/init.d/o2cb status

Driver for "configfs": Loaded

Filesystem "configfs": Mounted

Driver for "ocfs2_dlmfs": Loaded

Filesystem "ocfs2_dlmfs": Mounted

Checking O2CB cluster ocfs2: Online

Heartbeat dead threshold = 31

  Network idle timeout: 30000

  Network keepalive delay: 2000

  Network reconnect delay: 2000

Checking O2CB heartbeat: Not active

在格式化和挂载文件系统之前,应验证O2CB在两个节点上均为online状态;上述信息最后一行显示O2CB心跳未激活是因为文件系统还没有挂载,其挂载之后就会变成active状态。

4)创建并挂载ocfs2文件系统,实现ocfs2与drbd结合工作

在drbd的任一主节点上创建ocfs2文件系统,其中-N选项用于指明最多允许多少个节点同时使用此文件系统:

[[email protected] ~]# mkfs -t ocfs2 -N 2 -L ocfs2_drbd1 /dev/drbd0

在两个节点分别执行如下命令挂载ocfs2文件系统:

[[email protected] ~]# mount /dev/drbd0 /mnt

在两个节点上查看:

[[email protected] ~]# ls /mnt/

lost+found

[[email protected] ~]# ls /mnt/

当然,上面的挂载命令还可以使用如下方式进行,以获取更好的性能:

mount -o noatime,nodiratime /dev/drbd0  /mnt

本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/924132,如需转载请自行联系原作者

继续阅读