02架构 02 sersync nfs

前期准备

	#关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld
systemcel status firewalld
	#关闭 selinux 开机不启动
setenforce 0
getenforce
sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config

	#查看是否安装 nfs-utils rsync
	# nfs-utils	【为了让web可以使用showmount -e】
		rpcbind quota [nfs-utils 的依赖项,会自动安装]
	# rsync		【推送、拉取文件命令】
[root@nfs1 ~]# rpm -q nfs-utils rsync
nfs-utils-1.3.0-0.68.el7.1.x86_64
rsync-3.1.2-10.el7.x86_64
	#安装nfs-utils rsync
yum -y install nfs-utils rsync

1、创建统一用户www
groupadd www -g 666
useradd www -u 666 -g 666 -Ms /sbin/nologin

2、创建共享目录、目录授权
mkdir /data
chown www.www /data

rsync

1、rsync 选项

-a                          #归档模式传输, 等于-tropgDl
-v                          #详细模式输出, 打印速率, 文件数量等
-z                          #传输时进行压缩以提高效率

-r                          #递归传输目录及子目录,即目录下得所有目录都同样传输
-t                          #保持文件时间信息
-o                          #保持文件属主信息
-p                          #保持文件权限
-g                          #保持文件属组信息
-l                          #保留软连接
-D                          #保持设备文件信息

-L                          #保留软连接指向的目标文件
-P                          #显示同步的过程及传输时的进度等信息
-e                          #使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN           #指定排除不需要传输的文件模式
--exclude-from=file         #文件名所在的目录文件
--bwlimit=100               #限速传输,平均速率为100M
--partial                   #断点续传
--delete                    #让目标目录和源目录数据保持一致
--password-file=xxx         #使用密码文件

#查看可用模块
rsync bf@172.16.1.11::
#备份文件至服务器【推送】
rsync --password-file=/etc/rsync.passwd -avz /data bf@172.16.1.11::backup
#下载服务器的文件【拉取】
rsync --password-file=/etc/rsync.passwd -avz bf@172.16.1.11::backup /data

2、backup 主机【rsync 服务端】

1、下载安装rsync
yum -y install rsync

2、编辑rsync配置文件
cat > /etc/rsyncd.conf << EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = true
auth users = bf
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
path = /backup
comment = welcome to backup!
[data]
path = /data
EOF

---------------------------------------------------------------------------------
# rsync 配置文件内容注释
[root@backup ~]# vim /etc/rsyncd.conf
uid = www							#用户的uid,该用户不需要家目录和登陆
gid = www							#用户的组id
port = 873							#服务的端口
fake super = yes					#无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no						#不允许操作传输文件以外文件
max connections = 200				#最大连接数
timeout = 600						#超时时间
ignore errors						#忽略错误
read only = false					#开启只读权限
list = false						#是否允许查看模块信息
auth users = bf						#虚拟用户
secrets file = /etc/rsync.passwd	#密码文件
log file = /var/log/rsyncd.log		#日志文件
[backup]							#模块名称(随便写什么)
path = /backup						#模块名称对应的目录
comment = welcome to backup!		#备注
[data]								#第二个模块
path = /data						#第二个模块对应的目录
---------------------------------------------------------------------------------

3、根据配置文件
	建立密码文件【虚拟用户名和密码文件名都要和配置文件中一样,密码文件需要600权限】
echo bf:123456 > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
	建立备份目录【备份目录名要和配置文件中一样,且需要设置属主.属组为www】
mkdir /backup
chown -R www.www /backup

4、启动rsync服务并设置开机启动
systemctl enable rsyncd
systemctl start rsyncd

5、验证【2种方法都可以】
[root@backup ~]# netstat -lntp|grep 873
tcp        0      0 0.0.0.0:873     0.0.0.0:*        LISTEN      7409/rsync
tcp6       0      0 :::873          :::*             LISTEN      7409/rsync
[root@backup ~]# systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)		# 运行中
   Active: active (running) since Fri 2021-11-12 21:11:41 CST; 15h ago
......

3、nfs 主机【rsync 客户端】

1、下载安装rsync
yum -y install rsync

2、建立密码文件【密码文件需要600权限】
echo '123456' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

3、查看可用模块
rsync bf@172.16.1.11::

4、测试
rsync --password-file=/etc/rsync.passwd -avz /data bf@172.16.1.11::backup

测试报错注意事项:
	1> 查看服务端配置文件模块名	backup
	2> 查看服务端密码文件格式   bf:123456
	3> 服务端密码文件权限是否为 600
	4> 服务端rsyncd服务是否启动
	5> 服务端备份目录权限是否为 www.www
	6> 客户端密码文件权限是否为 600
	7> 客户端密码文件格式是否为 123456
	8> 防火墙,selinux是否关闭

定时备份脚本

客户端nfs、web01创建脚本目录、备份脚本和定时任务

1、创建脚本目录
	mkdir /scripts

2、编辑备份脚本
vim bf.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 	#定义环境变量

DIR=/backup											#定义变量
H=$(hostname)
IP=$(hostname -I | awk '{print $2}')
DATE=$(date +%F)
SRC=${DIR}/${H}_${IP}_${DATE}

mkdir -p $SRC										#创建备份目录格式为:主机名_ip_时间
tar zcf $SRC/conf.tar.gz /etc/rc.local /etc/fstab &>/dev/null	#在本地打包备份文件
md5sum $SRC/conf.tar.gz  > $SRC/flag_$DATE			#添加认证文件
export RSYNC_PASSWORD=123456						#设置rsync密码
rsync -az /backup/ bf@172.16.1.11::backup			#推送至备份服务器
find /backup/ -type d -mtime +7 | xargs rm -rf		#删除七天前的文件

3、设置定时任务
	crontab -e
	#定时推送备份文件【脚本名要和备份脚本名路径一致】
	0 17 * * * /bin/bash /scripts/bf.sh &>/dev/null

验证数据完整性并发送邮件

服务端验证数据完整性并发送邮件
1、下载安装邮件程序
	yum -y install mailx

2、配置邮件服务
	vim /etc/mail.rc
	#输入大 G 跳转到文件的最下方,再按小 o 新增一行并进行编辑
	#写在最下面,只修改QQ号和授权码
	set from=12345@qq.com
	set smtp=smtps://smtp.qq.com:465
	set smtp-auth-user=12345@qq.com
	set smtp-auth-password=zcmmhnqspuznbiic
	set smtp-auth=login
	set ssl-verify=ignore
	set nss-config-dir=/etc/pki/nssdb/

3、测试发送邮件
	echo '测试' | mail -s "test" 12345@qq.com
	echo '哈哈' > /root/file.txt
	mail -s "test" 12345@qq.com < /root/file.txt

4、验证数据完整性并发送邮件
	#添加脚本
	vim /scripts/bfjg.sh
	#!/bin/bash

	#定义环境变量
	export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

	#定义变量
	DIR=/backup
	DATE=$(date +%F)
	
	#验证文件完整性
	md5sum -c $DIR/*_$DATE/flag_$DATE > $DIR/check.txt
	
	#发邮件给管理员
	mail -s "备份结果" 12345@qq.com < $DIR/check.txt
	
	#删除6个月前备份
	find /backup/ -type d -mtime +180 | xargs rm -rf

5、定时每天17点给邮箱发邮件告知备份结果
	crontab -e
	#定时推送备份文件
	* 17 * * * /bin/bash /scripts/bfyz.sh &>/dev/null

sersync

环境准备

主机名IP实现目标
web01172.16.1.31NFS客户端挂载 nfs 共享目录
nfs01172.16.1.21NFS服务端提供可挂载目录
Sersync客户端,实时传输更新数据至 backup
nfs02172.16.1.22单点故障 NFS 备份服务端
backup01172.16.1.11Sersync 服务端

backup 主机

部署 rsync 服务端
	#安装 rsync
yum install -y rsync
	#设置 rsync 配置文件
cat > /etc/rsyncd.conf << EOF
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = true
auth users = bf
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
[backup]
path = /backup
EOF
	#设置 rsync 密码文件
echo 'bf:123456' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd
	#创建备份目录
mkdir /backup
chown -R www.www /backup
	#启动 rsyncd
systemctl enable rsyncd
systemctl start rsyncd

nfs 主机

部署 rsync 客户端
1、下载安装rsync
yum -y install rsync

2、建立密码文件【密码文件需要600权限】
echo '123456' > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

3、查看可用模块
rsync bf@172.16.1.11::

4、测试
rsync --password-file=/etc/rsync.kehu -avz /data bf@172.16.1.11::backup
部署 sersync
	# inotify-tools 是 sersync 的依赖
yum -y install inotify-tools
	#下载 sersync
rz sersync2.5.4_64bit_binary_stable_final.tar.gz
tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
mv GNU-Linux-x86 /usr/local/sersync
cd /usr/local/sersync
	#设置 sersync 配置文件
[root@nfs sersync]# vim /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
				#本机ip  		本机启动后端口
    <host hostip="localhost" port="8008"></host>
    #检查代码模式
    <debug start="false"/>
    #文件格式【改】
    <fileSystem xfs="true"/>
    #是否开启文件过滤
    <filter start="false">
        <exclude expression="(.*)\.svn"></exclude>
        <exclude expression="(.*)\.gz"></exclude>
        <exclude expression="^info/*"></exclude>
        <exclude expression="^static/*"></exclude>
    </filter>
    #监控的行为 true 就是开启【修改】
    <inotify>
        <delete start="true"/>
        <createFolder start="true"/>	#监控下级目录变化
        <createFile start="true"/>
        <closeWrite start="true"/>
        <moveFrom start="true"/>
        <moveTo start="true"/>
        <attrib start="true"/>
        <modify start="true"/>
    </inotify>
     <sersync>
     	#要监控的目录【修改】
        <localpath watch="/data">
        	#远程的服务器 IP 与模块名字【修改】
            <remote ip="172.16.1.11" name="backup"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
        	#rsync执行时候的选项【修改】
            <commonParams params="-az"/>
            #是否启动认证 rsync -az /data haoda@172.16.1.11::data
            <auth start="true" users="bf" passwordfile="/etc/sersync.kehu"/>
            #当服务端rsync使用的不是873端口时开启,使用874端口【这里没启用】
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            #超时时间 100s
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        #错误日志地址
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        #定时任务,每600分钟全备一次
        <crontab start="false" schedule="600"><!--600mins-->
        	#定时任务执行时过滤的文件
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
    
    #-------------------------------------以下为模块内容-------------------------------------
    <plugin name="command">
        <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
        <filter start="false">
            <include expression="(.*)\.php"/>
            <include expression="(.*)\.sh"/>
        </filter>
    </plugin>

    <plugin name="socket">
        <localpath watch="/opt/tongbu">
            <deshost ip="192.168.138.20" port="8009"/>
        </localpath>
    </plugin>
    <plugin name="refreshCDN">
        <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
            <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
            <sendurl base="http://pic.xoyo.com/cms"/>
            <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
        </localpath>
    </plugin>
</head>

	#设置密码文件
echo '123456' > /etc/sersync.kehu
chmod 600 /etc/sersync.kehu
	#查看 sersync 帮助
./sersync2 -h
	#启动 sersync 【下面是启动成功的范例】
[root@nfs01 data]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d 	run as a daemon
option: -r 	rsync all the local files to the remote servers before the sersync work
option: -o 	config xml name:  /usr/local/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost	host port: 8008
will ignore the inotify createFile event 
WARNING XFS FILE SYSTEM WORK
daemon start,sersync run behind the console 
use rsync password-file :
user is	bf
passwordfile is 	/etc/rsync.kehu
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads) 
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /data && rsync -az -R --delete ./ bf@172.16.1.11::backup --password-file=/etc/rsync.kehu >/dev/null 2>&1 
run the sersync: 
watch path is: /data
	#验证 sersync 启动
[root@nfs01 data]# ps -aux |grep [r]sync
root       7827  0.0  0.0 116912   784 ?        Ssl  13:58   0:00 /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml

#注意:如果一切都正常,就是不同步,
1、可以先手动推送试试,自动同步是将 nfs主机 data 下的文件同步到 172.16.1.11::backup 目录下
rsync --password-file=/etc/rsync.kehu -avz /data/ bf@172.16.1.11::backup
2、手动可以成功,那就要检查一下 /usr/local/sersync/confxml.xml 的内容是否有误,
注意backup主机的设置,IP、模块、用户名、密码文件及内容
	#远程的服务器 IP 与模块名字【修改】
	<remote ip="172.16.1.11" name="backup"/>
	#是否启动认证 rsync -az /data haoda@172.16.1.11::data
	<auth start="true" users="bf" passwordfile="/etc/sersync.kehu"/>
部署 nfs 服务端
	#安装 nfs inotify-tools
	# rpcbind 是 nfs-utils 的依赖
yum install -y nfs-utils
	#创建共享目录、目录授权
mkdir /data
chown www.www /data
	#配置服务端
cat > /etc/exports << EOF
/data 172.16.1.0/24(rw,sync,anonuid=666,anongid=666,all_squash)
EOF

#############################################################################
# (1) Ro 客户机对该共享目录有只读权限
# (2) Rw 客户机对该共享目录有读写权限
# (3) Root_squash 客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
# (4) No_root_squash 客户机用root访问该共享文件夹时,不将root用户映射成匿名用户
# (5) All_squash 客户机上的任何用户访问该共享目录时都映射成匿名用户
# (6) Anonuid 将客户机上的用户映射成指定的本地用户ID的用户
# (7) Anongid 将客户机上的用户映射成属于指定的本地用户组ID
# (8) Sync 资料同步写入到内存与硬盘中
# (9) Async 资料会先暂存于内存中,而非直接写入硬盘
# (10) Insecure 允许从这台机器过来的非授权访问 
# (11) subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
# (12) no_subtree_check 和上面相对,不检查父目录权限
# (13) wdelay 如果多个用户要写入NFS目录,则归组写入(默认)
# (14) no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
# (15) hide 在NFS共享目录中不共享其子目录
# (16) no_hide 共享NFS目录的子目录
# (17) secure NFS通过1024以下的安全TCP/IP端口发送
# (18) insecure NFS通过1024以上的端口发送
#############################################################################

	#启动rpcbind、nfs服务
systemctl enable rpcbind nfs
systemctl start rpcbind nfs

	#验证配置文件【必须是在nfs启动之后】
[root@nfs data]# cat /var/lib/nfs/etab
#如果显示的和下面一样,说明配置文件就是正确的
/data	172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)

	#验证 rpcbind nfs 启动状态
netstat -lntp |grep rpc && ps -ef | grep [n]fs

web 主机

部署 nfs 客户端
	#安装 nfs-utils 是为了使用 showmount 查看可挂载目录
yum -y install nfs-utils
	#查看rpc服务是否启动,若没有则启动rpc, rpcbind 是 nfs 依赖
systemctl status rpcbind
systemctl start rpcbind

	1、查看可挂载目录
showmount -e 172.16.1.21
Export list for 172.16.1.21:
/data 172.16.1.0/24

	2、进行挂载
mkdir -p /data
chown -R www.www /data
mount -t nfs 172.16.1.21:/data /data

	3、查看挂载成功
df -h

	4、取消挂载
umount /backup
#注意:卸载的时候如果提示”umount.nfs: /backup: device is busy”  
#1.切换至其他目录, 然后在进行卸载。
#2.NFS Server宕机, 强制卸载umount -lf /backup

	5、设置开机挂载
[root@web01 html]# vim /etc/fstab
172.16.1.21:/data /data        nfs     defaults        0 0

NFS 单点故障自动切换

#设想
1、部署2台 NFS 服务端,使用 sersync 实时同步数据到 backup 主机是备份数据
2、当nfs01正常时:
主 nfs 执行:/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
从 nfs 执行:
启动脚本:
	判断 nfs01 nfs挂载点是否正常
		正常就从backup服务器拉取数据
		不正常就启动 sersync2 的进程并结束脚本
#开启一个会话
yum -y install screen
screen -S nfs
Crtl+a+d		#临时退出会话窗口
screen -list 	#显示screen存在的会话列表 screen -ls
screen -r nfs  	#进入指定会话
Crtl+d			#退出会话窗口

vim /root/backup_to_nfs.sh
#!/bin/bash
nfs01=172.16.1.21
nfs02=172.16.1.22
backup=172.16.1.11
ip=$(ifconfig eth1|awk 'NR==2{print $2}')

#判断主 NFS IP
if [ $ip == $nfs01 ];then
	nfs_ip=$nfs02
else
	nfs_ip=$nfs01
fi

#关闭 sersync
kill $(ps -aux |grep [s]ersync2 |awk '{print $2}') &> /dev/null
while true
do
#判断主 NFS 挂载点是否正常
	showmount -e $nfs_ip &> /dev/null
	if [ $? -eq 0 ];then
#主 NFS 挂载点正常,开始拉取backup服务器的数据
		rsync --delete --password-file=/etc/sersync.passwd -az bf@$backup::backup /data/
	else
#主 NFS 故障了,启动本机的 sersync 并退出脚本
		echo "nfs01 故障了,启动 nfs02 sersync"
		/usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml &> /dev/null
		exit
	fi
sleep 1
done

3、web 主机使用脚本实时监控挂载情况,有问题就自动切换
vim /root/nfs.sh
#!/bin/bash
while true
do
	showmount -e 172.16.1.21 &>/dev/null || showmount -e 172.16.1.22 &>/dev/null
	if [ $? -ne 0 ];then
		echo "2台 NFS 都故障了"
		exit
	fi

	showmount -e 172.16.1.21 &>/dev/null
	if [ $? -ne 0 ];then
		umount -lf /data/code &>/dev/null
		mount -t nfs 172.16.1.22:/data /data/code &>/dev/null
    fi
sleep 5
	showmount -e 172.16.1.22 &>/dev/null
	if [ $? -ne 0 ];then
		umount -lf /data/code &>/dev/null
		mount -t nfs 172.16.1.21:/data /data/code &>/dev/null
    fi
sleep 5
done

4、nfs02 主机使用 sersync 实时同步数据到 backup、nfs01 主机上
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值