Keepalived实现nfs高可用
Nfs_master服务器:172.20.26.167 (keepalived、nfs、sersync、rsync)
Nfs_salve服务器:172.20.26.198 (keepalived、nfs、rsync)
Nfs_client服务器:172.20.26.24 (nfs)
原理:两台机器上配置要一致,keepalived监控nfs进程,master上的nfs主进程宕掉无法启动时由slave主机上的nfs继续工作,master的数据备份到slave上,同时master和slave数据用rsync和sersync实时同步,保证数据的完整性。
部署keepalived服务
分别在172.20.26.167、172.20.26.198安装部署keepalived服务
yum install epel-release -y #安装epel 源
yum update -y #更新安装源
yum install psmisc -y #脚本中用到killall 命令,需要安装pamisc
yum install keepalived -y
vim /etc/keepalived/keepalived.conf #设置VIP地址为172.20.26.200,并增加chk_nginx 的脚本检测以及脚本追踪:
vrrp_script chk_nfs {
script "/data/sh/chk_nfs.sh"
interval 1
weight -20
}
track_script {
chk_nfs
}
notify_backup "/data/sh/notify_nfs.sh backup"
追踪上面所定义的chk_nfs,名字要与上面定义的一致。
非抢占模式:master和backup的state均设置为BACKUP,其次是master端配置nopreempt,backup不用配置。
两边keepalived服务都安装后,将配置文件拷贝到172.20.26.198服务器/etc/keepalived/目录下
scp /etc/keepalived/keepalived.conf [email protected]:/etc/keepalived/
vim /etc/keepalived/keepalived.conf
分别在172.20.26.167、172.20.26.198服务器上创建/data/sh目录及chk_nfs.sh脚本:
mkdir -p /data/sh #创建脚本目录
vim /data/sh/chk_nfs.sh #编写脚本文件
#!/bin/bash
killall -0 nfsd &>/dev/null
if [[ $? -ne 0]];then
pkill keepalived
fi
chmod +x /data/sh/chk_nfs.sh #授权执行权限
两台服务器启动keepalived服务,查看VIP地址在172.20.26.167服务器上
systemctl start keepalived
如果172.20.26.167上nfs服务sotp掉,随之nfs服务stop 掉,keepalived服务也会被pkill掉,VIP 将漂移到172.20.26.198服务器上, 即使172.20.26.167服务器上nfs服务和keepalived服务恢复,VIP也不抢回,继续保留在172.20.26.198服务器上,只有在172.20.26.198服务器上nfs服务down掉,随着nfs服务down掉,keepalived服务也被pkill 掉,VIP才会漂移回172.20.26.167服务器上。
上面配置文件中需要关注的是我们设置成非抢占模式,如果设置成抢占模式会在不断的切换主备时容易造成nfs数据丢失。
部署NFS服务
在nfs_master172.20.26.167、nfs_slave172.20.26.198、nfs_client172.20.26.24 设置免密登录
[root@node1 ~]# ssh-keygen #一路回车
[root@node1 ~]# ssh-copy-id 172.20.26.198 #输入172.20.26.198root密码,回车即可
[root@node1 ~]# ssh-copy-id 172.20.26.24 #输入172.20.26.24root密码,回车即可
在nfs_master172.20.26.167安装nfs-utils
yum install nfs-utils -y
#创建nfs共享目录
mkdir -p /nfs
#修改权限
chmod -R 777 /nfs
#编辑export文件
vim /etc/exports
/nfs 172.20.26.0/24(rw,no_root_squash,sync) #设置172.20.26.0网段的设备均可访问nfs目录
#配置生效
exportfs -r
#查看生效
exportfs
exportfs -rv
#启动rpcbind、nfs服务
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
#查看 RPC 服务的注册状况
rpcinfo -p localhost
#showmount测试
showmount -e 172.20.26.200
###由于只是测试,我们共享的这个/nfs目录默认是没有单独挂载硬盘的,生产环境下最好是给这个共享目录单独挂载一块硬盘或者单独的磁盘分区
在nfs_slave172.20.26.198服务器所有操作和master一致
yum install epel-release -y #安装epel 源
yum update -y #更新安装源
yum install nfs-utils -y
创建nfs共享目录
mkdir -p /nfs
#修改权限
chmod -R 777 /nfs
#编辑export文件
vim /etc/exports
/nfs 172.20.26.0/24(rw,no_root_squash,sync) 设置172.20.26.0网段的设备均可访问nfs目录
#配置生效
exportfs -r
#查看生效
exportfs
exportfs -rv
#启动rpcbind、nfs服务
systemctl start rpcbind && systemctl enable rpcbind
systemctl start nfs && systemctl enable nfs
#showmount测试
showmount -e 172.20.26.200
在客户端172.20.26.24上也安装nfs
yum install epel-release -y #安装epel 源
yum update -y #更新安装源
yum install nfs-utils -y
systemctl start rpcbind && systemctl enable rpcbind
mkdir -p /nfs #创建挂载点目录
在客户端172.20.26.24上挂载nfs_master172.20.26.167上的nfs共享目录
mount -t nfs 172.20.26.200:/nfs /nfs
在客户机上实现开机挂载,则需要编辑/etc/fstab
vim /etc/fstab
172.20.26.200:/nfs /nfs nfs defaults 0 0
mount -a #表示读取fstab 里的信息进行挂载
目前VIP在172.20.26.167服务器上,拷贝新文件到172.20.26.167服务器上nfs目录下,客户端172.20.26.24访问nfs共享目录正常。
部署172.20.26.167、172.20.26.198服务器上的rsync服务
在172.20.26.167安装sersync、rsync、inotify-tools
上传、安装 sersync
root@node1 /]# cd /usr/src
[root@node1 src]# rz
将sersync2.5.4_64bit_binary_stable_final.tar上传到172.20.26.167上,配置sersync服务
[root@node1 src]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
将解压出来的GNU-Linux-x86目录移到/usr/local/sersync
root@node1 src]# mv GNU-Linux-x86/ /usr/local/sersync
/usr/local/sersync下只有confxml.xml、sersync2两个文件,一个是配置文件、一个可执行文件。
[root@node1 sersync]# vim /usr/local/sersync/confxml.xml
将<fileSystem xfs="false"/> 改为 <fileSystem xfs="true"/>
Inotify 模块定义通知开始同步的条件:
<inotify>
<delete start="true"/> #开始删除的时候,默认为true
<createFolder start="true"/> #创建目录的时候,默认为true
<createFile start="true"/> #创建文件的时候,默认为false,这里改为“true”
<closeWrite start="true"/> #关闭写的时候,默认为true
<moveFrom start="true"/> #从---移动到的时候,默认为true
<moveTo start="true"/> #开始移动的时候,默认为true
<attrib start="false"/> #查询开始,默认为false
<modify start="false"/> #修改开始的时候,默认为false
</inotify>
将超时时间改为true
<timeout start="true" time="100"/><!-- timeout=100 -->
计划任务默认是false ,如果改为true,默认是600分钟做一次全量同步
<crontab start="false" schedule="600"><!--600mins-->
开启认证,配置使用rsync 和密码文件
<auth start="true" users="rsync" passwordfile="/etc/rsync.passwd"/>
保存退出
[root@node1 sersync]# ./sersync2 -d -r -o /usr/local/sersync/confxml.xml #启动sersync 服务
[root@node1 sersync]# echo "123456" >/etc/rsync.passwd #编辑密码文件
[root@node1 sersync]# chmod 600 /etc/rsync.passwd #修改rsync.passwd 文件的权限,其他人和组不可读写
[root@node1 ~]# yum install rsync inotify-tools -y
[root@node1 ~]# vim /etc/rsyncd.conf
systemctl start rsyncd #启动rsync服务
systemctl enable rsyncd #将rsync服务添加为开机启动
172.20.26.198服务器上安装 rsync inotify-tools
[root@node2 ~]# yum install rsync inotify-tools -y
[root@node2 ~]# vim /etc/rsyncd.conf
[root@node2 /]# echo "rsync:123456" >/etc/rsync.passwd #编辑密码文件
[root@node2 /]# chmod 600 /etc/rsync.passwd #修改rsync.passwd 文件的权限,其他人和组不可读写
[root@node2 /]# systemctl start rsyncd #启动rsync 服务
[root@node2 /]# systemctl enable rsyncd #设置开机启动rsync服务
现在我们在master节点172.20.26.167上手工同步一下,让slave172.20.26.198节点同步master的数据
rsync -av /nfs/ [email protected]::slave_nfs --password-file=/etc/rsync.passwd
客户端查看
我们验证两台nfs服务器数据实时数据同步
在172.20.26.167服务器上nfs目录下创建test0219.txt文件
客户端挂载VIP172.20.26.200访问正常
在客户端172.20.26.24服务器上执行卸载、重新挂载的脚本命令
mkdir -p /data/sh
vim /data/sh/nfs_remount.sh
#!/bin/bash
#by lqc
#2021-02
#############################
while true;do
ls /nfs &>/dev/null
if [ $? -ne 0 ];then
umount -l /nfs && mount -o soft,timeo=1 172.20.26.200:/nfs /nfs
fi
sleep 1
done
[root@node3 nfs]# nohup bash /data/sh/nfs_remount.sh &
将nfs_remount.sh脚本设置后台运行程序,并开机自启动,创建serverAutoRun.sh脚本:
vim /data/sh/serverAutoRun.sh
#!bash
nohup bash /data/sh/nfs_remount.sh >>/dev/null &
再把执行serverAutoRun.sh脚本命令写进/etc/rc.d/rc.local文件中
vim /etc/rc.local
nohup bash /data/sh/serverAutoRun.sh &
再将两个文件赋予可执行权限
chmod +x /data/sh/serverAutoRun.sh
chmod +x /etc/rc.local
重启客户端
我们在172.20.26.167服务器上stop 掉nfs服务,VIP 将漂移到172.20.26.198服务器上,客户端172.20.26.24可以正常访问挂载的nfs目录内容。
如果是抢占模式下,我们将172.20.26.167服务器上的nfs 启动,,172.20.26.198服务器卸载VIP,VIP漂移回172.20.26.167服务器上。
我们这里配置的是非抢占模式,即使将172.20.26.167服务器上的nfs 启动,VIP还是继续保留在172.20.26.198服务器上,客户端访问nfs目录正常。
我们将172.20.26.198服务器上的nfs服务stop掉,VIP将被卸载掉,将漂移到172.20,26.167服务器上
如果两次切换时客户端172.20.26.24当前访问目录在nfs目录下,则会提示无法打开目录,失效文件句柄,需要重新挂载,如果两次切换时客户端当前访问目录不在nfs目录下,则可以直接进入nfs目录,进行查阅挂载的目录文件。