使用drbd实现高可用集群的共享存储
对于双节点集群来说,如果我们用到同样网页的时候,一种常见的解决方案就是使用nfs来提供一个共享的nas设备,是两个接点在必要的时候将其挂载上来使用,这样就使得,其中各一个接点出现故障的时候,另一个接点可以提供同样内容的文件;但是,如果nfsserver出现了故障,这样两个各接点怎么办都得不到网页了,由此看来,这个nfsserver就是一个单点故障所在,于是为了能够够尽可能的提供一个高可用的后端文件服务器,我们设想把nfs做成功高可用的,我们用两个服务器提供nfs的服务,默认情概况下使用一个特定的ip地址向外导出我们的web目录,可以给两个节点挂载,当nfs1出现故障,nfs2会启用起来,nfs服务会自动流转到nfs2上,但是网页文件还是在nfs1上,这样就又回到了原来的问题,并且面临的问题会很复杂麻烦的。那么有没有一种良好的机制来实现高可用的共享存储呢? Drbd就是一个工作在内核空间的软件,drbd全称是分布式的复制块儿设备
     Drbd的原理我们就不多说了 ,下面我们直接对其进行配置,来实现高可用的共享存储
 

如图是一个简单的一个示意图:
1)两个接点node1.a.org和node2.a.org 相应的ip依然是192.168.0.21 和192.168.0.22
2)分别在两节点上提供大小相同的分区作为drbd设备,如图所示,我们给/dev/sda5来作为drbd,大小均为2G,过程不演示
3) 想前几篇博文一样配置主机名称,使其与使用“uname –n”命令显示的内容一致过程不再重复
 
 
下面我们就开始进行配置
1 下载配安装置需要的软件包(安装前腰确保配置好了yum源)
 drbd83-8.3.8-1.el5.centos.i386.rpm  kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
      下载完成后我们直接用yum安装(注意我们要在两接点上都进行安装)
       [root@node1 ~]# yum localinstall -y --nogpgcheck drbd83-8.3.8-                                 1.el5.centos.i386.rpm kmod-drbd83-8.3.8-1.el5.centos.i686.rpm
 
2 配置drbd (下面我们在node1上配置为例)
1)复制样例配置文件为即将使用的配置文件:
# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc
配置之前我们先看一下drbd的主配置文件,显示的内容如下:
     include "drbd.d/global_common.conf";
include "drbd.d/*.res";
这就说明,我们需要把主配置文件分成几个文件来进行配置这几个配置文件分别是/etc/drbd.d/global-common.conf 和/etc/drbd.d/web.res
2)配置/etc/drbd.d/global-common.conf ,添加内容并修改如下:
   global {
        usage-count no;###########是否打开count记录
        # 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;######### 发生io-error时拆掉磁盘
                                  fencing resource-only;###########仅在资源上做fence
        }
 
        net {
                                  cram-hmac-alg "sha1";##########使用sha1算法加密
                                  shared-secret "mydrbdlab";##########加密的密码
        }
 
        syncer {
                rate 100M;############双方同步的时候使用的带宽
        }
}
 
3)定义一个资源文件/etc/drbd.d/web.res,内容如下:
   resource web {
      on node1.a.org {
         device /dev/drbd0;   ##########创建完成后再本地表示的设备
         disk /dev/sda5; #########使用的设备
         address 192.168.0.21:7789; #########nodeIP 和监听的端口
         meta-disk internal; ######在本地磁盘分区上存储元数据
                      }
      on node2.a.org {
         device /dev/drbd0;
         disk /dev/sda5;
         address 192.168.0.22:7789;
         meta-disk internal;
                      }
}
   然后我们需要把这些配置文件cp到node2上去
[root@node1 ~]# scp -r /dec/drbd.conf /etc/drbd.d node2:/etc
 
3 在两个各节点上初始化已经定义的资源并启动服务
   1)初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md web
 Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
显示这些信息表示初始化完成
   2) 启动服务,在Node1和Node2上分别执行:
#/etc/init.d/drbd start
   3) 查看启动状态
             root@node1 ~]# cat /proc/drbd 也可以像下面那样查看
             [root@node1 ~]# drbd-overview
                 0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r----
             由上边的显示结果可以看出,这是的接点架构不是主从的,两个节点均处于Secondary状态,于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:我们把node1设置为Primary
              [root@node1 ~]# drbdsetup /dev/drbd0 primary –o
              再次查看可以发现数据同步开始
              [root@node1 ~]# drbd-overview
               0:web SyncSource Primary/Secondary UpToDate/Inconsistent C r----
                 [=>..................] sync'ed: 14.1% (4108/4776)M delay_probe: 58
 
  待到数据同步完成后,再次查看状态,两节点已经有了主次
              [root@node1 ~]# drbd-overview
              0:web Connected Primary/Secondary UpToDate/UpToDate C r----
 
 
        4 创建文件系统 ,文件系统的穿将给只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
                [root@node1 ~]# mke2fs -t ext3 -L DRBD /dev/drbd0
                [root@node1 ~]# mkdir /web ###########创建目录用于挂载/dev/drbd0
                [root@node1 ~]# mount /dev/drbd0 /web ##############挂载/dev/drbd0
                然后cd到/web 下
                [root@node1 web]# ls
lost+found #############表明这急速和i一个新分区
[root@node1 web]# echo "hello,shrae" > indecx.html
然后分别在来那个node上使用命令”drbdadm role web”查看显示内容
 
 
      5   切换Primary和Secondary节点   
                对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
                [root@node1 ~]# umount /web ##########先卸载/web
                [root@node1 ~]# drbdadm secondary web #########设置为secondary节点
                [root@node1 ~]# drbd-overview
                 0:web Connected Secondary/Secondary UpToDate/UpToDate C r----
           然后在node2上
                [root@node2 ~]# mkdir /web   ########在node2上先创建/web
                [root@node2 ~]# drbdadm primary web #######node2设置为primary节点
[root@node2 ~]# drbd-overview
                 0:web Connected Primary/Secondary UpToDate/UpToDate C r----
                [root@node2 ~]# mount /dev/drbd0 /web
              
               [root@node2 web]# ls
               index.html lost+found
               [root@node2 web]# vim test.sh
               [root@node2 ~]# umount /web
               [root@node2 ~]# drbdadm secondary web
 
              然后node1上启用为primary节点
              [root@node1 ~]# drbdadm primary web
              [root@node1 ~]# drbd-overview
              0:web Connected Primary/Secondary UpToDate/UpToDate C r----
              [root@node1 ~]# mount /dev/drbd0 /web
              [root@node1 web]# ls
               index.html lost+found test.sh
             这表明在node2上个创建的文件在node1上也能够看到,由此就简单实现了高可用的共享存储