共享数据NFS双机热备
实验标准
(1)解决了nfs单点故障的问题
(2)使用nfs+keepalived做了主备设置,保证服务端挂载的数据一直能对外提供服务
(3)通过rsync+inotify实现了主备间的共享目录数据的实时进行同步
(4)nfs上的共享目录使用的是LVM管理,使共享目录具有扩展性
实验环境
服务器 |
IP |
操作系统 |
安装的工具 |
master主机 (2块硬盘) |
192.168.150.5 |
Centos 7 |
keepalived、nfs-utils、rpcbind、rsync 、inotify-tools |
backup主机 (2块硬盘) |
192.168.150.10 |
Centos 7 |
keepalived、nfs-utils、rpcbind、rsync 、inotify-tools |
Apache服务器 |
192.168.150.15 |
Centos 7 |
httpd |
VIP:192.168.150.200 |
配置主备(nfs两台主机)
1. 准备主机基础环境
systemctl stop firewalld
setenforce 0
#master服务器
hostnamectl set-hostname master
su -
#backup服务器
hostnamectl set-hostname backup
su -
2. 主(备)服务器安装keepalived服务
yum -y install keepalived.x86_64
3. 配置keepalived配置文件
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak #先做一个备份
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { #定义全局参数
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1 #邮件地址改为指向本地
smtp_connect_timeout 30
router_id NFS_01 #服务器名称,主备不一致,这里主设置了NFS_01,备为NFS_02
} #后面为严格遵守VRRP协议内容删除注释即可
vrrp_instance VI_1 { #定义VRRP热备实例参数
state MASTER
interface ens33 #定义承载VIP的物理网卡
virtual_router_id 51 #虚拟路由ID号,主备要设置一致
priority 100 #设置优先级,大的为master,主为100,备设置了90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.150.200 #指定群集VIP
}
}
#后面的参数为群集工作模式,并不需要该群集提供直接提供服务,所以可以直接删除
systemctl enable --now keepalived.service #在两个服务器直接启动服务并开机自启
#在主服务器查看是否出现VIP
[root@master ~]# ip a
#需要验证是否完成主备,断开master服务器
[root@master ~]# systemctl stop keepalived.service
#在备份服务器上查看VIP是否漂移过去,验证成功后在重启主服务器的keepalived服务VIP则会继续回到master上
[root@backup ~]# ip a
[root@master ~]# systemctl start keepalived.service
主备服务器使用LVM创建共享目录(主备一致)
1. 设置新的磁盘并添加为逻辑卷
fdisk /dev/sdb
n --->p ---> 一路回车即可
t 设置类型 输入8e 改为LVM类型 输入w 保存退出
[root@master ~]# pvcreate /dev/sdb1 #将新创建的磁盘设为物理卷
Physical volume "/dev/sdb1" successfully created.
[root@master ~]# vgcreate aaa /dev/sdb1 #将物理卷添加到aaa卷组里
Volume group "aaa" successfully created
[root@master ~]# lvcreate -L 500M -n aaa01 aaa #从aaa卷组中创建逻辑卷aaa01并给他500M
Logical volume "aaa01" created.
[root@master ~]# mkfs.xfs /dev/aaa/aaa01 #设置XFS格式并且格式化
2. 创建目录并且挂载使用逻辑卷
mkdir /html mount /dev/aaa/aaa01 /html/ #挂载到自己创建的/html/目录下 df -h #设置开机自动挂载 blkid #查看磁盘的UUID vim /etc/fstab UUID=查询到的UUID /html xfs defaults 0 0 mount -a
主备服务器资源实时同步设置
1. 在backup服务器配置rsync规则
rpm -q rsync #检查是否安装rsync,没有yum安装
cp /etc/rsyncd.conf /etc/rsyncd.conf.bak
vim /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode
# See rsyncd.conf man page for more options.
# configuration example:
log file = /var/log/rsyncd.log #定义全局参数
pid file = /var/run/rsyncd.pid
port 879
[aaa] #定义一个名为aaa的模块
path = /html
comment = This is web home page
uid = nobody
gid = nobody
use chroot = true
read only = no #需要设置不只读
hosts allow = 192.168.150.0/24
auth users = backup #授权的用户
secrets file = /etc/rsyncd_users.db #存放账户信息的数据文件
vim /etc/rsyncd_users.db #创建账号信息文件
backup:123456
chmod 600 /etc/rsyncd_users.db
systemctl enable --now rsyncd
netstat -anpt | grep rsync
chmod 777 /html/ #一定要给予目录相应的权限上行同步
2. 在master服务器上安装rsync和inotify-tools,对目录进行监控实时同步
#可以根据需求调整inotify 内核参数
rpm -q rsync
#将inotify-tools传到opt目录中
tar zxvf inotify-tools-3.14.tar.gz -C /opt/
cd /opt/inotify-tools-3.14
./configure
make && make install
#先创建一个文件试验上行同步是否正常
cd /html
chmod 777 /html/
mkdir 123
rsync -avz /html/ backup@192.168.150.10::aaa
#检查一下监控操作是否正常使用,使用后在开启一个终端进行操作查看监控显示
inotifywait -mrq -e modify,create,move,delete /html
3. 在master服务器编写自动上行同步脚本
vim /opt/aaa.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /html"
RSYNC_CMD="rsync -azH --delete --password-file=/opt/server.pass /html/ backup@192.168.150.10::aaa/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ];then
$RSYNC_CMD
fi
done
#创建密码文件
echo "123456" >/opt/server.pass
chmod 600 /opt/server.pass
#给予脚本权限可以添加到开机命令执行
chmod +x /opt/aaa.sh
chmod +x /etc/rc.d/rc.local
echo '/opt/aaa.sh' >>/etc/rc.d/rc.local
#执行脚本后在复制一个终端验证脚本效果
cd /opt
./aaa.sh & #可以直接在后台启动
#随便在目录下创建一个文件
cd /html
touch 155
jobs #查看后台启动的进程,可以fg 1 直接将它调入到前台,但是使用ctrl+C则会将进程终止
配置NFS共享目录
1. 主备服务器安装rpcbind和nfs-utils,并设置挂载目录
yum -y install nfs-utils rpcbind
chmod 777 /html
vim /etc/exports
/html 192.168.150.0/24(rw,sync,no_root_squash)
systemctl start rpcbind #先启动rpcbind
systemctl start nfs
systemctl enable rpcbind
systemctl enable nfs
showmount -e
2. apache服务器安装web服务挂载共享目录
yum -y install httpd
#使用虚拟IP查看
showmount -e 192.168.150.200
mount -t nfs 192.168.150.200:/html /var/www/html/
systemctl start httpd
#设置自动挂载
vim /etc/fstab
192.168.150.200:/html /var/www/html nfs defaults,_netdev 0 0
3. 编写首页文件,测试同步效果
#在master主机上编写首页文件
vim /var/www/html/index.html
<h1>this is nfs web</h1>
完成主备效果
master主机配置监控脚本
#在master服务器进行后台监控,如果检测到nfs服务器断开试图重启,如果重启失败则会手动关闭keepalivced服务进行主备切换,并且都有相应的提示
#ps -C nfsd --no-header | wc -l该命令,ps显示进程状态,-C按照名称nfsd进行选择进程,--no-header表示
不打印标题行,使用wc -l命令统计行数,如果为0则代表nfs并未运行
[root@master ~]# vim nfs_check.sh #!/bin/bash while true do aaa=`ps -C nfsd --no-header | wc -l` if [ $aaa -eq 0 ];then systemctl restart nfs-server.service echo "nfs服务经过断开重启完成" sleep 1 if [ `ps -C nfsd --no-header | wc -l` -eq 0 ];then echo "nfs无法重启,将进行主备切换" systemctl stop keepalived.service
exit
fi fi done
#经实验发现如果nfs主服务器整个宕机进行了主备切换后,apache服务器上共享的目录会显示失效文件句柄,不能自动使用集群中备用服务器的共享目录,需要先将失效目录解挂载再重新挂载一遍才能正常使用群集里备份服务器共享的同名同数据的目录,所以在备份服务器编写一个脚本进行远程解挂切换
在backup服务器配置监控脚本
#首先与apache主机之间实现免密登录
ssh-keygen -t ecdsa #一直回车即可
ssh-copy-id 192.168.150.15 #只有一个密钥文件无需指定路径
#编写一个监控脚本
使用无限循环进行监控当发现backup主机承载了vip代表master主机完全宕机,则会进行远程登录,使用EOF免交互将远程登录后执行的解除挂载,重新加载自动挂载文件(如果没有添加自动挂载可以换位mount 临时挂载命令)挂载完成后登出,这一系列操作命令重定向输入到远程登录命令之后,完成后会在屏幕打印提示信息并结束该脚本运行
[root@backup ~]# vim vip_check.sh
#!/bin/bash
while true
do
ip a | grep 192.168.150.200 >> /dev/null
if [ $? -eq 0 ];then
ssh 192.168.150.15 > /dev/null <<EOF
umount -lf /var/www/html
mount -a
exit
EOF
echo "apache主机重新挂载完成"
exit
fi
done
chmod +x vip_check.sh
./vip_check.sh &
jobs #完成后该后台进程则结束
#将脚本放入后台执行,可以手动断开master的keepalived服务或者挂起master主机进行测试,如果发生重载则该进程会完成即退出,但如果master主机恢复正常后如果还想使用master主机挂载还是需要在apache端进行重新挂载,否则还是会出现失效句柄