实时同步 && 全网备份

一. 实时同步:

1. 实时同步服务概述:
原因:实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。
意义:保证数据的连续性 ,减少人力维护成本
如何实现数据实时同步:
	1)发现数据产生变化:inotify(监控软件)
	   inotifywait   参数   事件   监控目录
	2)进行数据传输备份:rsync
2 实时同步实现方式(命令方式):
    存储服务器部署
    第一个历程:按照监控数据变化软件
	条件:确认epel源可以正常使用
	yum install -y inotify-tools
	
	第二个历程:监控命令使用
	/usr/bin/inotifywait    --- 监控数据变化命令
    /usr/bin/inotifywatch   --- 统计数据变化次数  添加 删除 修改
	
	语法结构:inotifywait  --help
	inotifywait  参数  事件  监控目录
	· 永久监控目录中数据变化:  inotifywait -m  目录
      -m|--monitor  	Keep listening for events forever. 
                        保持永久监控
      -d|--daemon   	Same as --monitor
	                    类似-m参数
						
    · 实现目录中数据递归监控:  inotifywait -rm  目录
	  -r|--recursive	Watch directories recursively.
	                    监控目录中子目录数据变化
						
	
    · 实时目录中数据排除监控功能:	
	  --exclude <pattern>   Exclude all events on files matching the extended regular expression <pattern>
	                        排除指定数据信息不要进行监控 (区分大小写识别信息)
      --excludei <pattern>  Like --exclude but case insensitive.
	                        排除指定数据信息不要进行监控 (忽略大小写识别信息)  
					
    · 将无用的信息进制输出
      -q|--quiet    	    Print less (only print events).	
	                        输出少量信息(只输出事件信息)
	
	· 知识输出信息格式
	  --format <fmt>	Print using a specified printf-like format string; read the man page for more details.
	                    指定输出信息格式
						%e  显示触发事件信息 
						%w  显示监控目录信息
						%f  触发事件数据信息
	  --timefmt <fmt>	strftime-compatible format string for use with %T in --format string.
                        定义显示的时间格式信息(时间格式的定义和 date命令类似)
	  -c|--csv      	Print events in CSV format.   (MySQL)
	  -e|--event <event1> [ -e|--event <event2> ... ]         Listen for specific event(s)
	                                                          指定监视事件信息
															  
	  														  
	  事件信息:inotify软件采用触发机制进行监控
      access		file or directory contents were read
	                文件或目录内容被读取时
	  modify		file or directory contents were written
	                文件或目录内容被写入
	  attrib		file or directory attributes changed
	                文件或目录属性信息被改变
	  close_write	file or directory closed, after being opened in writeable mode    ******
	                文件或目录关闭,写入新的信息之后
	  close_nowrite	file or directory closed, after being opened in read-only mode
	                文件或目录关闭,只读模式进行关闭
	  close		    file or directory closed, regardless of read/write mode
	                文件或目录关闭,无论文件数据是否进行读或者写入
	  open		    file or directory opened
	                文件或目录被打开了
	  moved_to	    file or directory moved to watched directory
	                文件或目录移动到监控目录中
	  moved_from	file or directory moved from watched directory
	                文件或目录从监控目录移除
	  move		    file or directory moved to or from watched directory             *****
	                文件或数据不管是从目录中移除或是移入
	  create		file or directory created within watched directory               *******
	                文件或目录被创建出来在监控目录中
	  delete		file or directory deleted within watched directory               ******         
	                在监控目录中文件或目录被删除
	  delete_self	file or directory was deleted
	                在监控目录中文件或目录被删除
	  unmount		file system containing file or directory unmounted
	                文件系统中包含文件或目录被卸载

3. 实时同步实现方式(脚本实现):
    编写脚本思路:
	1)发现变化数据信息    inotifywait
       inotifywait -mrq --format "%w%f" /data -e "close_write,move,create,delete"
       数据信息  

	2)将变化数据进行传输  rsync
	   rsync -az  数据信息  rsync_backup@172.16.1.41::backup  --password-file=/etc/rsync.password 
	
    3) 监控操作和同步操作建立联系
       shell脚本循环语句:
	   · for    循环语句     --- 有限循环
	   · while  循环语句     --- 无限循环
	     条件为真就会一直循环
	   · until  循环语句     --- 无限循环 
	     条件为假就会一直循环
	   
	   脚本解释过程:
	   inotifywait -mrq --format "%w%f" /data -e "close_write,move,create,delete"|while read data_info
	       信息   --- 赋值 买一 --- 循环动作 增一
	   do
	     rsync -az  $data_info --delete  rsync_backup@172.16.1.41::backup  --password-file=/etc/rsync.password 
       done

       脚本内容:
	   # cat /server/scripts/sync_data.sh 
       #!/bin/bash
       
       inotifywait -mrq --format "%w%f" /data -e "close_write,move,create,delete"|while read data_info
       do
          rsync -az  /data/ --delete  rsync_backup@172.16.1.41::backup  --password-file=/etc/rsync.password 
       done
4. 实时同步实现方式(软件部署):
    sersync  --- 实时同步软件  部署前提(inotify-tools  rsync守护进程模式)
    诞生过程:金山公司开发人员 周洋  --- 数据实时同步 (inotify+rsync 脚本)--- 开发实时同步程序(inotify+rsync)
	https://github.com/wsgzao/sersync          


    sersync软件部署过程:
	第一个历程:下载软件二进制包
	https://github.com/wsgzao/sersync  
	
	第二个历程:解压软件,并保存到相应目录中
	cd /server/tools
	unzip sersync-master.zip
	cd sersync-master/
    tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
	tree GNU-Linux-x86/
	mkdir /usr/local/sersync
	mv GNU-Linux-x86/* /usr/local/sersync/
	
	第三个历程:修改sersync配置文件
	vim confxml.xml
     6     <filter start="false">    --- 排除指定数据不要进行同步(默认关闭)
     7         <exclude expression="(.*)\.svn"></exclude>
     8         <exclude expression="(.*)\.gz"></exclude>
     9         <exclude expression="^info/*"></exclude>
    10         <exclude expression="^static/*"></exclude>
    11     </filter>
	
	12     <inotify>                 --- 监控事件信息
    13         <delete start="true"/>
    14         <createFolder start="true"/>
    15         <createFile start="false"/>
    16         <closeWrite start="true"/>
    17         <moveFrom start="true"/>
    18         <moveTo start="true"/>
    19         <attrib start="false"/>
    20         <modify start="false"/>
    21     </inotify>
	
	24         <localpath watch="/opt/tongbu">    --- 实现实时同步配置
    25             <remote ip="127.0.0.1" name="tongbu1"/>
    26             <!--<remote ip="192.168.8.39" name="tongbu"/>-->
    27             <!--<remote ip="192.168.8.40" name="tongbu"/>-->
    28         </localpath>
    29         <rsync>
    30             <commonParams params="-artuz"/>
    31             <auth start="false" users="root" passwordfile="/etc/rsync.pas"/>
    32             <userDefinedPort start="false" port="874"/><!-- port=874 -->
    33             <timeout start="false" time="100"/><!-- timeout=100 -->
    34             <ssh start="false"/>
    35         </rsync>

    第四个历程:启动服务程序
	sersync -h
	参数-d:  启用守护进程模式
	参数-r:  在监控前,将监控目录与远程主机用rsync命令推送一遍
	参数-o:  指定配置文件,默认使用confxml.xml文件  此时存放(/opt/sersync/confxml.xml)
	
	sersync  -dro  /usr/local/sersync/confxml.xml 
	
PPS:因为sersync不属于环境变量,所以在使用命令sersync时,应该在环境变量中添加变量


	实时同步服务出现异常:
	修改配置文件参数,进行调试
	<debug start="true"/>

在这里插入图片描述

二. 全网备份:

1. 全网备份需求说明:
基本要求:
要求:每天晚上 00 点整在 Web 服务器上打包备份系统配置文件、网站程序目录及访问日志并通过rsync命令推送备份服务器backup上备份保留;
(备份思路可以是先在本地按日期打包,然后再推到备份服务器 backup 上),NFS 存储服务器同 Web 服务器,实际工作中就是全部的服务器。


具体要求:
1)所有服务器的备份目录必须都为/backup。
2)要备份的系统配置文件包括但不限于:
  a.定时任务服务的配置文件(/var/spool/cron/root)(适合 web 和 nfs 服务器)。
  b.开机自启动的配置文件(/etc/rc.local)(适合 web 和 nfs 服务器)。
  c.日常脚本的目录 (/server/scripts)。
  d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)。
  e.自己思考下还有什么需要备份呢?
3)Web 服务器站点目录假定为(/var/html/www)4)Web 服务器 A 访问日志路径假定为(/app/logs)
5)Web 服务器保留打包后的 7 天的备份数据即可(本地留存不能多于7天,因为太多硬盘会满)
6)备份服务器上,保留每周一的所有数据副本,其它要保留6个月的数据副本。
7)备份服务器上要按照备份数据服务器的内网IP为目录保存备份,备份的文件按照时间名字保存。
8)需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中。
2. 第一步:先将每一步需求进行完成:
1)所有服务器的备份目录必须都为/backup
mkdir  /backup

2)要备份的系统配置文件包括但不限于:
   a.定时任务服务的配置文件(/var/spool/cron/root)(适合 web 和 nfs 服务器)。
   b.开机自启动的配置文件(/etc/rc.local)(适合 web 和 nfs 服务器)。
   c.日常脚本的目录 (/server/scripts)。
   d.防火墙 iptables 的配置文件(/etc/sysconfig/iptables)。
   e.自己思考下还有什么需要备份呢?
tar zcvf /backup/sys_backup_$(date +%F_星期%w -d "-1 day").tar.gz /var/spool/cron/root /etc/rc.local /server/scripts /etc/sysconfig/iptables

3)Web 服务器站点目录假定为(/var/html/www)。
tar zcvf  /backup/www_data_$(date +%F_星期%w -d "-1 day").tar.gz   /var/html/www

4)Web 服务器 A 访问日志路径假定为(/app/logs)
tar zcvf  /backup/log_data_$(date +%F_星期%w -d "-1 day").tar.gz   /app/logs

5)Web 服务器保留打包后的 7 天的备份数据即可(本地留存不能多于 7 天,因为太多硬盘会满)
find /backup -type f -mtime +7 -delete

6)备份服务器上,保留每周一的所有数据副本,其它要保留6个月的数据副本。
find /backup -type f -mtime +180 -delete
方法一:排除每周一数据不要删除
find /backup -type f ! -name "*星期1*" -a -mtime +180 -delete
方法二:识别每周一数据单独保存
周日:存储服务器 (/backup/周日备份)  --->  备份服务器(/backup)
周一:存储服务器 (/backup/周一备份)  --->  备份服务器(/backup) 将当天的数据移动到 /week01目录  
00:00   数据进行备份   周一    周日数据信息
00:00   数据进行备份   周二    周一数据信息    
00:30   备份服务器   find /backup/ -type f -name "*.tar.gz" -mmin -30 | xargs mv -t /week01 --> mv_data.sh
0 30 * * 2  /bin/sh mv_data.sh &>/dev/null

7)备份服务器上要按照备份数据服务器的内网 IP 为目录保存备份,备份的文件按照时间名字保存。(优选)
方法一:存储服务传输备份数据时,创建相应子目录
NFS:172.16.1.31   rsync -avz /backup/ rsync_backup@172.16.1.41::backup/172.16.1.31 --password-file=/etc/password
web:172.16.1.7    rsync -avz /backup/ rsync_backup@172.16.1.41::backup/172.16.1.7  --password-file=/etc/password
方法二:存储服务本地创建相应子目录

8)需要确保备份的数据尽量完整正确,在备份服务器上对备份的数据进行检查,把备份的成功及失败结果信息发给系统管理员邮箱中

验证数据完整性能:利用数据指纹验证数据完整性
存储服务端:         -数据与指纹信息->     备份服务器:
对数据生成指纹信息                        识别数据信息,生成新的指纹 vs 收到指纹信息 对比
利用md6sum命令 生成指纹信息/对比指纹信息进行验证
1. 生成指纹信息			find /backup/ -type f -name "*.tar.gz"|xargs md5sum >/backup/finger.txt
2. 将数据和指纹文件进行传输	rsync -avz /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
3. 对指纹信息进行验证		md5sum -c finger.txt

进行邮件发送告知:
1. 申请邮箱,开启smtp功能/进行授权码设置
2. 编写邮件发送配置信息
	163邮箱:
	vim /etc/mail.rc
	set from=邮箱地址@163.com 
	smtp=smtp.163.com <- 邮件发送邮件服务器域名,此处为163邮箱的发送服务器域名
	set smtp-auth-user=邮箱账号 
	smtp-auth-password=登录邮箱密码 smtp-auth=login
	例如:
	set from=17778058507@163.com
	set smtp=smtp.163.com
	set smtp-auth-user=17778058507@163.com
	set smtp-auth-password=oldboy123(随意写的,不要借用)
	QQ邮箱:
	vim /etc/mail.rc
	set from=邮箱地址@qq.com 
	smtp=smtp.qq.com <- 邮件发送邮件服务器域名,此处为163邮箱的发送服务器域名
	set smtp-auth-user=邮箱账号 
	smtp-auth-password=登录邮箱验证码之类的 smtp-auth=login
	例如:
	set from=3034698155@qq.com
	set smtp=smtp.qq.com
	set smtp-auth-user=3034698155@qq.com
	set smtp-auth-password=xxxxxxxxxx(随意写的,不要借用)
3. 重启邮件服务
	systemctl restart postfix
4. 邮件发送测试
3. 第二步:将所有完成项目进行整合:

网站服务器(web服务器)上脚本编写

#!/bin/bash
host_IP=$(hostname -i)
backup_data="./var/spool/cron/root ./etc/rc.local"
    
#01. 创建存储数据目录
mkdir -p /backup/$host_IP/
    
#02. 将数据本地保存压缩备份
mkdir -p /server/scripts /var/html/www /app/logs 
touch /etc/sysconfig/iptables
cd /
tar zchf /backup/$host_IP/sys_backup_$(date +%F_星期%w -d "-1 day").tar.gz $backup_data
    
#03. 将当天生成备份文件进行指纹验证,生成指纹文件
find /backup -type f -name "*.tar.gz" -mtime -1 | xargs md5sum >/backup/$host_IP/finger.txt 
    
#04. 实现数据远程备份
rsync -az /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    
#05. 将历史数据信息进行清理
find /backup/ -type f -name "*.tar.gz" -mtime +7 -delete

存储服务器(nfs服务器)上脚本编写

#!/bin/bash
host_IP=$(hostname -i)
backup_data="./var/spool/cron/root ./etc/rc.local ./server/scripts ./etc/sysconfig/iptables"
    
#01. 创建存储数据目录
mkdir -p /backup/$host_IP/
    
#02. 将数据本地保存压缩备份
mkdir -p /server/scripts /var/html/www /app/logs 
touch /etc/sysconfig/iptables
cd /
tar zchf /backup/$host_IP/sys_backup_$(date +%F_星期%w -d "-1 day").tar.gz $backup_data
tar zcf /backup/$host_IP/www_data_$(date +%F_星期%w -d "-1 day").tar.gz ./var/html/www
tar zcf /backup/$host_IP/log_data_$(date +%F_星期%w -d "-1 day").tar.gz ./app/logs
    
#03. 将当天生成备份文件进行指纹验证,生成指纹文件
find /backup -type f -name "*.tar.gz" -mtime -1 | xargs md5sum >/backup/$host_IP/finger.txt 
    
#04. 实现数据远程备份
rsync -az /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
    
#05. 将历史数据信息进行清理
find /backup/ -type f -name "*.tar.gz" -mtime +7 -delete

备份服务器(backup服务器)上脚本编写

#!/bin/bash

#01. 验证数据完整性
find /backup -type f -name "finger.txt"|xargs md5sum -c >/backup/check_log.txt
#02. 将验证结果进行邮件发送
mail -s "data_check_$(date +%F_%T)" 3034698155@qq.com </backup/check_log.txt
#03. 将数据进行清理操作
find /backup -type f ! -name "*星期1*" -a -mtime +180 -delete
4. 第三步:将全网备份进行最终测试(编写脚本的定时任务):

web服务器上定时任务

00 00 * * *  /bin/sh /server/scripts/backup_data_sh

存储服务器上定时任务

00 00 * * *  /bin/sh /server/scripts/backup_data_sh

备份服务器上定时任务

#因为不知道上两个定时任务什么时候能结束,所以这个定时任务可以时间定晚一些
00 05 * * *  /bin/sh /server/scripts/backup_mail_sh
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章