前期准备
#关闭 防火墙
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 | 实现目标 |
---|---|---|
web01 | 172.16.1.31 | NFS客户端挂载 nfs 共享目录 |
nfs01 | 172.16.1.21 | NFS服务端提供可挂载目录 Sersync客户端,实时传输更新数据至 backup |
nfs02 | 172.16.1.22 | 单点故障 NFS 备份服务端 |
backup01 | 172.16.1.11 | Sersync 服务端 |
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 主机上