一步步构建基于DRBD的数据共享


DRBD(Distributed Replocated Blocak Device)分布式的复制块设备
在内核为2.6.33之后的版本中,DRBD就被编译进内核了,所以DRBD是在内核中工作的

下面我们就看看DRBD的工作流程图:

image

    当启用drbd功能,并将drbd设备挂载到本地之后,用户空间需要向磁盘上存数据的时候,当数据通过缓存时,drbd就将这些数据分成了两路,一路存储到本地的磁盘上,另一路通过本地的TCP/IP协议栈和网络将数据传输到另个开启drbd服务主机上,这个drbd主机接收数据并将数据存储到本地的drbd设备上,从而实现了数据的共享和同步,然而整个数据的同步过程都是在内核空间中进行的,所以对用户空间没有任何 影响

    drbd共有两部分组成:内核模块和用户空间的管理工具

  用户空间的管理工具:对内核中数据传输和共享的具体实施过程进行行为定义
  内核模块:依用户空间的管理工具的定义的方式来进行数据的传输和共享

Drbd的模型两种:

   单主节点:任何资源只能在主节点上进行读写操作,主节点的文件类型可以是任何的,只要是为高可用集群中的资源流转提供一个解决方案。

   双主节点:在任何时刻任意用户可以通过任意节点来进行读写操作,但是要结合集群文件系统来实现,所以要通过GFS或者OCFS2来实现其应用,只有在drbd的8.0版本之后才支持

 

下面我们就通过具体的配置过程来了解drbd各个部分的工作原理

配置前提:
1)本配置共有两个测试节点,分别node1.a.org和node2.a.org,相的IP地址分别为192.168.0.202和192.168.0.204;
2)node1和node2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sda5,大小为1G;

1、准备工作

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

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

node1: 

sed -i 's@\(HOSTNAME=\).*@\1node1.a.org@g'  
hostname node1.a.org 

 node2:

sed -i 's@\(HOSTNAME=\).*@\1node2.a.org@g'  
 hostname node2.a.org 

2、安装软件包

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

我们这里选用最新的8.3的版本

下载完成后直接安装即可:

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

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; 
        }

        net { 
                                cram-hmac-alg "sha1"; 
                                 shared-secret "mydrbdlab"; 
        }

        syncer { 
                rate 100M; 
        } 
}

 

 

3、定义一个资源/etc/drbd.d/web.res,内容如下:

  1. resource web {    
  2.     on node1.a.org {    
  3.     device    /dev/drbd0;           ##定义drbd设备号    
  4.     disk      /dev/sda5;               ## 定义drbd设备所使用的磁盘    
  5.     address   192.168.0.202:7789;  ##此drbd设备监听的网络地址和端口    
  6.     meta-disk internal;    
  7.   }    
  8.     on node2.a.org {    
  9.     device    /dev/drbd0;       
  10.     disk      /dev/sda5;    
  11.     address   192.168.0.204:7789;    
  12.     meta-disk internal;    
  13.   }    
  14. }   

将这两个配置文件拷贝到node2上,以保证配置文件相同 

 

  1. cd /etc/drbd.d  
  2. scp web.res global_common.conf node2:/etc/drbd.d 
  3. scp /etc/drbd.conf node2:/etc/  



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

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

  1. drbdadm create-md web 

2011-09-15 00-34-14

2)启动服务,在Node1和Node2上分别执行:

  1. /etc/init.d/drbd start 

2011-09-15 00-39-53

3)查看启动状态:

  1. cat /proc/drbd  
2011-09-15 00-40-34

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

  1. drbd-overview 


2011-09-15 00-41-50

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

  注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
     drbdadm -- --overwrite-data-of-peer primary web  这种方法更加标准
    (注:这两个设置primary节点的命令只在第一次使用,以后就可以直接使用drbdadm primary web)

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

  1. drbd-overview  


2011-09-15 00-44-47    

此时我们还可以使用如下命令动态的查看同步过程
watch -n 1 'drbd-overview'
当数据同步完成以后再次查看状态

  1. drbd-overview 

2011-09-15 00-57-07

可以发现节点已经为实时状态,且节点已经有了主次:

5、创建文件系统

因为文件系统的挂载只能在Primary节点进行,所以只有在设置了主节点后才能对drbd设备进行格式化:

  1. mke2fs -j  /dev/drbd0  
  2. mkdir /drbd   
  3. mount /dev/drbd0 /drbd 

6、切换Primary和Secondary节点

对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:

我们先在drbd设备上存储个网页文件,而后在主从节点改变后查看node1的index.html文件是否复制到node2上

node1:

echo node1 > /drbd/index.html 

    为了进行验证而设置的文件
首先卸载drbd设备

  1. umount /drbd 

将其设定为从节点

  1. drbdadm secondary web 

查看状态:
2011-09-15 10-50-08

将node2设为primary

  1. drbdadm primary web  

查看状态: 
drbd-overview

2011-09-15 10-59-34

状态显示node2已经成为从节点
挂载drbd设备

  1. mkdir /drbd   
  2. mount /dev/drbd0 /mnt/drbd 

查看文件是否存在

相关内容