在上一章中探讨了怎么实现客户端的自动挂载,这章主要是探讨另外一个更重要的话题,实现nfs的高可用。
服务器难免会遇到意外宕机的情况,如果服务端出现故障,那么客户端挂载的目录将不可用,如果这个目录是挂载给nginx作为图片资源,那么前端就无法访问了。
所以我们需要有一个备用服务器,但是这时就有两个ip了,那么客户端究竟挂载那个ip呢?好像都不行。因为我们并不知道哪个服务器会挂,或者说,直接挂载某个ip,如果该服务器挂了,如何实现切换,又是一个难题。
这时就需要用到keepalived工具了,它会为我们创建一个虚拟IP,我们只需要挂载这个IP即可,该ip会首先绑定到主服务器上,如果主服务器一旦宕机,则会漂移到备用服务器上,而客户端挂载的还是虚拟ip不变。
概念图:

B服务器一旦挂了,vip则漂移到C服务上,如下:

具体实现:
1. 后端两台服务器均部署keepalived:
B与C均执行以下命令:
yum install keepalived -y
2. 备份原配置文件,然后修改配置文件:
B服务器:
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from lutixia@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nfs {
script "/data/sh/check_nfs.sh"
interval 2
weight 2
}
# VIP1
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id 51
priority 90
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.200/24 label ens32:0
}
track_script {
check_nfs
}
}
C服务器:
C服务器配置与B基本一致,将MASTER修改为BACKUP,将优先级修改为80或者小于90的数字即可。
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from lutixia@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nfs {
script "/data/sh/check_nfs.sh"
interval 2
weight 2
}
# VIP1
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id 51
priority 80
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.200/24 label ens32:0
}
track_script {
check_nfs
}
}
3. B与C服务器均创建用于检测nfs服务是否存在的脚本:
#!/bin/bash
#by lutixia
##############
killall -0 nfsd
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
4. 启动rpcbind,nfs,keepalived服务:
systemctl start rpcbind && systemctl start nfs && systemctl start keepalived
ps:这三个服务启动顺序不要搞错了。
5. 在master服务器上查看vip:

6. 将master的nfs服务关掉,查看vip,这时vip会漂移到backup服务器上:
master服务器的ip:

backup服务器的IP:

到这里说明vip已经可以正常漂移,我们只需要在nfs客户端挂载vip即可。
7. 客户端挂载目录,然后创建如下脚本:
挂载:
mount -t nfs -o soft,timeo=10 192.168.0.200:/data/lutixia /mnt/nfs
推荐使用软挂载,默认是硬挂载。使用软挂载,服务端宕机,不会一直阻塞。
检测脚本:
#!/bin/bash
#by lutixia
###############
while true;do
ls /mnt/nfs &> /dev/null
if [ $? -ne 0 ];then
umount -l /mnt/nfs && mount -t nfs -o soft,timeo=10 192.168.0.200:/data/lutixia /mnt/nfs
fi
sleep 1
done
ps:如果客户端已经挂载了,服务端某台服务器宕机了,即使vip切换了,但是还是会报错,以前失效的挂载连接还在。所以需要卸载,重新挂载一次,这个脚本会每秒检测一次。
获取文章更新,以及常用软件,可以关注公众号: 笨办法学linux

网友评论