构建Heartbeat+DRBD+NFS高可用文件共享存储
DRBD的介绍:
Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。
数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)
工具: drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令, drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用 drbdmeta:管理META数据结构,平时很少直接用。 在DRBD中,资源是特指某复制的存储设备的所有方面。包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信) 每个资源有个角色,是Primary或Secondary,下面简称“主”和“备” 主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。 备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。 角色可以改变。
DRBD功能
单主模式:典型的高可靠性集群方案。 复主模式:需要采用共享cluster文件系统,如GFS和OCFS2。用于需要从2个节点并发访问数据的场合,需要特别配置。 复制模式:3种模式: 协议A:异步复制协议。本地写成功后立即返回,数据放在发送buffer中,可能丢失。 协议B:内存同步(半同步)复制协议。本地写成功并将数据发送到对方后立即返回,如果双机掉电,数据可能丢失。 协议C:同步复制协议。本地和对方写成功确认后返回。如果双机掉电或磁盘同时损坏,则数据可能丢失。 一般用协议C。选择协议将影响流量,从而影响网络时延。 有效的同步:按线性而不是当初写的顺序同步块。同步损坏时间内的不一致数据。 在线的设备检验:一端顺序计算底层存储,得到一个数字,传给另一端,另一端也计算,如果不一致,则稍后进行同步。建议一周或一月一次。 复制过程的一致性检验:加密后,对方若不一致则要求重传。防止网卡、缓冲等问题导致位丢失、覆盖等错误。 Split brain:当网络出现暂时性故障,导致两端都自己提升为Primary。两端再次连通时,可以选择email通知,建议手工处理这种情况。 当数据写在缓冲区里,没有真正写到磁盘上时,系统崩溃会导致数据丢失。而disk flush是指将数据真正写到磁盘上后才返回。 有些带电池的硬盘控制器,如带电池的带点出Dell PERC Raid卡,不但自带缓存而且自带电池,会在系统意外断电或者崩溃后将最后的数据写入磁盘,对这类控制器,可以使用disk flush,从而在保证性能的前提下提高了数据的安全性。 磁盘错误处理策略: 传递给上层:可能造成文件系统remounting成只读,不推荐。 对上层屏蔽:用另一端的相应块进行读写,应用不中断。可以在任何方便的时候再切换。 不一致的(inconsistent)数据:不能以任何方式访问和使用的数据。如正在同步时的目标节点数据,这些数据不能识别,不能mount,甚至不能通过磁盘的自动检测。 过期的(outdated)数据:在备机上的数据,与主机一致,但不需要同步。如主备机网络中断后,备机上的数据就是过期的。 DRBD有接口允许应用程序在网络中断时将备机数据标识为过期的。DRBD拒绝将这个节点提升为主角色。这些管理接口在Heartbeat框架上得到完整实现。 一旦过期资源的复制链接恢复,他的过期标志自动清除,接着进行后台同步。
工作原理
在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵.因为数据同时存在于本地主机和远程主机上, 切换时,远程主机只要使用它上面的那份备份数据,就可以继续进行服务了
注意: 主机名一定要设置,hosts和hostname 分区要单独的分区,而且是没有格式化的 文件系统只能同时挂载一个,而且是在主节点进行,格式化也只能是在主节点
配置步骤:
一、DRBD的实现
1.配置主机名和host文件
[root@localhost ~]# vim /etc/sysconfig/network
hostname masternfs
hostname slavenfs (主机名立即生效)
[root@masternfs resource.d]# vim /etc/hosts
192.168.1.100 masternfs
192.168.1.200 slavenfs
[root@localhost ~]# scp /etc/hosts 192.168.1.200:/etc/
2.新建磁盘分区
fdisk -l (查看一下)
fdisk /dev/sdb (分区)(分区步骤简略)
partprobe /dev/sdb (使分区生效)
cat /proc/partitions (查看分区)
3.安装drbd的软件包(需要在网上下载软件包,http://mirrors.163.com)
[root@masternfs ~]# rpm -ivh drbd83-8.3.12-1.el5.centos.i386.rpm (主的软件包)
[root@masternfs ~]# rpm -ivh kmod-drbd83-8.3.12-1.el5.centos.i686.rpm --force --nodeps (模块的支持,安装时需要解决依赖关系)
[root@slavenfs ~]# rpm -e drbd83-8.3.8-1.el5.centos (如何卸载软件包)
[root@slavenfs ~]# scp masternfs:*.rpm ./ (拷贝到另一个设备上安装)
4.编辑配置参数,可以查看安装后的文件包
[root@masternfs ~]# vim /etc/drbd.conf (编辑这个主配置参数)
:r /usr/share/doc/drbd83-8.3.12/drbd.conf (读取这个文件夹)
[root@masternfs ~]# cp -f /usr/share/doc/drbd83*/drbd.conf /etc/ (不然同步的时候会出错)
cp -f /usr/share/doc/drbd83*/drbd.conf /etc/(把配置文件复制到/etc下)
[root@masternfs ~]# cd /etc/drbd.d/ (主配置目录)
[root@masternfs drbd.d]# ll
总计 4
-rwxr-xr-x 1 root root 1418 2012-01-29 global_common.conf
cp global_common.conf global_common.conf.bak (备份一下,如果配置出错,可以改)
[root@masternfs drbd.d]# vim global_common.conf (拷贝一下编辑好的)
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;
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;
}
}
[root@masternfs drbd.d]# vim web.res(此网页是自己要创建的后缀要是.res,此网页是定义资源的)
vim web.res
resource web {
on masternfs{
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.100:7789;
meta-disk internal;
}
on slavenfs {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.1.200:7789;
meta-disk internal;
}
}
5.配置参数完成,拷贝到另一个机器上
[root@masternfs drbd.d]# scp /etc/drbd.d/* slavenfs:/etc/drbd.d/ (拷贝资源文件和公共的文件)
[root@masternfs drbd.d]# scp /etc/drbd.conf slavenfs:/etc/ (拷贝主配置文件)
6.drbd作为服务需要启动,但启动之前要同步才能启动。
[root@masternfs drbd.d]# drbdadm create-md web (同步两个节点都要执行)
Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created. (提示成功)
7.开启服务就连接上了
[root@slavenfs ~]# service drbd start (两边的同时)
[root@masternfs drbd.d]# cat /proc/drbd drbd-overview (两种方式查看设备启动的状态)
0:web Connected Secondary/Secondary Inconsistent/Inconsistent C r-----
8.把节点一作为一个主设备
[root@masternfs drbd.d]# drbdadm -- --overwrite-data-of-peer primary web (设置为主的)
9.在主设备上格式化文件系统 -L 是改卷标的可不加
[root@masternfs drbd.d]# mkfs -t ext3 -L drbhua /dev/drbd0
10.新建挂载点,挂载上去
[root@masternfs drbd.d]# mkdir /mnt/hua/
[root@masternfs drbd.d]# mount /dev/drbd0 /mnt/hua/
[root@masternfs drbd.d]# cd /mnt/hua/
[root@masternfs hua]# ll
总计 16
drwx------ 2 root root 16384 12-30 22:24 lost+found
[root@masternfs hua]# cp /etc/passwd ./ (拷贝一个文件用于测试,)
11.测试,需要把节点二备份的变成主的,则需要先把主的变成备份的
[root@masternfs hua]# umount /mnt/hua/ (需要先卸载才能变成备份的)
[root@masternfs ~]# drbdadm secondary web (变成备份的)
12.节点二上变成主的
[root@slavenfs ~]# drbdadm primary web (另一个)
[root@slavenfs ~]# mount /dev/drbd0 /mnt/hua/
[root@slavenfs ~]# cd /mnt/hua/ (进去查看可以查看文件已经有了)
[root@slavenfs hua]# ll
total 20
drwx------ 2 root root 16384 Dec 30 2012 lost+found
-rw-r--r-- 1 root root 1553 Dec 30 2012 passwd (文件已经存在)
二.NFS上的配置
1.安装nfs软件,略
2.编辑共享的文件,两节点都做下面的配置
[root@masternfs ~]# vim /etc/exports
/web *(rw) (编辑的内容)
[root@masternfs ~]# service nfs start
[root@masternfs ~]# showmount -e slavenfs (两边都配置完后,查看一下共享的文件是否已经可以看到)
[root@masternfs ~]# vim /etc/init.d/nfs (把这个文件的值改一下)
122 行 killproc nfsd -9
#将/etc/init.d/nfs 脚本中的stop 部分中的killproc
#nfsd -2 修改为 -9
三、heartbeat的安装配置
1实现heartbeat高可用需要一些软件实现,需要安装上去
[root@hua2 ~]# mount /dev/cdrom /mnt/cdrom/
[root@hua1 ~]# yum localinstall heartbeat-2.1.4-9.el5.i386.rpm heartbeat-pils-2.1.4-10.el5.i386.rpm heartbeat-stonith-2.1.4-10.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm libnet-1.1.4-3.el5.i386.rpm --nogpgcheck (localinstall本地安装,--nogpgcheck,无签名检测)
2.查看
[root@hua1 ~]# rpm -pql heartbeat-2.1.4-9.el5.i386.rpm (查看解压后的文件夹有那些。)
[root@hua1 ~]# cd /etc/ha.d/ (这个目录是heartbeat的主配置目录)
[root@hua1 ha.d]# cd /usr/share/doc/heartbeat-2.1.4/ (安装后的配置文件)
3.[root@hua1 heartbeat-2.1.4]# cp ha.cf authkeys haresources /etc/ha.d/ (把配置文件拷贝过来)
4.[root@hua1 ha.d]# vim ha.cf (编辑这个心跳文件参数,编辑如下)
ucast eth0 192.168.1.100 (对方的ip地址,另一台写1.200)
auto_failback off
213行 node masternfs
214 行node slavenfs (两个节点的地址)
5)[root@hua1 ~]# dd if=/dev/random bs=512 count=1 |openssl md5 (随机产生一个参数用md5加密)
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0.000308478 seconds, 415 kB/s
9bf2f23aae3a63c16ea681295ffd7666
6)[root@hua1 ha.d]# vim authkeys (编辑认证文件)
auth 3
3 md5 9bf2f23aae3a63c16ea681295ffd7666
[root@hua1 ha.d]# chmod 600 authkeys (改变它的权限为600,不然重启不成功)
7.配置资源文件,把参数直接追加进去了
echo "masternfs IPaddr::192.168.1.150/24/eth0 drbddisk::web Filesystem::/dev/drbd0::/web::ext3 killnfsd" >> haresources
解释:192.168.1.150,是虚拟ip地址,/web是共享的文件
8.还需要创建一个文件关于nfs的,要受到heartbeat的控制
[root@masternfs ha.d]# cd /etc/ha.d/resource.d/
[root@masternfs resource.d]# touch killnfsd
chmod 755 /etc/ha.d/resource.d/killnfsd (改变它的权限)
echo "killall -9 nfsd; /etc/init.d/nfs restart; exit 0 " >> /etc/ha.d/resource.d/killnfsd (把参数追加上去)
8.把配置拷贝到节点二上去,唯一改变的是心跳网卡地址
9.启动heartbeat服务,两边都启动
service heartbeat start
chkconfig heartbeat on
10.查看是主节点还是从节点,如下图所示,当heartbeats 停止时主设备变成了备份的,而另一端变成了主的
11.拷贝文件验证
[root@node2 web]# ls
inittab lost+found--------验证此时文件仍然存在
12.ifconfig 查看网卡,发现多了一个,虚拟网卡,主要是把资源征用了