共享数据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端进行重新挂载,否则还是会出现失效句柄

 

posted @ 2021-09-26 12:35  D-LXT  阅读(768)  评论(0编辑  收藏  举报