生产环境下的高可用NFS文件服务器

一、DRBD简介

分布式复制块设备(DRBD,Distributed Replicated Block Device)是一种基于Linux的软件组件, 它是由内核模块和相关程序而组成的,通过网络镜像促进共享存储系统的替换。也就是说: 当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证 实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务

分布式复制块设备(DRBD)是在90年代末由Philipp Reisner和Lars Ellenberg设想和开发的。开发者是为了创建一个Linux安全标准,以最低成本提供最佳的安全保障。分布式复制块设备的当前版本可以与Linux 的普通版本一起使用,用于在被动系统和主动系统之间进行存储数据的同步复制。数据可以在两个系统同时读取和输入。分布式复制块设备还支持资源级别防护。分布式复制块设备(DRBD)工程与一组称为Heartbeat的管理程序一起使用。它已经被收集到Linux的一些发行版中,目前流行的Linux中只有Centos有预编译好的安装包和对应内核。

分布式复制块设备(DRBD)是LINBIT信息技术有限责任公司的一个注册商标,总部设在奥地利维也纳。该软件已通过通用公共许可证(GNU GPL)发布,它可以在许可协议允许的范围内自由分发和修改。

二、DRBD的工作原理


理解DRBD其实就是网络RAID-1,二台服务器中就算其中的某台因电源或主板损坏而宕机而对数据无任何影响(可以用硬盘RAID-1来理解DRBD),而真正的热切换可以通过Heartbeat来实现,这样切换过程跟Keepalived类似,是非常短及不需要人为干预的。

三、DRBD的使用

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

(1)一个磁盘,或者是磁盘的某一个分区

(2)一个soft raid 设备

(3)一个LVM的逻辑卷

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

(5)其他任何的块设备

我们的线上环境采取的第一种,即用单独的磁盘来做的DRBD。

四、DRBD的配置过程

我查阅了网上大量的教程类文间,感觉写得不算是详细;今天我登陆到服务器上,发现我的DRBD+Heartbeat已经稳定运行了161天(海量图片文件服务器),相当的稳定和高效。如果没有线上环境的同学也不要着急,大家完全可以根据我的文章用VMware workstation6.0+Centos5.x系统实现这个实验,达到熟练掌握的目的。需要注意的地方我会重点说明,整个测试过程参考生产服务器。

服务器1:centos1.7788.com,单独拿一块硬盘sdb作DRBD

服务器2:centos2.7788.com,单独拿一块硬盘sdb作DRBD

网络拓补很简单:

centos1.7788.com eth0:192.168.4.191,物理bridge连接,eth1:10.0.0.1,这个可以采用虚拟网段VM5

centos2.7788.com eth0:192.168.4.192,物理bridge连接,eth1:10.0.0.2,这个可以采用虚拟网段VM5

VIP:   192.168.4.194,这个是通过Heartbeat来实现的,原理跟Keepalived类似,它通过在某台服务器的eth0:0上绑定,如果遇到故障就转移,达到高HA的目的;这个同时也是对外提供服务的IP。

Hosts的配置在二台机器上一样,不需要太复杂,只配置心跳部分即可,即:

centos1.7788.com 192.168.4.191 centos1
centos2.7788.com 192.168.4.192 centos2

另外关于时间同步一说,蛮多哥哥说要ntpdate,其实也没什么必要;不过为了线上环境的严谨,这步就做一下吧,ntpdate ntp.api.bz。

◆DRBD的安装和配置

DRBD官方网站:http://www.linux-ha.org/DRBD

源码下载地址: http://oss.linbit.com/drbd

FAQ: http://www.linux-ha.org/DRBD/FAQ

目前流行的Linux中只有Centos有预编译好的安装包和对应内核.

如果不想用Centos可以选择从源码安装.

DRBD有两种安装模式:直接编译进内核 或 作为一个可加载的内核模块编译.

以下使用的是CentOS 5.2 i386 系统安装与测试:

1. 安装依赖库.

yum install gcc gcc-c++ make glibc flex

2. 在primary和secondary上都使用相同的安装方法:

  
  
  
  
  1. tar zxvf drbd-8.0.6.tar.gz  

  2. cd drbd-8.0.6  

  3. make  

  4. //make KDIR=/usr/src/linux *内核所在的位置*, 如果没有更改内核可  

  5. //直接运行make, 软件会直接到/lib/module里边去寻找系统环境,  

  6. //如果是新的内核需要对内核进行编译安装, 否则make时候会错误中断掉.  

  7. make install


3. 安装完主要生成命令: “drbdsetup”, “drbdadmin”

和配置文件: /etc/drbd.conf

启动文件: /etc/init.d/drbd

模块文件: drbd.ko  (在编译好的安装包目录下的drbd下可以找到)


  
  
  
  
  1. ls /lib/modules/2.6.18-128.el5/kernel/drivers/block/  

  2. cpqarray.ko  drbd.ko  nbd.ko  sx8.ko


所有命令和配置文件都可以在源码包编译成功的目录下面找到.

./scripts/drbd.conf是最原始的配置文件, 当/etc/drbd.conf被破坏, 可以直接拷贝覆盖掉.

4. drbd采用的是模块控制的方式, 所以先要加载drbd.ko 模块.


  
  
  
  
  1. modprobe drbd  

  2. 查看drbd模块是否已经加载到内核中了:  

  3. lsmod | grep drbd  

  4. drbd    226352  2         //有的话表示加载模块成功.


5. 先确认两台要镜像的机器是否正常, 之间的网络是否通畅, 需要加载的硬盘是否处于umount状态.

6. 在两台主机上都创建硬件设备drbd.


  
  
  
  
  1. mknod /dev/drbd0 b 147 0  

  2. //mknod /dev/drbd1 b 147 1  

  3. //mknod /dev/drbd2 b 147 2  如需多个drbd设备则依次去创建.


7. 二台机器将/dev/sdb1互为镜相(两台机器配置相同).

  
  
  
  
  1. yum -y install portmap  

  2. yum -y install nfs  

  3. mkdir /d      //创建共享目录.  

  4. vim /etc/exports  

  5. /d 10.1.2.0/255.255.252.0(rw,no_root_squash,no_all_squash,sync)  

  6. /etc/init.d/portmap start  

  7. chkconfig �Clevel 3 portmap on  

  8. chkconfig �Clevel 3 nfs off  

  9. //nfs不需要启动, 也不需要设置成开机自动运行, 这些都将由后面的heartbeat来完成.


8. 配置drbd.

DRBD运行时,会读取一个配置文件/etc/drbd.conf.

这个文件里描述了DRBD设备与硬盘分区的映射关系, 和DRBD的一些配置参数


  
  
  
  
  1. [root@centos1 ~]# cat /etc/drbd.conf  

  2. #创建一个资源,名字叫r0  

  3. resource r0 {  

  4. protocol C;  

  5. #采用C协议,表示收到远程主机的写入确认后,则认为写入完成。  

  6. startup { wfc-timeout 0; degr-wfc-timeout 120; }  

  7. disk { on-io-error detach; }  

  8. net {  

  9.     timeout 60;  

  10.     connect-int 10;  

  11.     ping-int 10;  

  12.     max-buffers 2048;  

  13.     max-epoch-size 2048;  

  14.     }

  
  
  
  
  1. syncer { rate 30M; }  

  2. #设置主备节点同步时的网络速率最大值  

  3. on centos1.7788.com {  

  4.   device    /dev/drbd0;  

  5.   disk      /dev/sdb;  

  6.   address   10.0.0.1:7788;  

  7.   meta-disk internal;  

  8. }  

  9. on centos2.7788.com {  

  10.   device    /dev/drbd0;  

  11.   disk      /dev/sdb;  

  12.   address   10.0.0.2:7788;  

  13.   meta-disk internal;  

  14. }  

  15. }  

  16. #每个主机的说明以"on"开头,分别是各自的主机名,再后面的{}为这个主机的配置;监听端口为7788, meta-disk internal即表示在同一个局域网内

9.drbd的启动, 激活前面配置的drbd资源 “r0″. (两个节点都要执行)

在启动DRBD之前,你需要分别在两台主机的hdb1分区上, 创建供DRBD记录信息的数据块.

分别在两台主机上执行:


  
  
  
  
  1. [root@centos1 /]# drbdadm create-md r0    //创建r0的资源, r0是我们在drbd.conf里定义的资源名称.  

  2. [root@centos2 /]# drbdadm create-md r0


现在可以启动drbd了, 分别在两台主机上执行.

  
  
  
  
  1. [root@centos1 /]# /etc/init.d/drbd start #我喜欢用service drbd start  

  2. [root@centos2 /]# /etc/init.d/drbd start


设置drbd开机自动启动.

  
  
  
  
  1. [root@centos1 /]# chkconfig --add drbd  

  2. [root@centos2 /]# chkconfig --add drbd


现在可以查看drbd当前的状态, 然后在centos1上执行:


  
  
  
  
  1. [root@centos1 /]# cat /proc/drbd  

  2. version: 8.0.0 (api:86/proto:86)  

  3. SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14  

  4. 1: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r―  

  5. ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0  

  6. resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0  

  7. act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0


第一行的’st’表示两台主机的状态,都是”备机”状态.

‘ds’是磁盘状态,都是”不一致”状态.

这是由于,DRBD无法判断哪一方为主机,以哪一方的磁盘数据作为标准数据.

所以,我们需要初始化一个主机, 那么需要在centos1上执行.

10.初始化centos1(这步只要在主节点上操作)


  
  
  
  
  1. [root@centos1 /]# drbdsetup /dev/drbd0 primary -o   //定义为主节点.  

  2. # drbdadm primary r0


第一次设置主节点时用 drbdadm 命令会失败, 所以先用drbdsetup 来做, 以后就可以用drbdadm了.

再次查看drbd当前的状态.


  
  
  
  
  1. [root@centos1 ~]# cat /proc/drbd  

  2. version: 8.0.0 (api:86/proto:86)  

  3. SVN Revision: 2713 build by root@centos1, 2008-06-27 14:07:14  

  4. 1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r―  

  5. ns:18528 nr:0 dw:0 dr:18528 al:0 bm:1 lo:0 pe:0 ua:0 ap:0  

  6. [>...................] sync’ed:  0.3% (8170/8189)M  

  7. finish: 6:46:43 speed: 336 (324) K/sec  

  8. resync: used:0/31 hits:1156 misses:2 starving:0 dirty:0 changed:2  

  9. act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0


现在主备机状态分别是’主/备’, 主机磁盘状态是’实时’, 备机状态是’不一致’.

在第3行, 可以看到数据正在同步中, 即主机正在将磁盘上的数据, 传递到备机上.

现在的进度是0.3%.

设置完之后的第一次同步耗时比较长, 因为需要把整个分区的数据全部同步一遍.

第一次同步完成之后, 就可以对drbd的设备创建文件系统了:

稍等一段时间, 在数据同步完后, 再查看一下两台机器的DRBD状态:


  
  
  
  
  1. [root@centos1 ~]# cat /proc/drbd  

  2. SVN Revision: 3048 build by [email protected], 2010-01-20 06:09:12  

  3. 0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r―



  
  
  
  
  1. [root@centos2 ~]# service drbd status  

  2. SVN Revision: 3048 build by [email protected], 2010-01-20 06:09:02  

  3. 0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r―


现在磁盘状态都是’实时’, 表示数据同步完成了.

#查看drbd的实时状态,我喜欢用service drbd status

11.drbd的使用.

现在可以把主机上的DRBD设备挂载到一个目录上进行使用.

备机的DRBD设备无法被挂载, 因为它是用来接收主机数据的, 由DRBD负责操作.

在centos1主服务器上执行:


  
  
  
  
  1. [root@centos1 /]# mkfs.ext3 /dev/drbd0  

  2. [root@centos1 mnt]# mount /dev/drbd0 /d      //只要在主节点上操作


现在, 就可以对 /d 分区进行读写操作了.

注意: secondary节点上不允许对drbd设备进行任何操作, 包括只读.

所有的读写操作只能在primary节点上进行.

只有当primary节点挂掉之后, secondary节点才能提升成为primary节点, 继续进行读写操作.

五、Heartbeat的配置过程

真实的服务器之间的连接用交叉线连接,本着简单高效的原则,直接购买即可。

1. 安装, 在两台主机都同样的安装.


  
  
  
  
  1. yum -y install heartbeat  

  2. #奇怪的事,此命令要执行二次,不然heartbeat还真安装不上去,奇怪的问题。  

  3. 其中Heartbeat配置共涉及3个文件.  

  4. /etc/ha.d/ha.cf  

  5. /etc/ha.d/haresources  

  6. /etc/ha.d/authkeys  

  7. /etc/ha.d/resource.d/killnfsd


2. 二个节的配置的配置文件都是一样, 文件内容如下


  
  
  
  
  1. logfile         /var/log/ha-log  

  2. #定义HA的日志名字及存放位置  

  3. logfacility     local0  

  4. keepalive       2  

  5. #设定心跳(监测)时间为2秒  

  6. deadtime        5  

  7. #死亡时间定义为5秒  

  8. ucast           eth1 10.0.0.2  

  9. #采用单播方式,IP地址指定为对方IP  

  10. auto_failback   off  

  11. #服务器正常后由主服务器接管资源,另一台服务器放弃该资源  

  12. node            centos1.7788.com  centos2.7788.com  

  13. #定义节点


2. 编辑双机互联验证文件: authkeys


  
  
  
  
  1. [root@centos1 ha.d]# vim /etc/ha.d/authkeys  

  2. auth 1  

  3. 1 crc  

  4. //需要将 /etc/ha.d/authkeys设为600的权限.  

  5. [root@centos1 ha.d]# chmod 600 /etc/ha.d/authkeys  

  6. [root@centos2 ha.d]# chmod 600 /etc/ha.d/authkeys


3. 编辑集群资源文件: haresources


  
  
  
  
  1. [root@centos1 ha.d]# vim /etc/ha.d/haresources  

  2. centos1.7788.com IPaddr::192.168.4.194/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/d::ext3 killnfsd  

  3. #此文件二台机器上配置一样,千万不要自做聪明在另一台机器上配置成centos2.7788.com


4.编辑脚本文件killnfsd,目的其实就是为了重启nfs服务。这是因为NFS服务切换后,必须重新mount一下nfs共享出来的目录,否则会出现stale NFS file handle的错误。


  
  
  
  
  1. #[root@centos1 ha.d]# vim /etc/ha.d/resource.d/killnfsd  

  2. #killall -9 nfsd; /etc/init.d/nfs restart; exit 0  

  3. #[root@centos1 ha.d]# chmod 755 /etc/ha.d/resource.d/killnfsd


5. 在二个节点启动Heartbeat即可,先在主节点启动

  
  
  
  
  1. [root@centos1 /]# service heartbeat start  

  2. [root@centos2 /]# service heartbeat start  

  3. #这时就可以在另外的机器上面,正常挂载192.168.4.194:/d到自己的/mnt/data下进行正常的读写了,client会认为这个就是一个提供NFS的机器。

六、测试

由于我的线上环境已经很稳定了,这个测试结果是让大家进行的,让大家熟悉DRBD+Heartbeat;我建议做完此步后再做测试,看Heartbeat是否能做到真正的热切换。

测试一、在另一台FreeBSD8下挂载192.168.4.194:/d,向里面写数据时,忽然重新启动主DRBD,看此时写数据有影响不,发现DRBD+Heartbeat正常切换还是需要些时间的;

测试二、正常状态下关机Primary机,然后看数据有无问题,观察DRBD的status;然后等主机启动后,再观察变化,然后再关机secondary,然后再启动,观察DRBD变化及Heartbeat起作用了没。

测试三、假设此时把primary的eth0 给ifdown了, 然后直接在secondary上进行主的提升,并也给mount了, 发现在primary上测试拷入的文件确实同步过来了。之后把primary的 eth0 恢复后, 发现没有自动恢复主从关系, 经过支持查询,发现出现了drbd检测出现了Split-Brain 的状况, 两个节点各自都standalone了,故障描术如下:Split-Brain detected, dropping connection!这个即时传说中的脑裂了,DRBD官方推荐手动恢复(生产环境下出现这个机率的机会很低的,谁会去故障触动生产中的服务器)

以下手动恢复Split-Brain状况:

i. 在secondary上:

  
  
  
  
  1. drbdadm secondary r0  

  2. drbdadm disconnect all  

  3. drbdadmin -- --discard-my-data connect r0


ii.在primary上:

  
  
  
  
  1. drbdadm disconnect all  

  2. drbdadm connect r0


测试四、假设Primary因硬件损坏了,需要将Secondary提生成Primay主机,如何处理,方法如下:

在primaty主机上,先要卸载掉DRBD设备.

[root@centos1 /]# umount /d

将主机降级为”备机”


  
  
  
  
  1. [root@centos1 /]# drbdadm secondary r0  

  2. [root@centos1 /]# cat /proc/drbd  

  3. 1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r―


现在,两台主机都是”备机”.

在备机centos2上, 将它升级为”主机”.


  
  
  
  
  1. [root@centos2 /]# drbdadm primary r0  

  2. [root@centos2 /]# cat /proc/drbd  

  3. 1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r―


现在centos2成为主机了.

至此,整个实验结束了;建议大家多做测试和总结,几十遍后就会完全掌握其用法,祝大家Happy先了。


你可能感兴趣的:(高可用NFS文件服务器)