搭建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 ];thensystemctl stop nfs_rsync.service
fi
else
echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1
systemctl start nfs_rsync.servicefi
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

浙公网安备 33010602011771号