nfs搭建热备搭建
keepalived+nfs+rsync
1、搭建nfs:nfs搭建
两台nfs服务器
2、安装keepalived
1)安装keepalived
yum -y install keepalived
2)Master节点的keepalived.conf配置
这里特别需要注意:
一定要设置keepalived为非抢占模式,如果设置成抢占模式会在不断的切换主备时容易造成NFS数据丢失。
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id nfs-kald #id可以随便设 } vrrp_script chk_nfs { script "/etc/keepalived/nfs_check.sh" #监控脚本 interval 2 weight -20 #keepalived部署了两台,所以设为20,如果三台就设为30 } vrrp_instance VI_1 { state BACKUP #两台主机都设为backup非抢占模式 interface ens192 #网卡名写自己的,不要照抄 virtual_router_id 51 priority 100 #master设为100,backup设为80,反正要比100小 advert_int 1 nopreempt #设置为非抢占模式必须要该参数 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nfs } virtual_ipaddress { 192.168.135.90 #虚拟ip } }
3)Slave节点的keepalived.conf配置
只需将priority参数项修改为80,其他配置的和master节点一样,脚本也一样。
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf_bak vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { router_id nfs-kald } vrrp_script chk_nfs { script "/etc/keepalived/nfs_check.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 nopreempt authentication { auth_type PASS auth_pass 1111 } track_script { chk_nfs } virtual_ipaddress { 192.168.135.90 } }
4)编辑nfs_check.sh监控脚本
vim /etc/keepalived/nfs_check.sh #!/bin/bash A=`ps -C nfsd --no-header | wc -l` if [ $A -eq 0 ];then systemctl restart nfs-server.service sleep 2 if [ `ps -C nfsd --no-header| wc -l` -eq 0 ];then pkill keepalived fi fi
设置脚本执行权限
chmod 755 /etc/keepalived/nfs_check.sh
5)启动keepalived服务
systemctl restart keepalived.service && systemctl enable keepalived.service
# 查看服务进程是否启动
ps -ef|grep keepalived
6)检查vip是否存在
在两台节点机器上执行
"ip addr"
命令查看vip,其中会在一台机器上产生vip地址。
ip addr|grep 192.168.135.90
inet 192.168.135.90/32 scope global ens192
测试vip地址要能被
ping
通
ping 192.168.135.90
PING 192.168.135.90 (192.168.135.90) 56(84) bytes of data.
64 bytes from 192.168.135.90: icmp_seq=1 ttl=64 time=0.148 ms
64 bytes from 192.168.135.90: icmp_seq=2 ttl=64 time=0.137 ms
64 bytes from 192.168.135.90: icmp_seq=3 ttl=64 time=0.151 ms
7)keepalived故障测试
停掉vip所在的Master节点机器上的keepalived服务后,发现vip会自动飘移到另一台Backup机器上才算测试成功。
当该Master节点的keepalived服务重新启动后,vip不会重新飘移回来。因为keepalived采用了非抢占模式。
如果keepalived设置为抢占模式,vip会在Master节点的keepalived重启恢复后自动飘回去,
但是这样一直来回切换可能会造成NFS数据不完整,因为这里必须设置成非抢占模式。
由于配置了nfs的nfs_check.sh监控脚本,所以当其中一台节点机器上的NFS服务宕停后会自动重启NFS。
如果NFS服务重启失败,则会自动关闭该节点机器上的keepalived服务,如果该节点有vip则会自动飘移到另外一台节点上。
3、安装部署Rsync+Inofity(Master和Slave两机器都要操作)
1)安装
rsync
和inotify
yum -y install rsync inotify-tools
2)Master节点机器配置rsyncd.conf
cp /etc/rsyncd.conf /etc/rsyncd.conf_bak vim /etc/rsyncd.conf uid = root gid = root use chroot = 0 port = 873 hosts allow = 192.168.135.0/24 #允许ip访问设置,可以指定ip或ip段 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_web] path = /data/k8s_storage comment = master_web ignore errors read only = no #是否允许客户端上传文件 list = no auth users = rsync #指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块 secrets file = /etc/rsyncd.passwd #保存密码和用户名文件,需要自己生成注:注释去掉否则会报认证失败
编辑密码和用户文件(格式为
"用户名:密码"
)
vim /etc/rsyncd.passwd rsync:123456
编辑同步密码(注意这个文件和上面的密码和用户文件路径不一样)
该文件内容只需要填写从服务器的密码,例如这里从服务器配的用户名密码都是
rsync
:123456,则主服务器则写123456一个就可以了
vim /opt/rsyncd.passwd 123456
设置文件执行权限
chmod 600 /etc/rsyncd.passwdchmod 600 /opt/rsyncd.passwd
启动服务
systemctl enable rsyncd && systemctl restart rsyncd
检查
rsync
服务进程是否启动
ps -ef|grep rsync
3)Slave节点机器配置rsyncd.conf
就把master主机
/etc/rsyncd
.conf配置文件里的[master_web]改成[slave_web]
其他都一样,密码文件也设为一样
cp /etc/rsyncd.conf /etc/rsyncd.conf_bak vim /etc/rsyncd.conf uid = root gid = root use chroot = 0 port = 873 hosts allow = 192.168.135.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_web] path = /data/k8s_storage comment = master_web ignore errors read only = no list = no auth users = rsync secrets file = /etc/rsyncd.passwd
编辑密码和用户文件(格式为
"用户名:密码"
)
vim /etc/rsyncd.passwd rsync:123456
编辑同步密码
vim /opt/rsyncd.passwd 123456
设置文件执行权限
chmod 600 /etc/rsyncd.passwdchmod 600 /opt/rsyncd.passwd
启动服务
systemctl enable rsyncd && systemctl restart rsyncd
检查
rsync
服务进程是否启动
ps -ef|grep rsync
4)手动验证下Master节点NFS数据同步到Slave节点
在Master节点的NFS共享目录下创建测试数据 cd /data/k8s_storage/mkdir /data/k8s_storage/zk echo 1>1.txt 手动同步Master节点的NFS共享目录数据到Slave节点的NFS共享目录下 # rsync -avzp --delete /data/k8s_storage/ rsync@192.168.135.35::slave_web --password-file=/opt/rsyncd.passwd 到Slave节点查看 # ls /data/k8s_storage/ 1.txt zk
上面rsync同步命令说明:
- /data/k8s_storage/ 是同步的NFS共享目录
- rsync@172.16.60.236::slave_web
- rsync 是Slave节点服务器的/etc/rsyncd.passwd文件中配置的用户名
- 172.16.60.236为Slave节点服务ip
- slave_web 为Slave服务器的rsyncd.conf中配置的同步模块名
- --password-file=/opt/rsyncd.passwd 是Master节点同步到Slave节点使用的密码文件,文件中配置的是Slave节点服务器的/etc/rsyncd.passwd文件中配置的密码
5)设置Rsync+Inotify自动同步
注意:不能设置Master和Slave节点同时执行rsync自动同步,即不能同时设置双向同步。因为Master节点将数据同步到Slave节点,如果Slave节点再将数据同步回到Master节点,这个就矛盾了。所以需要确保只有一方在执行自动同步到另一方的操作。方式就是判断当前节点服务器是否存在VIP,如存在VIP则自动同步数据到另一台节点上。如不存在VIP则不执行自动同步操作。
Master节点服务器操作
编写自动同步脚本/opt/rsync_inotify.sh
vi /opt/rsync_inotify.sh #!/bin/bash host=192.168.135.35 src=/data/k8s_storage/ des=slave_web password=/opt/rsyncd.passwd user=rsync 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
编写VIP监控脚本/opt/vip_monitor.sh
vi /opt/vip_monitor.sh
#!/bin/bash VIP_NUM=`ip addr|grep 244|wc -l` RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l` if [ ${VIP_NUM} -ne 0 ];then echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1 if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1 else echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1 nohup sh /opt/rsync_inotify.sh & fi else echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1 if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1 ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9 ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9 else echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1 fi fi
编写持续执行脚本/opt/rsync_monit.sh
vi /opt/rsync_monit.sh
#!/bin/bash while [ "1" = "1" ] do /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1 done
后台运行
chmod 755 /opt/rsync_inotify.sh chmod 755 /opt/vip_monitor.sh chmod 755 /opt/rsync_monit.sh nohup sh /opt/rsync_monit.sh &
开机自启
chmod +x /etc/rc.d/rc.local
echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local
Slave节点服务器操作
编写自动同步脚本/opt/rsync_inotify.sh
#!/bin/bash host=192.168.135.34 src=/data/k8s_storage/ des=master_web password=/opt/rsyncd.passwd user=rsync 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
编写VIP监控脚本/opt/vip_monitor.sh
#!/bin/bash VIP_NUM=`ip addr|grep 192.168.135.90|wc -l` RSYNC_INOTIRY_NUM=`ps -ef|grep /usr/bin/inotifywait|grep -v grep|wc -l` if [ ${VIP_NUM} -ne 0 ];then echo "VIP在当前NFS节点服务器上" >/dev/null 2>&1 if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then echo "rsync_inotify.sh脚本已经在后台执行中" >/dev/null 2>&1 else echo "需要在后台执行rsync_inotify.sh脚本" >/dev/null 2>&1 nohup sh /opt/rsync_inotify.sh & fi else echo "VIP不在当前NFS节点服务器上" >/dev/null 2>&1 if [ ${RSYNC_INOTIRY_NUM} -ne 0 ];then echo "需要关闭后台执行的rsync_inotify.sh脚本" >/dev/null 2>&1 ps -ef|grep rsync_inotify.sh|grep -v grep|awk '{print $2}'|xargs kill -9 ps -ef|grep inotifywait|grep -v grep|awk '{print $2}'|xargs kill -9 else echo "rsync_inotify.sh脚本当前未执行" >/dev/null 2>&1 fi fi
编写持续执行脚本/opt/rsync_monit.sh
#!/bin/bash while [ "1" = "1" ] do /bin/bash -x /opt/vip_monitor.sh >/dev/null 2>&1 done
后台运行
# chmod 755 /opt/rsync_inotify.sh # chmod 755 /opt/vip_monitor.sh # chmod 755 /opt/rsync_monit.sh # nohup sh /opt/rsync_monit.sh &
开机自启
chmod +x /etc/rc.d/rc.local echo "nohup sh /opt/rsync_monit.sh & " >> /etc/rc.d/rc.local
验证
systemctl stop keepalived
ip a
本文来自博客园,作者:zk01,转载请注明原文链接:https://www.cnblogs.com/zhangxiaokui/p/16043494.html