预计阅读本页时间:-
7.4.4 案例分享四:生产环境下的高可用NFS文件服务器
某日例行检查机房的服务器时,发现笔者的DRBD+Heartbeat+NFS文件服务器已经稳定运行了1061天(两台CentOS 5.3 i386,DELL2950机器,用作图片及代码存放文件服务器),稳定性相当不错,鉴于DRBD已作为MySQL官方推荐的用于实现MySQL高可用的一种非常重要的方式,建议大家掌握这个知识点。在介绍过程中,如果有需要注意的地方会重点说明,整个测试过程均参考了线上文档。
分布式复制块设备(Distributed Replicated Block Device,DRBD)是一种基于Linux的软件组件,它是由内核模块和相关程序组成的,可通过网络镜像促进共享存储系统的替换。也就是说:当你将数据写入本地DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时同步,并且可以保证I/O的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还保留着一份完全相同的数据,可以继续使用,以达到高可用的目的。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
DRBD的工作原理如图7-8所示。
图7-8 DRBD工作原理图
我们可以这样理解DRBD,它其实就是网络RAID-1,两台服务器中就算其中的某台因电源或主板损坏而宕机也不会对数据有任何影响(可以用硬盘RAID-1来理解DRBD),而真正的热切换可以通过Heartbeat来实现,这样的切换过程跟Keepalived类似,非常短且不需要人为干预。
DRBD需要构建在底层设备之上,而且还需要构建出一个块设备来。对于用户来说,一个DRBD设备就像是一块物理磁盘,可以在磁盘内创建文件系统。DRBD所支持的底层设备如下:
·单独的磁盘。
·磁盘的某一个分区。
·一个soft RAID设备。
·一个LVM的逻辑卷。
·一个EVMS(Enterprise Volume Management System,企业卷管理系统)的卷。
·其他任何的块设备。
此项目中采用的是第一种,即用单独的磁盘来做DRBD。
下面将介绍DRBD+Heartbeat+NFS的详细配置过程。
1.做好整个环境的准备工作
两台服务器均要做好准备工作,比如设置好hosts文件并进行NTP对时。
primary 服务器:
centos1.cn7788.com,
单独拿一块硬盘
sdb作为
DRBD
secondary 服务器:
centos2.cn7788.com,
单独拿一块硬盘
sdb作为
DRBD
网络拓扑很简单,命令如下:
centos1.7788.com eth0:192.168.1.103,
eth1:10.0.0.1(心跳线
)
centos2.7788.com eth0:192.168.1.104,
eth1:10.0.0.2(心跳线
)
DRBD对外的VIP地址是:192.168.1.105,这是通过Heartbeat来实现的,原理跟Keepalived类似,它通过绑定在某台服务器的eth0:0上,如果遇到故障就转移,以达到高HA的目的。这同时也是对外提供NFS服务的IP。
关于/etc/hosts的配置,在两台机器上是一样的,不需要太复杂,只须配置心跳部分即可,即:
centos1.cn7788.com 10.0.0.1 centos1
centos2.cn7788.com 10.0.0.2 centos2
本着简单高效的原则,两台DELL 2850服务器之间采用交叉线连接。
DRBD对服务器的性能要求不高,为了磁盘文件的安全,会将其做成RAID 5。另外,关于时间同步的问题,考虑到线上环境的严谨性,建议进行如下操作:
ntpdate ntp.api.bz
最后,如果想让主机名的名字永久生效,建议重启机器,核对检查所有配置是否生效;最重要的心跳线一定要保持ping通的状态,我们在工作后期对IP进行了迁徙工作,发现只要不人为拔掉心跳线,基本上不会发生“脑裂”现象。另外,记得关掉两台机器的iptables和SELinux,以免影响结果。
2.DRBD的安装和配置过程
1)首先安装依赖库,以下进行安装与测试的均为CentOS 5.3 i386系统,这里采用的软件安装方式主要以源码为主,yum的安装方法可以参考后面的章节,命令如下:
yum install gcc gcc-c++ make glibc flex
2)在primary和secondary上都要使用相同的安装方法,如下所示:
cd /usr/local/src
wget http://oss.linbit.com/drbd/8.0/drbd-8.0.6.tar.gz
tar zxvf drbd-8.0.6.tar.gz
cd drbd-8.0.6
make
这里需要说明一下的是,如果没有更改内核则可以直接运行make,程序会直接到/lib/module里面去寻找系统环境,如果是新的内核则需要指定内核所在的位置,如make DKDIR=/usr/src/linux或make DKDIR=/usr/src/kernel/,这个目录就是系统内核所在的位置,否则make的时候会报“Could not determine uts_release”的错误而中断掉。因为前面在进行LVS等实验演示时升级了内核,所以在这里也需要指定内核位置,笔者用的是make DKDIR=/usr/src/kernel/。如果大家在安装时遇到报错问题,以上方法都可以尝试一下;如果是新内核升级,还要记得重启一下机器,不然也会安装不成功的。命令如下:
make install
3)DRBD程序安装完成后主要生成命令drbdsetup、drbdadmin,配置文件/etc/drbd.conf、启动文件/etc/init.d/drbd及模块文件drbd.ko(在编译好的安装包目录下的drbd中可以找到),可以用如下命令查看:
ll /lib/modules/2.6.18-238.9.1.el5/kernel/drivers/block/
命令显示结果如下所示:
total 3652
drwxr-xr-x 2 root root 4096 May 15 00:45 aoe
-rwxr--r-- 1 root root 141952 Apr 13 08:31 cciss.ko
-rwxr--r-- 1 root root 71712 Apr 13 08:31 cpqarray.ko
-rwxr--r-- 1 root root 39264 Apr 13 08:31 cryptoloop.ko
-rwxr--r-- 1 root root 128520 Apr 13 08:31 DAC960.ko
-rw-r--r-- 1 root root 2858045 May 15 00:54 drbd.ko
-rwxr--r-- 1 root root 142800 Apr 13 08:31 floppy.ko
-rwxr--r-- 1 root root 56824 Apr 13 08:31 loop.ko
-rwxr--r-- 1 root root 51984 Apr 13 08:31 nbd.ko
drwxr-xr-x 2 root root 4096 May 15 00:45 paride
-rwxr--r-- 1 root root 76216 Apr 13 08:31 pktcdvd.ko
-rwxr--r-- 1 root root 61744 Apr 13 08:31 sx8.ko
-rwxr--r-- 1 root root 45648 Apr 13 08:31 virtio_blk.ko
所有命令和配置文件都可以在源码包编译成功的目录下找到。
4)DRBD采用的是模块控制的方式,所以要先加载drbd.ko模块,命令如下:
modprobe drbd
查看DRBD模块是否已经加载到内核中了(有的话表示已经成功加载到内核中了),命令如下:
lsmod | grep drbd
显示结果如下所示:
drbd 226608 0
5)确认两台要镜像的机器运行是否正常,它们之间的网络是否通畅,需要加载的硬盘是否处于umount状态,命令略过。
6)在两台主机上都创建硬件设备DRBD,命令如下:
mknod /dev/drbd0 b 147 0
因为两台主机都只有一块DRBD设备,所以这里不需要再创建多个了。
7)两台机器将/dev/sdb1互为镜像(两台机器的配置相同),这里只列出centos1的操作步骤,centos2的操作步骤可依次类推,具体如下:
yum -y install portmap
yum -y install nfs
mkdir /drbd
创建共享目录,用vim编辑/etc/exports文件,内容如下:
/d 10.1.2.0/255.255.252.0 (rw,no_root_squash,no_all_squash,sync)
这里只允许10.1.0.0网段的机器共享,也是基于安全的考虑。
然后配置NFS服务涉及的portmap和nfs服务,命令如下:
service portmap start
chkconfig --level 3 portmap on
chkconfig --level 3 nfs off
NFS服务不需要启动,也不需要设置成开机自动运行,这些都将由后面的Heartbeat来完成。
8)配置DRBD。DRBD运行时,会读取一个配置文件/etc/drbd.conf,这个文件里描述了DRBD设备与硬盘分区的映射关系,以及DRBD的一些配置参数,编辑/etc/drbd.conf文件,内容如下:
resource r0 {
protocol C;
startup { wfc-timeout 0; degr-wfc-timeout 120; }
disk { on-io-error detach; }
net {
timeout 60;
connect-int 10;
ping-int 10;
max-buffers 2048;
max-epoch-size 2048;
}
syncer { rate 30M; }
on centos1.7788.com {
device /dev/drbd0;
disk /dev/sdb;
address 10.0.0.1:7788;
meta-disk internal;
}
on centos2.7788.com {
device /dev/drbd0;
disk /dev/sdb;
address 10.0.0.2:7788;
meta-disk internal;
}
}
其中:
·resource r0表示创建的资源名字。
·syncer C表示采用C协议,如果收到远程主机的写入确认,则认为写入完成。syncer选项是设备主备节点同步时的网络速率最大值。每个主机的说明都以“on”开头,然后是各自的主机名,再后面的{}里是这个主机的配置,监听端口为7788。
·meta-disk internal表示在同一个局域网内。
9)启动DRBD,激活前面配置的DRBD资源r0(两个节点都要执行)。在启动DRBD之前,需要在两台主机的hdb1分区上分别创建供DRBD记录信息的数据块,并在两台主机上分别执行如下命令:
drbdadm create-md r0
命令显示结果如下所示:
Valid meta-data already in place, recreate new?
[need to type 'yes' to confirm] yes
Creating meta data...
initialising activity log
NOT initialized bitmap (
32 KB)
New drbd meta data block successfully created.
创建r0的资源,其中r0是我们在drbd.conf里定义的资源名称,最后一行显示创建r0资源成功。
现在可以启动DRBD了,分别在两台主机上执行,命令如下所示:
/etc/init.d/drbd start
设置DRBD开机时自动启动,命令如下:
chkconfig drbd on
现在可以查看DRBD当前的状态,在centos1上执行如下命令:
cat /proc/drbd
此命令执行后结果如下所示:
version: 8.0.0 (api:86/proto:86)
SVN Revision:?2713 build by root@centos1, 2008-06-27 14:07:14
1: cs:Connected st: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
resync: used:0/31 hits:0 misses:0 starving:0 dirty:0 changed:0 act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
第一行的“st”表示两台主机的状态都是备机状态。
“ds”是磁盘状态,显示其状态“不一致”。这是因为DRBD无法判断哪一方为主机,应该以哪一方的磁盘数据作为标准数据。所以我们需要初始化一个主机,考虑放在centos1上执行。
10)初始化centos1机器(这步只要在主节点上操作即可):
drbdsetup /dev/drbd0 primary -o
drbdadm primary r0
第一次设置主节点时用drbdadm命令会失败,所以先用drbdsetup来进行操作,以后就可以用drbdadm命令了。
再次查看DRBD当前的状态,命令如下:
cat /proc/drbd
显示结果如下:
version: 8.0.6(api:86/proto:86)
SVNRevision:2713build by root@centos1, 2008-06-27 14:07:14
1: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r—
ns:18528 nr:0 dw:0 dr:18528 al:0 bm:1 lo:0 pe:0 ua:0 ap:0
[>...................] sync’
ed: 0.3% (8170/8189)M
finish: 6:46:43 speed: 336 (324) K/sec
resync: used:0/31 hits:1156 misses:2 starving:0 dirty:0 changed:2
act_log: used:0/257 hits:0 misses:0 starving:0 dirty:0 changed:0
现在主备机的状态分别是“主/备”,主机磁盘状态是“实时”,备机状态是“不一致”。
在第3行中可以看到数据正在同步,即主机正在将磁盘上的数据传递到备机上,现在的进度是0.3%。
设置完之后第一次同步的耗时会比较长,因为需要把整个分区的数据全部同步一遍。
第一次同步完成之后,就可以对DRBD的设备创建文件系统了。
稍等一段时间,在数据同步完成之后再查看一下两台机器的DRBD状态,命令如下:
[root@centos1 ~]# service drbd status
显示结果如下所示:
SVN Revision: 3048 build by root@centos1.7788.cn, 2010-01-20 06:09:12
0: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
查看centos2机器的DRBD状态,命令如下:
[root@centos2 ~]# service drbd status
显示结果如下所示:
SVN Revision: 3048 build by root@centos2.7788.cn, 2010-01-20 06:09:02
0: cs:Connected st:Secondary/Primary ds:UpToDate/UpToDate C r—
现在磁盘的状态都是“实时”的,表示数据同步完成了。
在查看DRBD的实时状态时,命令如下(两个命令任选一个即可):
service drbd status
cat /proc/drbd
11)DRBD的使用。现在可以把主机上的DRBD设备挂载到一个目录上使用了。备机的DRBD设备无法被挂载,因为它是用来接收主机数据的,由DRBD负责操作。
在centos1主服务器上执行如下命令:
mkfs.ext3 /dev/drbd0
mount /dev/drbd0 /drbd
现在,可以对/drbd分区进行读写操作了。
注意
secondary节点上不允许对DRBD设备进行任何操作,包括只读。所有的读写操作只能在primary节点上进行,只有当primary节点挂掉时,secondary节点才能提升成为primary节点,继续进行读写操作。
截止到这步,DRBD的安装就算成功了。那么我们究竟应该如何保证DRBD机器的高可用呢?这就要用Heartbeat来实现了。另外,如果启动了Heartbeat服务,就不需要再手动mount了,Heartbeat会自动mount。
参考文档:
DRBD的官方网站:http://www.drbd.org/ 。
源码下载地址:http://oss.linbit.com/drbd 。
FAQ:http://www.linux-ha.org/DRBD/FAQ 。
3.Heartbeat的配置过程
1)在两台主机上分别安装Heartbeat,命令如下:
yum -y install heartbeat
奇怪的是,此命令要执行两次,不然Heartbeat安装不上去,这个也算是安装Heartbeat的一个Bug吧。
整个故障描述如下,很明显第一次安装Hearbeat包没有成功:
error: %pre(heartbeat-2.1.3-3.el5.centos.x86_64) scriptlet failed, exit status 9
error: install: %pre scriptlet failed (2), skipping heartbeat-2.1.3-3.el5.centos
Installed:
heartbeat.x86_64 0:2.1.3-3.el5.centos
Dependency Installed:
heartbeat-pils.x86_64 0:2.1.3-3.el5.centos
heartbeat-stonith.x86_64 0:2.1.3-3.el5.centos Complete!
本来要安装4个软件包,结果只安装成功了3个,所以必须要再执行一次如下命令:
yum -y install heartbeat
其中Heartbeat配置共涉及4个文件:
/etc/ha.d/ha.cf
/etc/ha.d/haresources
/etc/ha.d/authkeys
/etc/ha.d/resource.d/killnfsd
2)对两个节点机器进行配置,配置文件都是一样的,文件内容如下:
logfile /var/log/ha-log #定义
HA的日志名字及存放位置
logfacility local0
keepalive 2 #设定心跳(监测
)时间为
2秒
deadtime 5 #死亡时间定义为
5秒
ucast eth1?10.0.0.2 #采用单播方式,
IP地址指定为对方
IP
auto_failback off #服务器正常后由主服务器接管资源,另一台服务器放弃该资源
node centos1.7788.com??centos2.7788.com #定义节点
3)编辑双机互连验证文件/etc/ha.d/authkeys,直接用vim来编辑,命令如下所示:
auth 1
1 crc
需要将/etc/ha.d/authkeys设为600的权限,命令如下:
chmod 600 /etc/ha.d/authkeys
4)编辑集群资源文件/etc/haresources,内容如下所示:
centos1.cn7788.com IPaddr::192.168.1.108/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/drbd::ext3 killnfsd
注意
此文件在两台机器上的配置是一样的,强烈建议不要将另一台机器配置成centos2.7788.com ,最好的做法是先只在centos1机器上进行配置,然后将配置文件scp或rsync到centos2机器上面。
5)编辑脚本文件killnfsd,目的其实就是重启NFS服务。这是因为NFS服务切换后,必须要重新mount一下NFS服务共享出来的目录,否则会出现“stale NFS file handle”的错误,我们直接用vim来进行编辑,命令如下所示:
vim /etc/ha.d/resource.d/killnfsd
脚本内容如下所示:
killall -9 nfsd; /etc/init.d/nfs restart; exit 0
给予killnfsd执行的权限,命令如下所示:
[root@centos1 ha.d]# chmod 755 /etc/ha.d/resource.d/killnfsd
6)在两个节点上启动Heartbeat,可以先在主节点启动,命令如下所示:
[root@centos1 /># service heartbeat start
[root@centos2 /># service heartbeat start
这时就可以在另外的机器上面正常挂载192.168.1.106:/drbd/到自己的/mnt/data下进行读写了,客户端会认为这仅仅是一个提供NFS的机器。192.168.1.108是Heartbeat产生的VIP地址,也是对外提供NFS服务的地址。
4.进行数据测试工作和故障模拟
虽然笔者的线上环境已经很稳定了,但为了让大家熟悉DRBD+Heartbeat的模式,还是按步骤进行了相关的操作,建议完成如下测试后再查看Heartbeat是否能做到真正的热切换。
1)在另外的某一台Linux机器上挂载192.168.1.108:/drbd,在向里面写数据时,忽然重新启动主DRBD,看此时写数据是否受到了影响,你可能会发现DRBD+Heartbeat正常切换还是需要些时间的。
2)正常状态下将Primary关机,然后查看数据有无问题,观察DRBD的status;等主机启动后,再观察变化,然后再将Secondary关机,再启动,观察DRBD的变化,以及Heartbeat是否起了作用。
3)假设此时停用了Primary的eth0网卡,然后直接在Secondary上进行主Primary主机的提升,并且也给mount了,你可能会发现在Primary上测试拷入的文件确实同步过来了。之后把Primary的eth0网卡恢复后,看看有没有自动恢复主从关系,经过支持查询,你可能会发现DRBD检测出现了“脑裂”的状况,两个节点各自都成单点了,故障描述如下:“Split-Brain detected,dropping connection!”这就是传说中的“脑裂”,DRBD官方推荐手动恢复(生产环境下出现这个问题的概率很低,谁会故意去触动生产中的服务器网线呢?谁又会像这样故意去折腾线上的生产服务器呢?)。我们在工作中进行IP迁徙时,会发现只要不触动心跳线,产生“脑裂”情况的概率真的很低。
以下为手动解决“脑裂”问题的方法。
a)在Secondary主机上执行如下命令:
drbdadm secondary r0
drbdadm disconnect all
drbdadmin –
discard-my-data connect r0
b)在Primary主机上执行如下命令:
drbdadm disconnect all
drbdadm connect r0
4)假设Primary主机因为硬件损坏,需要将Secondary提升成Primary主机,应该如何处理呢?方法如下。
a)先在Primary主机上卸掉DRBD设备,命令如下:
umount /d
然后将主机降为备机,命令如下:
[root@centos1 /># drbdadm secondary r0
观察其状态,命令如下:
[root@centos1 /># cat /proc/drbd
显示结果如下所示:
1: cs:Connected st:Secondary/Secondary ds:UpToDate/UpToDate C r—
现在,两台主机都是备机了,我们可以通过st命令观察得到此信息。
b)将centos2备机升级为Primary主机,命令如下所示:
[root@centos2 /># drbdadm primary r0
[root@centos2 /># cat /proc/drbd
1: cs:Connected st:Primary/Secondary ds:UpToDate/UpToDate C r—
现在备机就成功转为主机了。由于centos2上面也有完整的数据,所以整个切换过程不会发生数据丢失的现象,保证了数据的高可用性。
DRBD+Heartbeat+NFS高可用文件服务器的整个构建过程还是比较复杂的,这里有个建议:先在局域网或VMware环境下将整个过程多测试几次,这样大家自然而然就会清楚其中的逻辑顺序了。大家也可以像笔者一样将这些操作步骤形成工作文档,这样,在线上环境中实施时会非常容易,逐步照做就行了。DRBD也是现在很流行的技术,很多互联网公司将其作为高可用文件服务器方案,不仅如此,DRBD+Heartbeat也适合做生产环境下的高可用MySQL服务(这个也是MySQL官方推荐的),所以推荐大家掌握DRBD+Heartbeat+NFS的配置方法。