文章目录
不同服务器需要用到同一个文件,如何处理?
当文件信息在不断更新,且文件不断增大,又如何处理?
如今的微信公众号,小程序等都有开通图片上传的功能,当微信公众号和程序后台部署在不同服务器时,我们需要将微信服务器的图片同步到程序后台服务器上,此时就可以使用Rsync工具。
Rsync(remote synchronize)是一个远程数据同步工具,可快速同步多台主机间的文件。一般应用于不同服务器之间文件的同步。
Rsync使用所谓的“Rsync算法”来使本地和远
程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,相对其他文件同步方法来说比较快。
一:rsync概述
1.1:是一款快速增量备份的工具
Remote Sync,远程同步
支持本地复制,或者与其他SSH,rsync主机同步
官方网站:http://rsync.samba.org
1.2:配置rsync 同步源服务器
1.21:rsync同步源
- 指备份操作的远程服务器,也被称为备份源
1.3:配置rsync源基本思路
备注:在提供服务的同步源服务器上操作
- 建立rsyncd.conf配置文件
- 建立独立的账号文件
- 启用rsync——daemon模式
1.31: 应用示例
- 用户gsybk,允许下行同步
- 操作的目录为/var/www/html
二:配置rsync配置文件
- 在CentOS 7系统之前/etc/rsyncd.conf文件默认不存在,CentOS 7开始已经有这样的文件,并且其中放置了模板参考信息(根据实际情况编写需要的内容,注意格式)。
- 服务端IP:20.0.0.41
- 客户端ip:20.0.0.42
[root@localhost ~]# vim /etc/rsyncd.conf
uid = nobody '//启用匿名用户'
gid = nobody
port 873 '//监听端口'
use chroot = yes '//禁固在目录'
log file = /var/log/rsyncd.log '//日志文件存放位置'
pid file = /var/run/rsyncd.pid '//存放进程ID的文件位置'
hosts allow = 20.0.0.0/24 '//允许访问的客户机地址'
'//共享模块'
[wwwroot] '//共享模块名称'
path = /var/www/html '//源目录的实际路径'
comment = www.shuai.com '//描述(可以省略)'
read only = yes '//开启只读'
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
auth users = backuper '//同步时不在进行也锁的文件类型'
secrets file = /etc/rsyncd_users.db '//存放账户信息的数据文件'
基于安全性考虑,对于rsync的同步源最好仅允许以只读方式做同步。另外,同步可以采用匿名的方式,只要将其中的“auth users”和“secrets file”配置项去除即可!
2.1:为备份账号创建数据文件
- 根据rsync的配置文件内容,创建账号数据文件。每行一个用户,用户和密码之间用冒号进行分割
[root@localhost ~]# vim /etc/rsyncd_users.db
//编写 采用用户名:密码格式
backuper:123123
- 由于账号信息采用明文存放,因此需要调整那文件权限,避免账号信息泄露
[root@localhost ~]# chmod 600 /etc/rsyncd_users.db
- 启动rsync服务
[root@localhost ~]# rsync --daemon
//查看状态
[root@localhost ~]# netstat -ntap | grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 87776/rsync
tcp6 0 0 :::873 :::* LISTEN 87776/rsync
- 测试、安装httpd服务
[root@localhost ~]# iptables -F
[root@localhost ~]# setenforce 0
//安装httpd
[root@localhost html]# yum -y install httpd
//设置主页信息
[root@localhost ~]# cd /var/www/html/
[root@localhost html]# vim index.html
//编写
<h1>Hello<h1>
//重启服务
[root@localhost html]# systemctl restart httpd
- 如果需要重启rsync服务,需要:
[root@localhost ~]# kill $(cat /var/run/rsyncd.pid)
//停止服务
[root@localhost ~]# rsync --daemon
//启动服务
[root@localhost ~]# kill -9 $(cat /var/run/rsyncd.pid)
//
[root@localhost ~]# rsync --daemon
failed to create pid file /var/run/rsyncd.pid: File exists
或者直接使用“netstat -anpt | grep rsync”命令查出进程号,使用“kill 进程号”一样。
使用第一种方法停止rsync服务必须删除存放rsync服务进程的文件:
[root@localhost ~]# rm -rf /var/run/rsyncd.pid
2.2:使用rsync备份工具
配置好rsync同步源服务器之后,客户端就可以使用rsync工具来执行远程同步了。
rsync命令的选项:
-r:递归模式,包含目录及子目录中所有文件
-l:对于符号链接文件仍然复制为符号链接文件
-p:保留文件的权限标记
-t:保留文件的时间标记
-g:保留文件的属组标记(仅超级用户使用)
-o:保留文件的属主标记(仅超级用户使用)
-D:保留设备文件及其他特殊文件
-a:归档模式,递归并保留对象属性,等同于 -rlptgoD
-v:显示同步过程的详细(verbose)信息
-z:在传输文件时进行压缩(compress)
-H:保留硬连接文件
-A:保留ACL属性信息
--delete:删除目标位置有而原始位置没有的文件
--checksum:根据对象的校验和来决定是否跳过文件
2.3:配置源的两种表示方法
1.格式:用户名@主机地址::共享模块名
新开一台服务器进行rsync远程操作
[root@localhost ~]# hostnamectl set-hostname shuai
[root@localhost ~]# su
[root@shuai ~]# rpm -q rsync
rsync-3.1.2-4.el7.x86_64
//方法一
[root@shuai ~]# rsync -zva backuper@20.0.0.41::wwwroot /opt
Password:
//查看opt查看已经同步成功
[root@shuai ~]# cd /opt
[root@shuai opt]# ls
index.html rh
[root@shuai opt]# cat index.html
<h1>hello</h1>
[root@localhost ~]# ll /var/www/html/
总用量 4
-rw-r--r--. 1 root root 15 9月 10 17:10 index.html
2.格式:rsync://用户名@主机地址、共享模块名
方法二:
//我们先本地的opt下面的文件删去
[root@shuai opt]# rm -rf *.html
[root@shuai opt]# rsync -zva rsync://backuper@20.0.0.41/wwwroot /opt
Password:
receiving incremental file list
./
index.html
sent 46 bytes received 124 bytes 68.00 bytes/sec
total size is 15 speedup is 0.09
[root@shuai opt]# cat /var/www/html/index.html
<h1>Hello<h1>
[root@shuai ~]# ll /opt
总用量 4
-rw-r--r--. 1 root root 15 9月 10 17:10 index.html
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
这两种命令效果是一样!
上传只需将目录调换顺序即可(确保对上传的目录具有写入权限)!
在同步源端输入以下命令,方可执行写入权限:
2.4:rsync的免交互处理
- 设置好一个文件,里面输入对应的密码
- 在输入命令时添加–password-file=密码文件路径
[root@shuai ~]# vim /etc/server.pass
123123
[root@shuai ~]# chmod 600 /etc/server.pass
[root@shuai ~]# rsync -zva --delete --password-file=/etc/server.pass backuper@20.0.0.41::wwwroot /opt
receiving incremental file list
deleting rh/
sent 20 bytes received 63 bytes 55.33 bytes/sec
total size is 15 speedup is 0.18
[root@shuai ~]# ls /opt
index.html
[root@shuai opt]# ll
总用量 4
-rw-r--r--. 1 root root 15 9月 10 17::10 index.html
2.5:设置周期性计划任务
- 每天晚上十点半对服务器网站更新一次
[root@shuai opt]# mkdir /webbak
[root@shuai opt]# crontab -e
30 22 * * * /usr/bin/rsync -avz --delete --password-file=/mima gsybk@192.168.247.160::wwwroot /webbak
[root@shuai opt]#systemctl restart crond
[root@shuai opt]#systemctl enable crond
三:rsync实时同步
概述
rsync是一个开源的快速备份工具,可以再不同主机之间镜像同步整个目录树,支持增量备份,保持链接和权限,且采用优化的同步算法,再传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。:
3.1:定期同步的不足
-
执行备份的时间固定,延迟明显,实时性差
-
当同步源长期不变化时,密集的定期任务是不必要的:
3.2:实时同步的特特点
-
一旦同步源出现变化,立即开启备份
-
只要同步源无变化,则不执行备份
3.4:Linux内核的inotify机制
从版本2.6.13开始提供
可以监控文件系统的变动情况,并做出通知相应
辅助软件:inotify-tools
原理
再远程同步任务中,负责发起rsync同步操作的客户机称为发起端,而负责响应来自客户机的rsync同步操作的服务器称为同步源。再同步过程中,同步源负责提供文档的原始位置,而发起端对该位置具有读取权限,如图所示:
:
3.5:调整inotify内核参数
max_queue_events:监控事件队列大小
max_user_instances:最多监控实例数
max_user_watches:每个事例最多监控文件数
实验环境
源服务器【shuai】:20.0.0.42
客户端20.0.0.41
- 把shuai服务器当作源服务器
'//安装http作为数据环境 第一台跟shuai服务器都安装了httpd 两个进行同步更新'
[root@shuai html]# yum -y install httpd
'//删除原有的主页文件'
[root@localhost html]# rm -rf index.html
[root@localhost html]# vim /etc/sysctl.conf
# For more information, see sysctl.conf(5) and sysctl.d(5). //添加//
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
[root@localhost html]# sysctl -p '//启动'
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
2.安装inotifi-tools
使用inotify机制还需要安装inotifi-tools,以便提供inotifywait和inotifywatch辅助工具程序,用来监控和汇总改动情况。
'//解压inotifi-tools包'
[root@shuai html]# tar zxvf inotify-tools-3.14.tar.gz -C /opt
[root@shuai html]# cd /opt
[root@shuai opt]# cd inotify-tools-3.14/
[root@shuai inotify-tools-3.14]# yum install gcc gcc-c++ make -y
'//执行脚本'
[root@shuai inotify-tools-3.14]# ./configure
'//编译及安装'
[root@shuai inotify-tools-3.14]# make && make install
'//执行监控 -m:持续进行监控 -r:递归监控所有子对象 -q:简述输出信息 -e:指定要监控的事件类型'
[root@shuai inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /var/www/html/
'//此时是一个持续性的状态'
另外在开启一个新的终端设置 监控的路径是/var/www/html
'//我们在这个目录创建文件'
[root@shuai ~]# cd /var/www/html/
[root@shuai html]# touch index.txt
'//可以看出都是可以监控到的'
[root@shuai inotify-tools-3.14]# inotifywait -mrq -e modify,create,move,delete /var/www/html/
#直接会显示
/var/www/html/ CREATE index.txt
- 编写触发式同步脚本
[root@shuai opt]# vim inotfiy.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html/ backuper@20.0.0.41::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
'//增加执行权限'
[root@shuai opt]# chmod +x inotfiy.sh
上述脚本用来检测本机/var/www/html目录的变动情况,一旦有更新触发rsync同步操作,上传备份至服务器20.0.0.41的/var/www/html目录下。
- 设置服务器一的只读模式关闭
read only = no //要是开了只有读的配置 不能写
- 增加权限
[root@shuai html]# chmod 777 /var/www/html/
'//服务器一也要增加读写的权限'
[root@localhost html]# chmod 777 /var/www/html/
- 执行脚本启动监控
[root@shuai opt]# ./inotfiy.sh
'//等待监控状态'
'//打开源服务器shuai的另一个窗口在/var/www/html目录下创建新的文件'
[root@shuai html]# touch 1.txt
[root@shuai html]# touch 2.txt
[root@shuai html]# touch 3.txt
- 查看服务器中的/var/www/html目录下的变化情况
[root@localhost html]# ls /var/www/html/
1.txt 2.txt 3.txt index.txt
已经同步成功,实验结束