大点干!早点散----------rsync+inotify实现远程实时同步
文章目录
- 一、rsync概述
- 二、rsync特性
- 三、rsync原理
- 1、运行模式和端口
- 2、四个名字的解释
- 3、数据同步方式
- (1)推push
- (2)拉pull
- 四、命令参数
- 五、具体rsync备份数据
- 1、服务端---修改配置文件 :/etc/rsyncd.conf
- 2、服务端--创建于用户密码文件
- 3、服务端--启动rsync服务
- 4、服务端--在 /var/www/html目录中,新建文件
- 5、客户端--#实现rsyns同步
- 6、客户端---配置rsync的免密同步
- 7、实时同步
- (1)服务端--将只读选项关闭
- (2)客户端--配置监控的参数
- (3)客户端--安装inotify-tools辅助工具
- (4)客户端--配置自动监控同步脚本
- (5)验证
一、rsync概述
rsync是linux系统下的数据镜像备份工具,使用快速增量备份工具remote sync可以远程同步,可以在不同主机之间进行同步,可以实现全量备份与增量备份,保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适合用于架构集中式的备份或异地备份等应用。同时rsync支持本地复制,或者与其他ssh、rsync主机同步。
二、rsync特性
1)可以镜像保存整个目录树和文件系统 2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。 3)无须特殊权限即可安装 4)快速:第一次同步时rsync复制全部内容,但在下一次值传输修改过的内容 5)压缩传输:rysnc在传输的过程中可以实行压缩及解压缩操作,可以使用更少的带宽 6)安全:可以使用scp、ssh等方式来进行文件传输 7)支持匿名传输,以方便进行网站镜像 8)选择性保持:符号链接、硬链接、文件属性、权限、时间等
三、rsync原理
1、运行模式和端口
1)采用C/S模式(实际上是一个点到点的传输,直接使用rsync命令即可完成) 2)rsync监听的端口是:873
2、四个名字的解释
1)发起端:负责发起rsync同步操作的客户端叫做发起端。通知服务器我要备份你的数据 2)备份源:负责响应来自客户端rsync同步操作的服务器叫做备份源,需要备份的服务器 3)服务端:运行rsyncd服务,一般来说,需要备份的服务器 4)客户端:存放备份数据。
3、数据同步方式
(1)推push
一台主机负责吧数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况 推:目的主机配置为rsync服务器,源主机周期性的使用rysnc命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)
(2)拉pull
所有主机定时去找一台主机拉数据,可能就会导致数据缓慢 拉:源主机配置为rysnc服务器,目的主机周期性的使用rync命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)
四、命令参数
(1) -a:–archive archive mode 权限保存模式,相当于 -rlptgoD 参数,存档,递归,保持属性等。 (2) -r:–recursive 复制所有下面的资料,递归处理。 (3) -p:–perms 保留档案权限,文件原有属性。 (4) -t:–times 保留时间点,文件原有时间。 (5) -g:–group 保留原有属组。 (6) -o:–owner 保留档案所有者(root only)。 (7) -D:–devices 保留device资讯(root only)。 (8) -l:–links 复制所有的连接,拷贝连接文件。 (9) -z:–compress 压缩模式,当资料在传送到目的端进行档案压缩。 (10) -H:–hard-links 保留硬链接文件。 (11) -A:–acls 保留ACL属性文件,需要配合–perms。 (12) -P:-P参数和 --partial --progress 相同,只是为了把参数简单化,表示传进度。 (13) --version:输出rsync版本。 (14) -v:–verbose 复杂的输出信息。 (15) -u:–update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件。 (16) --port=PORT:定义rsyncd(daemon)要运行的port(预设为tcp 873)。 (17) --delete:删除那些目标位置有的文件而备份源没有的文件。 (18) --password-file=FILE :从 指定密码文件中获取密码。 (19) --bwlimit=KBPS:限制 I/O 带宽。 (20) --filter “-filename”:需要过滤的文件。 (21) --exclude=filname:需要过滤的文件。 (22) --progress:显示备份过程。 注释:通常常用的选项 –avz -z的命令一般用在小文件进行压缩,数据量比较大的文件在传输的过程中就比较慢,如果再压缩传输会更加慢。所以根据需求来选择是否需要加这个参数
五、具体rsync备份数据
rsync 是系统自带的,无需额外安装,如果是最小化安装的话,用 yum安装一下即可。
1、服务端—修改配置文件 :/etc/rsyncd.conf
[root@master yum.repos.d]# vi /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes '//禁锢在源目录'
address = 192.168.233.131 '//监听地址'
port 873 '//监听端口号'
log file = /var/log/rsyncd.log '//日志文件位置'
pid file = /var/run/rsyncd.pid '//存放进程ID的文件位置'
hosts allow = 192.168.233.133 '//允许访问的客户机地址'
[wwwroot] '//共享模块名称'
path = /var/www/html '//源目录的实际路径'
comment = Document Root of www.51xit.top
read only =yes '//是否只读'
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z '//同步时不在压缩的文件类型'
auth users = lisi '//授权账户'
secrets file = /etc/rsyncd_users.db '//存放账户信息的数据文件'
2、服务端–创建于用户密码文件
配置文件制定的路径创建
[root@master yum.repos.d]# rsync --daemon '//启动rsync服务,如果要停止这个服务请使用kill $(cat /var/run/rsyncd.pid)'
[root@master yum.repos.d]# netstat -ntap |grep rsync
tcp 0 0 192.168.233.131:873 0.0.0.0:* LISTEN 4371/rsync
3、服务端–启动rsync服务
如果要停止服务 要将pid文件删除 在/var/run/rsyncd.pid
[root@master yum.repos.d]# rsync --daemon '//启动rsync服务,如果要停止这个服务请使用kill $(cat /var/run/rsyncd.pid)'
[root@master yum.repos.d]# netstat -ntap |grep rsync
tcp 0 0 192.168.233.131:873 0.0.0.0:* LISTEN 4371/rsync
4、服务端–在 /var/www/html目录中,新建文件
[root@master yum.repos.d]# cd /var/www/html/
[root@master html]# ls
[root@master html]# touch 111.html
[root@master html]# touch 222.html
[root@master html]# ls
111.html 222.html
'//创建完成后,我们稍后到客户机上操作,进行验证'
5、客户端–#实现rsyns同步
查看rsync的软件是否安装
[root@localhost ~]# rpm -q rsync
rsync-3.1.2-10.el7.x86_64
[root@slave opt]# mkdir myweb
'//方法一'
[root@slave opt]# rsync -avzH --delete lisi@192.168.233.131::wwwroot /opt/myweb
Password:
receiving incremental file list
./
111.html
222.html
sent 98 bytes received 207 bytes 87.14 bytes/sec
total size is 0 speedup is 0.00
[root@slave opt]# ls /opt/myweb/
111.html 222.html
'//方法二'
[root@slave opt]# rsync -avz rsync://lisi@192.168.233.131/wwwroot /root
Password:
receiving incremental file list
./
111.html
222.html
sent 98 bytes received 207 bytes 87.14 bytes/sec
total size is 0 speedup is 0.00
6、客户端—配置rsync的免密同步
为了写脚本能方便一些,使用免密登录
[root@slave opt]# vi /etc/server.pass '//创建密码文件'
lisi123
[root@slave opt]# chmod 600 /etc/server.pass '//给密码文件权限'
[root@slave opt]# rm -rf myweb/* '//先删除/opt/myweb目录下的内容用来测试
[root@slave opt]# ls myweb/
[root@slave opt]# rsync -az --delete --password-file=/etc/server.pass lisi@192.168.233.131::wwwroot /opt/myweb '//指定刚刚创建的密码文件,发现已经不需要输入密码了'
[root@slave opt]# ls myweb/
111.html 222.html
可以创建周期性任务进行同步源服务器
[root@slave opt]# crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass lisi@192.168.233.131::wwwroot /opt/myweb/ '//每天晚上10点半对服务器网站目录更新一次'
[root@slave opt]# systemctl restart crond
[root@slave opt]# systemctl enable crond
7、实时同步
实现思路如下
(1)服务端–将只读选项关闭
[root@master html]# vi /etc/rsyncd.conf
read only = no '//改为no'
[root@master html]# kill `cat /var/run/rsyncd.pid` '//关闭rsync服务'
[root@master html]# netstat -ntap |grep rsync
[root@master html]# rsync --daemon '//开启rsync服务'
[root@master html]# netstat -ntap |grep rsync
tcp 0 0 192.168.233.131:873 0.0.0.0:* LISTEN 88302/rsync
[root@master html]# chmod 777 /var/www/html
(2)客户端–配置监控的参数
[root@slave opt]# cat /proc/sys/fs/inotify/max_queued_events '//监控队列大小'
16384
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_instances '//最多监控实例数'
128
[root@slave opt]# cat /proc/sys/fs/inotify/max_user_watches '//每个实例最多监控文件数'
8192
[root@slave opt]# vi /etc/sysctl.conf
[root@slave opt]# sysctl -p
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
(3)客户端–安装inotify-tools辅助工具
[root@slave opt]# tar zxf inotify-tools-3.14.tar.gz
[root@slave opt]# cd inotify-tools-3.14/
[root@slave inotify-tools-3.14]# yum install gcc gcc-c++ -y
[root@slave inotify-tools-3.14]# ./configure
[root@slave inotify-tools-3.14]# make && make install
重新打开一个终端
[root@slave ~]# inotifywait -mrq -e modify,create,move,delete /opt/myweb '//运行持续监控监控'
inotifywait:用于持续监控,实时输出结果
inotifywatch:用于短期监控,任务完成后再出结果
(4)客户端–配置自动监控同步脚本
inotifywait 监控软件 -m, 持续进行监控 -r, 递归监控所有子对象 -q , 简化输出信息, -e ,指定要监控哪些事件类型
modify 修改 create 创建 move 移动 delete 删除
[root@slave inotify-tools-3.14]# vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /var/www/html/"
RSYNC_CMD="rsync -avzH --delete --password-file=/etc/server.pass /var/www/html/ lisi@192.168.233.133::wwwroot/"
#读取输出的监控记
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
#如果rsync未在执行,则立即启动
if [ $(pgrep rsync | wc -l) -le 0 ]; then
$RSYNC_CMD
fi
done
[root@slave inotify-tools-3.14]# chmod 777 /opt/myweb/
[root@slave inotify-tools-3.14]# chmod +x /opt/inotify.sh
[root@slave inotify-tools-3.14]# cd ..
[root@slave opt]# ./inotify.sh '//执行脚本进行监控'
(5)验证
[root@slave myweb]# touch 111.html '//客户机创建文件,删除文件也可以同步成功'
[root@master html]# ll '//服务端查看'
总用量 0
-rw-r--r--. 1 root root 0 3月 24 09:22 111.html '//同步成功'
- 3种提升云可扩展性的方法
- 用一个命令使用 Docker Compose 安装Mesos
- C语言/C加加新手入门学习经验资料分享,基础知识大汇总!
- 云数据服务蜂拥而至...好难选呀
- ASP.NET MVC的Razor引擎:View编译原理
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
- 通过Knockout.js + ASP.NET Web API构建一个简单的CRUD应用
- 自动驾驶车辆在2017年的七大光辉历史时刻
- 简单的实现Javascript的MVC
- 谷歌再出黑科技!人工智能模拟的人声和真人几乎难以分辨
- 【Scikit-Learn 中文文档】高斯混合模型 - 无监督学习 - 用户指南 | ApacheCN
- “E+单拼”组合域名eqi.com小六位结拍
- ASP.NET Core中的依赖注入(3): 服务的注册与提供
- 【Scikit-Learn 中文文档】使用 scikit-learn 介绍机器学习 | ApacheCN
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用 Horoscope 测试 TiDB 优化器
- 聊聊claudb的importRDB
- 【17期】什么情况用ArrayList or LinkedList呢?
- YOLO V3网络结构解析
- 文献笔记二十一:PhenoGram可视化染色体上的信息
- 【动手学深度学习笔记】之对模型参数的访问、初始化和共享
- 【动手学深度学习笔记】之构造MLP模型的几种方法
- 【动手学深度学习笔记】之通过丢弃法缓解过拟合问题
- 【动手学深度学习笔记】之通过权重衰减法解决过拟合问题
- 【动手学深度学习笔记】之多层感知机实现
- Linux程序员效率工具:比man更好用的命令提示工具
- 我对torch中的gather函数的一点理解
- 冒泡排序的实现思路和优化方案
- Java Map转对象
- 59.Vue 使用webpack构建vue项目