目录
前言
一、Rsync 远程同步
1.1 rsync 介绍
1.2 rsync 同步方式
1.3 rsync特性
1.4 rsync与cp、scp对比
1.5 rsync实时同步
二、rsync 命令
2.1 命令格式
2.2 常用的参数
2.3 rsync本地复制实例
2.4 配置源的两种表示方法
三、配置 Rsync 源服务器
3.1 rsync 同步源
3.2 配置 Rsync 下行同步
3.2.1 配置环境
3.2.2 将 server 服务器数据备份到 client 服务器
3.2.3 客户端配置client :(192.168.10.14)
3.2.4 关闭rsync 服务
3.3 --delect 用法
扩展:设置周期性计划任务
四、 inotify简介
4.1 inotifywait 命令
4.2 配置Rsync+inotify 实时同步
4.3 配置步骤
4.3.1 server 服务端关闭只读模式并为共享目录赋权
4.3.2 优化 client 客户端 内核参数
4.3.3 客户端(192.168.10.14):编译安装 inotify-tools
4.3.4 客户端启动监听
4.3.5 编写触发同步脚本
扩展:
五、rsync的应用场景
六、总结
在系统管理员的工作中备份无疑是一个重要的部分。当没有完整备份或者良好规划的备份和实施时,就可能或早或晚不可挽回地丢失重要的数据。rsync 无疑是一个很好的选择,下面将介绍rsync的工作过程。
rsync(Remote Sync,远程同步)是一款开源的快速增量备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。
rsync软件支持跨平台,适用于unix/ linux/windows等多种操作系统平台
rsync是一个快速和非常方便的文件复制工具。它能本地复制,远程复制,或者远程守护进程方式复制,它提供了大量的参数来控制其行为的各个方面,并且允许非常灵活的方式来实现文件的传输复制
以其delta-transfer算法闻名。
rsync监听端口:873
rsync运行模式:C/S
官方网址:https://rsync.samba.org/
1. 完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地
2. 差量备份:备份上次完全备份以后有变化的数据(它针对的上次的完全备份,备份过程中不清除存档属性)。
3. 增量备份:备份上次备份以后所有变化的数据(它不管是哪种类型的备份,有变化的数据就备份,会清除存档属性)。
快速
第一次同步时rsync会复制全部内容,但在下一次只传输修改过的文件
rsync在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的宽带
安全
可以使用scp、ssh等方式来传输文件
也可通过直接socket连接
支持匿名传输,以方便进行网站镜像
定期同步的不足:
实时同步的优点:
rsync [选项] 原始位置 目标位置
常用选项 |
解释 |
-v,–verbose |
详细模式输出 |
-q,–quiet |
精简输出模式 |
-c,–checksum |
打开校验开关,强制对文件传输进行校验 |
-a,–archive |
归档模式,表示以递归方式传输文件,并保持所有文件树形,等同于-rlpt |
-z |
在传输文件时进行压缩 |
-r,–recursive |
对子目录以递归模式处理,包含目录及子目录中的所有文件 |
-H,–hard-links |
保留硬链接 |
-l, --links |
保留软链接 |
–delete |
删除目标位置有而原始位置没有的文件(一致性) |
–delete-after |
传输结束以后再删除 |
-A |
保留ACL属性信息 |
-D |
保留设备文件及其他特殊文件 |
-checksum |
根据对象的校验和来决定是否跳过文件 |
-o |
保留文件的属主标记(仅超级用户使用) |
-g |
保留文件的属组标记(仅超级用户使用) |
-t |
保留文件的时间标记 |
注:常用的是-avz
以下两者区别是什么?
rsync -avz abc/ /opt/ :只会拷贝abc目录下面的文件,而不会拷贝abc这个目录
rsync -avz /abc /opt/:会连着目录一起拷贝到/opt下
#如果是rsync -avz abc/ /opt/会是什么情况
cd /opt
mkdir /abc
cd /abc/
touch 1.txt 2.txt
cd /
rsync -avz abc/ /opt/
cd /opt/
ls
#如果是rsync -avz /abc /opt/会是什么情况
cd /opt/
rm -rf *
rsync -avz /abc /opt/
ls
#如果是rsync -avz abc/ /opt/会是什么情况
#如果是rsync -avz /abc /opt/会是什么情况
方法一:
#用户名@主机地址: :共享模块名
rsync -avz [email protected]::wwwroot /root
#backuper指的是我在同步的时候用的哪个用户身份
#wwwroot代表的是模块,模块下面会写同步的默认路径和一些特性,所以我们只需要写模块就好了
#/root指的是本地节点
方法二:
#rsync:/用户名@主机地址/共享模块名
rsync -avz rsync: //[email protected]/wwwroot /root
URL:具体的位置点,例如:http://www.baidu.com./class1/men/id01.html
URI:标识的是拥有同一类特性或类型的一个集合 ,例如http://www.baidu.com./class1/men
在远程同步任务中,负责发起 rsync 同步操作的客户机称为客户端,而负责响应来自客户端的 rsync 同步操作的服务器称为备份源**,也称之为同步源
主机 | 操作系统 | IP 地址 | 主要软件 |
---|---|---|---|
server | CentOS7 | 192.168.10.13 | rsync |
client | CentOS7 | 192.168.10.14 | rsync / inotify-tools-3.14.tar.gz |
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
yum install -y httpd rsync
#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)
vim /etc/rsyncd.conf
#编辑rsync配置文件
uid = root
gid = root
use chroot = yes
address = 192.168.10.13
port 873
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 192.168.10.0/24
[wwwroot]
path = /var/www/html
comment = Document Root of www.yxp.com
read only = yes
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z
auth users = backuper
secrets file = /etc/rsyncd_users.db
----详解----
uid = root #用户id,表示共享权限能执行的身份
gid = root #组id
use chroot = yes #开启,禁锢在源目录,表示允许在访问我备份的目录或文件的时候,使用的角色是root,同时你访问本地目录时拥有的也是root权限
address = 192.168.10.13 #监听地址
port 873 #默认端口号为873
log file = /var/log/rsyncd.log #日志文件存放位置
pid file = /var/run/rsyncd.pid #存放进程id的文件位置
hosts allow = 192.168.10.0/24 #允许访问的主机网段,有点类似于黑白名单
#####################以上是全局配置,以下是模块配#####################
[wwwroot] #共享模块的名称,rsync默认调用该模块,默认我调用的路径是该模块指定的路径
path = /var/www/html #源目录路径
comment = Document Root of www.yxp.com #
read only = yes #是否为只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #同步时不再压缩的文件类型,因为同步时,-avz已经进行压缩
auth users = backuper #授权用户,使用wwwroot模块的用户是哪个用户,多个账户以空格隔开
secrets file = /etc/rsyncd_users.db #存放账号信息的数据文件,一行一个
#小结
第一部分定义共享模块全局模块配置
第二部分:共享模块(可以为多个) 可以对应不同的“源目录” 和授权账号信息
第三部分,此配置文件是为rsync --daemon模式设置的
#如采用匿名的方式,只要将其中的 “auth users” 和 “secrets file”配置项去掉即可
————————————————
vim /etc/rsyncd_users.db
backuper:123123
#编辑用户账号文件,固定格式为[名称:密码],一行一个
chmod 600 /etc/rsyncd_users.db
#官方要求,最好只是赋权600!
rsync --daemon
#开启服务
netstat -natp | grep rsync
#检测端口号,确认服务是否成功开启
cd /var/www/html
#切换至共享目录下
touch 1.txt 2.txtecho "this is 1.txt" > 1.txt
echo "this is 2.txt" > 2.txt
ls
#关闭防火墙及安装机制
#rsync系统一般已默认安装,安装httpd是为了生成/var/www/html目录(后续会用到作为共享目录)
#编辑rsync配置文件
#编辑用户账号文件,固定格式为[名称:密码],一行一个
#官方要求,最好只是赋权600!
#开启服务、检测端口号,确认服务是否成功开启
#切换至共享目录下,创建文件
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
#关闭防火墙及安装机制
yum install -y rsync
#安装rsync
mkdir /abc
cd /abc/
#创建一个目录/abc,用来同步
rsync -avz [email protected]::wwwroot /abc
#使用rsync同步备份源的同步文件
ls
#查看同步是否成功
vim /etc/server.pass
123456
#编辑免交互密钥文件,第一行为密码
chmod 600 /etc/server.pass
#给密钥文件赋权600
rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /abc
#rsync,使用密钥文件/etc/server/pass对应backuper用户,IP地址为192.168.10.13的共享模块文件进行压缩,并归档同步至当前服务器的/abc目录下,同时删除差异内容,如果原目标有的,会增加,原目标没有的,会删除。保持一致性。
ls /abc
#查看下行同步是否成功
#关闭防火墙及安装机制
#安装rsync
#创建一个目录/abc,用来同步
#使用rsync同步备份源的同步文件,并查看是否完成
#编辑免交互密钥文件,第一行为密码
#给密钥文件赋权600
#再次同步验证是否需要密码
kill $(cat /var/run/rsyncd.pid)
或 rm -rf /var/run/rsyncd.pid
--delect 用法 #删除目标位置有而原始位置没有的文件
将源rsync服务器的/var/www/html/ 目录下的文件删除,此时加上–delect,客户端的/abc/目录下的文件被删除,可以看出客户端是目标
应用场景:批量删除
crontab -e
30 22 * * * /usr/bin/rsync -az --delete --password-file=/etc/server.pass [email protected]::wwwroot /opt/
#为了在同步过程中不用输入密码,需要创建一个密码文件,保存 backuper 用户的密码,如 /etc/server.pass。在执行 rsync 同步时使用选项 “--password-file=/etc/server.pass” 指定即可。systemctl restart crond
systemctl enable crond
可以监控文件系统的变动情况,并做出通知响应
#调整inotify内核参数(优化)
letc/ sysctl.conf(内核参数配置文件)
inotifywait: #用于持续监控,实时输出结果
inotifywatch: #用于短期监控,任务完成后再输出结果
max_queue_events #监控事件队列大小
max_user instances #最多监控实例数,可以看成最多可以监控多少个实例
max_user_watches #每个实例最多监控文件数
持续监控并实时输出监控结果的命令
格式:inotifywait [参数]
参数:
-m 持续进行监控
-r 递归监控所有子对象
-q 简化输出信息
-e 指定要监控哪些事件类型
inotify-rsync实际应用原理图:
server (192.168.10.13)
vim /etc/rsyncd.conf
read only = no
#关闭只读模式,否则将不可写入
kill `cat /var/run/rsyncd.pid`
#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式
netstat -natp | grep rsync
#检查一下服务是否已被终止
rsync --daemon
netstat -natp | grep rsync
#再次开启服务并检查端口号确认
#关闭只读模式,否则将不可写入
#修改完配置文件需要重启服务,这里采用直接杀掉进程号的方式
再次开启服务并检查端口号确认
client 客户端 :192.168.10.14
cat /proc/sys/fs/inotify/max_queued_events #监控事件队列
cat /proc/sys/fs/inotify/max_user_instances #最多监控实例数
cat /proc/sys/fs/inotify/max_user_watches #每个实例最多监控文件数
vim /etc/sysctl.conf #加大每个参数
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
#当要监控的目录、文件数据量较多或者变化频繁时,建议加大参数值
sysctl -p
#刷新
#查看参数
#加大每个参数
#刷新
yum install -y gcc gcc-c++
#安装gcc gcc-c++
cd /opt
#切换至/opt上传inotify-tools安装包
tar zxf inotify-tools-3.14.tar.gz
#解压
cd /opt/inotify-tools-3.14/
./configure
make -j 4 && make install
#编译安装
#安装gcc gcc-c++
#切换至/opt上传inotify-tools安装包
进行解压,编译安装
#持续监听对/abc的modify,create,move,delete操作
inotifywait -mrq -e modify,create,delete /abc
它首先经历的2.txt还没被更改,所以现在交换分区中先复制一份到内存中,等修改后,落地到磁盘,删除虚拟内存、交换分区
vim /opt/inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /abc/"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /abc/ [email protected]::wwwroot/"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
----详解----
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /abc/"
#INOTIFY_CMD变量:持续监控 /opt/abc目录中的创建,删除,移动,修改,改变时间的操作
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /abc/ [email protected]::wwwroot"
#RSYNC_CMD变量:使 xixi 用户,/etc/server.pass 密钥文件,将 /xcf1 目录下的文件进行压缩,归档,保留硬链接文件同步至 192.168.10.13 的共享模块定义的目录 /var/www/html 下,并删除差异性内容,保持一致性
$INOTIFY_CMD | while read DIRECTORY EVENT FILE #持续监控...
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then #如果服务并未启动,则执行同步
$RSYNC_CMD
fi
done
----
cd /opt/
chmod +x inotify.sh
#给脚本赋权
chmod +x /etc/rc.d/rc.local
echo "/opt/inotify.sh" >> /etc/rc.d/rc.local
#设置开机自启动
sh -x ./inotify.sh
#执行脚本
cd /abc
touch jingjing.html
rm -rf jiang.html
#创建一个新的html文件并删除之前的qwe
ls
#再次确认一下
#编写脚本
#给脚本赋权
#设置开机自启动
#测试
#执行脚本
进行验证服务端查看文件
//使用rsync来实现快速删除大量文件。
假如要在linux下删除大量文件,比如100万、1000万,像/usr/local/nginx/proxy_temp的nginx缓存等,那么rm -rf * 可能就不好使了,因为要等待很长一段时间。在这种情况下我们可以使用rsync来巧妙处理。rsync实际用的是替换原理。先建立一个空的文件夹:
mkdir /home/blank用rsync删除目标目录:
rsync --delete-before -a -H -v --progress --stats /home/blank /usr/local/nginx/proxy_temp
这样目标目录很快就被清空了
选项说明:
--delete-before 接收者在传输进行删除操作
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性
-H 保持硬连接的文件
-v 详细输出模式
--progress 在传输时显示传输过程
--stats 给出某些文件的传输状态
1、增量同步
2、备份/迁移:可以作为辅助工具(mysql 主从复制 rsync +inotify ——》趋于一致 双向同步——MM,但是只能在并发量不大的时候可以用)
3、假设mysql 从主机A迁移到主机B(一主两从模式)
一主两从模式迁移方案
①确定迁移的时间、业务线停止的时间、要写文档描述具体操作,要发邮件审批
②确认迁移后的节点的环境问题(资源环境 + 系统依赖环境 + mysql内部的格式环境 ------1)例如自增长,自增长可能会导致主从复制不一致的情况 2)版本迁移问题,比如说低版本向高版本迁移。两个版本中的差异比较大,数据迁移比较重要,需要和研发沟通,让研发开发一个工具,让低版本可以转成高版本工具格式,使用工具迁移)
③ 如果数据库是相同版本,可以用rsync + inotify持续同步
④ 测试、之前还要编写回滚方案
⑤ 提交检修申请 22:00 - 00:00
rsync 是一个开源的快速备份工具,可以在不同主机之间镜像同步整个目录树,支持增量备份,并保持链接和权限,且采用优化的同步算法,传输前执行压缩,因此非常适用于异地备份、镜像服务器等应用。