Title

搭建nfs高可用集群、keepalived、rsync、inotify

keepalived设置为非抢占模式

keepalive部署这里就不做详述了

keepalived要设置为非抢占模式

1、两个节点的state都必须配置为BACKUP

2、两个节点都在vrrp_instance中添加nopreempt参数(其实优先级高的配置nopreempt参数即可)

3、其中一个节点的优先级必须要高于另外一个节点的优先级

两台服务器都启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。   

注意:要使nopreempt参数起作用,初始状态不能是MASTER

配置非抢占模式的Keepalived

master的配置文件如下

cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
     router_id LB1                    #keepalived服务器的路由标识,用于标识机器的,默认值是主机名
     vrrp_skip_check_adv_addr           #保持默认参数
     vrrp_strict                         #保持默认参数
     vrrp_garp_interval 0         #保持默认参数
     vrrp_gna_interval 0          #保持默认参数
}

vrrp_instance VI_1 {              #VT_1是实例名,可以自定义,建议主备的实例名保持一致,让人一眼就知道这两个是一对的
      state BACKUP                #配置为BACKUP,因为我们要用非抢占模式
      interface ens33               # vip绑定的网卡
      virtual_router_id 51         #虚拟路由id,用于标识一个唯一的实例,master和backup该标识必须相同,用于表示他两是一组的
      nopreempt                      #配置为非抢占模式
      priority 100                      #优先级设为100,优先级用于确定谁具有vip,谁就是主节点
      advert_int 1                     #心跳包的时间间隔,默认就是1秒就发一次
      authentication {               #主备之间的认证信息
             auth_type PASS      #认证类型,默认PASS
             auth_pass 1111       #认证密码
       }
       virtual_ipaddress {
            192.168.118.100       #vip地址
       }
}

slave的配置文件如下

cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
     router_id LB2                    #keepalived服务器的路由标识,用于标识机器的,默认值是主机名
     vrrp_skip_check_adv_addr           #保持默认参数
     vrrp_strict                         #保持默认参数
     vrrp_garp_interval 0         #保持默认参数
     vrrp_gna_interval 0          #保持默认参数
}

vrrp_instance VI_1 {              #VT_1是实例名,可以自定义,建议主备的实例名保持一致,让人一眼就知道这两个是一对的
      state BACKUP                #配置为BACKUP,因为我们要用非抢占模式
      interface ens33               # vip绑定的网卡
      virtual_router_id 51         #虚拟路由id,用于标识一个唯一的实例,master和backup该标识必须相同,用于表示他两是一组的
      nopreempt                      #配置为非抢占模式
      priority 50                       #优先级设为100,优先级用于确定谁具有vip,谁就是主节点
      advert_int 1                     #心跳包的时间间隔,默认就是1秒就发一次
      authentication {               #主备之间的认证信息
             auth_type PASS      #认证类型,默认PASS
             auth_pass 1111       #认证密码
       }
       virtual_ipaddress {
            192.168.118.100       #vip地址
       }
}

现在,我们配置了两个节点,这两个节点state指定的都是BACKUP,同时,其中一个优先级高于一个节点,优先级高的节点配置了 nopreempt参数表示非抢占模式

 

部署NFS

Master、Slave节点安装nfs

yum -y install nfs-utils rpcbind

编辑nfs配置

echo "/data *(rw,async,no_root_squash)" >>/etc/exports

启动服务

systemctl enable --now nfs-server

systemctl enable --now rpcbind

 验证

showmount -e 10.50.195.2      (master)

showmount -e 10.50.195.3      (slave)

 

部署Rsync+Inofity

Master节点配置rsyncd.conf

yum install -y rsync inotify-tools

配置rsync的配置文件

vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
port = 873
hosts allow = 10.10.203.0/24
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3

[master_nfs]
path = /data/nfs/
comment = master_nfs
ignore errors
read only = no
list = no
auth users = nfs
secrets file = /opt/rsync_salve.pass

编辑密码和用户文件(格式为"用户名:密码")

vim /opt/rsync_salve.pass

nfs:nfs123

编辑同步文件

 该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是nfs:nfs123,则主服务器同步密码写nfs123,反之,同理

vim /opt/rsync.pass
nfs123

 设置文件执行权限

chmod 600 /opt/rsync_salve.pass
chmod 600 /opt/rsync.pass

启动服务

systemctl enable --now rsyncd

Slave节点配置rsyncd.conf

yum install -y rsync inotify-tools

编辑rsyncd配置文件,只需将master节点/etc/rsyncd.conf配置中[master_nfs]改成[slave_nfs]即可

vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = no
port = 873
hosts allow = 10.10.203.0/24
max connections = 0
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
log format = %t %a %m %f %b
transfer logging = yes
syslog facility = local3

 

[slave_nfs]
path = /data/nfs/
comment = master_nfs
ignore errors
read only = no
list = no
auth users = nfs
secrets file = /opt/rsync_salve.pass

 

既然是高可用架构,那么不仅仅Master向Slave同步,Slave也会向Master节点同步数据
编辑密码和用户文件

vim /opt/rsync_salve.pass
nfs:nfs123 

编辑同步密码

该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是nfs:nfs123,则主服务器同步密码写nfs123,反之,同理

vim /opt/rsync.pass

nfs123

 设置文件执行权限

chmod 600 /opt/rsync_salve.pass
chmod 600 /opt/rsync.pass

启动服务

systemctl enable --now rsyncd

验证

手动验证下Master节点NFS数据同步到Slave节点,在Master节点的NFS共享目录下创建测试数据
mkdir /data/nfs/test
touch /data/nfs/{a,b}

 

手动同步Master节点的NFS共享目录数据到Slave节点的NFS共享目录下
rsync -avzp --delete /data/nfs nfs@slaveIP::slave_nfs --password-file=/opt/rsync.pass

到Slave节点查看是否同步

ls /data/nfs



设置Rsync+Inotify自动同步机制

Master节点配置Inotify自动同步

创建rsync+Inotify脚本目录
mkdir -p /usr/local/nfs_rsync/

编写自动同步脚本

vim /usr/local/nfs_rsync/rsync_inotify.sh
#!/bin/bash
host=10.10.203.167 #修改为slave真实IP
src=/data/nfs/
des=slave_nfs
password=/opt/rsync.pass
user=nfs
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

配置systemctl 管理自动同步脚本
- 编写systemctl启动脚本

vim /usr/local/nfs_rsync/rsync_inotify_start.sh
#!/bin/bash
nohup=/usr/bin/nohup
nohup sh /usr/local/nfs_rsync/rsync_inotify.sh >> /var/log/rsynch.log 2>&1 &

- 编写systemctl停止脚本

vim /usr/local/nfs_rsync/rsync_inotify_stop.sh
#!/bin/bash
for i in `ps -ef | grep rsync_inotify.sh | awk '{print $2}'`
do
kill -9 $i
done

- 编写systemctl管理程序

vim /usr/lib/systemd/system/nfs_rsync.service
[Unit]
Description=rsync_inotify service
Documentation=This is a Minio Service.
[Service]
Type=forking
TimeoutStartSec=10
WorkingDirectory=/usr/local/nfs_rsync
User=root
Group=root
Restart=on-failure
RestartSec=15s
ExecStart=/usr/local/nfs_rsync/rsync_inotify_start.sh
ExecStop=/usr/local/nfs_rsync/rsync_inotify_stop.sh

 

[Install]
WantedBy=multi-user.target

赋予可执行权限

chmod +x /usr/local/nfs_rsync/*

- 启动Inotify程序

systemctl enable --now nfs_rsync.service

 

Slave节点配置Inotify自动同步

在Slave节点编写自动同步脚本

mkdir -p /usr/local/nfs_rsync/

vim /usr/local/nfs_rsync/rsync_inotify.sh
#!/bin/bash
host=10.10.203.180 #修改为master真实IP
src=/data/nfs/
des=master_nfs
password=/opt/rsync.pass
user=nfs
inotifywait=/usr/bin/inotifywait
$inotifywait -mrq --timefmt '%Y%m%d %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read files ;do
rsync -avzP --delete --timeout=100 --password-file=${password} $src $user@$host::$des
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done

配置systemctl 管理自动同步脚本
- 编写systemctl启动脚本

vim /usr/local/nfs_rsync/rsync_inotify_start.sh

#!/bin/bash

nohup=/usr/bin/nohup
nohup sh /usr/local/nfs_rsync/rsync_inotify.sh >> /var/log/rsynch.log 2>&1 &


- 编写systemctl停止脚本

vim /usr/local/nfs_rsync/rsync_inotify_stop.sh

#!/bin/bash
for i in `ps -ef | grep rsync_inotify.sh | awk '{print $2}'`
do
kill -9 $i
done


- 编写systemctl管理程序

 

vim /usr/lib/systemd/system/nfs_rsync.service
[Unit]
Description=rsync_inotify service
Documentation=This is a Minio Service.
[Service]
Type=forking
TimeoutStartSec=10
WorkingDirectory=/usr/local/nfs_rsync
User=root
Group=root
Restart=on-failure
RestartSec=15s
ExecStart=/usr/local/nfs_rsync/rsync_inotify_start.sh
ExecStop=/usr/local/nfs_rsync/rsync_inotify_stop.sh

 

[Install]
WantedBy=multi-user.target

 

赋予可执行权限

chmod +x /usr/local/nfs_rsync/*

- 启动Inotify程序

systectl enable --now nfs_rsync.service

 

 

配置Keepalived VIP监控脚本(Master和Slave节点同样配置)

脚本逻辑剖析:
该vip_monitor.sh脚本主要是通过VIP以及inotifywait进程判断是否终止Rsync+Inotify自动同步机制,如果VIP和inotifywait进程不存在,那么就会停止Inotify程序,避免没有VIP节点的服务也发生同步

mkdir -p /usr/local/vip_monitor/

编写VIP监控脚本

vim /usr/local/vip_monitor/vip_monitor.sh

#!/bin/bash
while :

do

#指定VIP
  VIP_NUM=`ip addr|grep 10.10.203.166|wc -l`
  RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l`

  if [ ${VIP_NUM} == 0 ];then

     echo "VIP不在当前NFS节点服务器上" > /tmp/1.log
     if [ ${RSYNC_INOTIRY_NUM} != 0 ];then

          systemctl stop nfs_rsync.service

     fi

  else

     echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
     systemctl start nfs_rsync.service

  fi

  sleep 20

done

配置systemctl管理VIP监控脚本
- 编写systemctl启动脚本

vim /usr/local/vip_monitor/vip_monitor_start.sh
#!/bin/bash
nohup=/usr/bin/nohup
$nohup sh /usr/local/vip_monitor/vip_monitor.sh >> /var/log/vip_monitor.log 2>&1 &

- 编写systemctl停止脚本

vim /usr/local/vip_monitor/vip_monitor_stop.sh
#!/bin/bash
ps -ef | grep vip_monitor.sh | grep -v "grep" | awk '{print $2}' | xargs kill -9

- 编写systemctl管理程序

vim /usr/lib/systemd/system/vip_monitor.service
[Unit]
Description=rsync_inotify service
Documentation=This is a Minio Service.

[Service]
Type=forking
TimeoutStartSec=10
WorkingDirectory=/usr/local/vip_monitor
User=root
Group=root
Restart=on-failure
RestartSec=15s
ExecStart=/usr/local/vip_monitor/vip_monitor_start.sh
ExecStop=/usr/local/vip_monitor/vip_monitor_stop.sh

[Install]
WantedBy=multi-user.target

赋予可执行权限

chmod +x /usr/local/vip_monitor/*

启动Inotify程序

systemctl enable vip_monitor.service --now

 

保证vip_monitor.sh监控脚本的进程一定要存在

posted @ 2024-06-21 18:12  Esurts~  阅读(646)  评论(0)    收藏  举报