一、rsync远程同步
1、什么是rsync远程同步
rsync是C/S架构的数据镜像备份工具,可以实现全量备份和快速增量备份支持本地复制或ssh、rsync主机同步。
rsync默认端口为 873
rsync特性:可以在不通主机之间镜像同步整个目录树,支持增量备份、保持链接和权限、时间、属性且传输前自动执行压缩、rsync不需要特殊权限即可安装,centos系统默认安装,支持匿名传输,注意发起端要有对应目录位置的读权限
2、rsync备份类型
完全备份:每次备份将备份源所有文件或目录备份到目的。
差量备份:备份上次完全备份以后有变化的数据。
增量备份:备份上次完全备份以后有变化的数据。
3、rsync同步方式
①本地复制:首先是将源文件和目的位置文件对比找出差异,然后将源文件与目的位置的差异部分进行一致性同步。
②上行同步:客户端与服务端同步内容,可以理解为客户端从服务器上下载内容
③下行同步:服务端与客户端同步内容,可以理解为客户端将内容上传到服务器
4、rsync命令使用
基本格式:rsync [选项] 原始位置 目的位置
注意:原始位置文件夹若加/则是同步文件夹下所有内容,不包括文件夹本身,若需要整个目录同步则不加/
选项 作用
r 递归,包含目录中所有文件
l 对符号链接仍然复制为符号链接
v 显示同步过程
z 传输时进行压缩
a 归档模式,保留所有属性权限等
e 指定使用什么方式同步ssh等
p 保留文件夹权限的标记
t 保留文件夹时间的标记
g 保留文件属组的标记(只能root使用)
o 保留文件属主的标记(只能root使用)
H 保留硬链接文件
A 保留ACL属性信息
D 保留设备文件及其他特殊文件
delete 删除目的位置有但是原始位置没有的文件同步客户端和服务端数据
checksum 根据校验和(不是文件大小、修改时间)来决定是否跳过文件
password-file password-file=密码文件位置,可以在同步时使用免交互登录
5、rsync同步的表达方式
格式1:rsync -avz 用户名(rsync用户)@主机地址::模块名 文件
例子:rsync -avz [email protected]::wwwroot /opt/
格式2:rsync -avz rsync://用户名(rsync用户)@主机地址/模块名 文件
例子:rsync -avz rsync:// [email protected]/模块名 文件
二、rsync下行同步实验部署
1、实验环境
客户端ip 服务端ip
192.168.30.11 192.168.30.13:873
2、服务端配置
mkdir /var/www/html -p
#创建要同步的文件夹
vim /etc/rsyncd.conf
#编辑rsync服务配置文件
文件内容:
uid = root #用户id,注意不用root使用rsync同步时可能会报错
gid = root #组id,注意不用root使用rsync同步时可能会报错
use chroot =yes #开启禁锢目录,只允许模块授权的源路径
address =192.168.30.11 #监听的地址即server地址
port 873 #监听地址的那个端口
log file =/var/log/rsyncd.log #日志文件位置
pid file =/var/run/rsyncd.pid #pid文件位置
hosts allow = 192.168.30.0/24 #允许谁使用
max connections = 4 #最大连接数
[lhjhtml] #模块名称
path = /var/www/html #源文件路径
comment = Document root of www.lhj.com #模块说明,随便写
read only =yes #是否只读
dont comperss = *.gz *.bz2 *.tgz *.zip *.rar *.z #这些类型结尾的文件不压缩
auth users = lhj cxx #授权可登录用户 lhj cxx 多用户以空格隔开
secrets file = /etc/rsyncd_users.db #rsyncd服务账户密码文件位置,保存退出
vim /etc/rsyncd.users.db #编辑rsyncd账户密码文件
lhj:123456 #添加账户密码,以:隔开
cxx:123456 #添加完成后保存退出
chmod 600 /etc/rsyncd_users.db #修改rsyncd服务文件权限为只允许属主可读写
rsync --daemon #启动rsyncd服务
netstat -antp |grep rsync #查看是否启动成功
echo "test rsync">/var/www/html/a.txt #同步源目录中创建文件a.txt内容为"test rsync"
3、客户端配置
mkdir -p /opt/ky26 #创建client同步接收文件位置
chmod 777 /opt/ky26 #接收文件位置权限添加
vim /etc/server.pass #创建免交互密码文件将密码输入
123456 #lhj和cxx的密码为123456
chmod 600 /etc/server.pass #秒交互密码文件只允许属主可读写
rsync -avz --password-file=/etc/server.pass [email protected]::lhjhtml /opt/ky26 同步到ky26文件夹中
注意:若同步失败需要先在client上ssh一下server登录再退出。
注意:如果报错为 error: some files/attrs were not transferred (see previous errors) (code 23)t main ,c(1179) [sender=3.1.2]则是因为rsyncd.conf配置文件中的uid和组id不是root
cat /opt/ky26/a.tx#client上验证是否有a.txt
三、rsync实时同步部署
1、实验环境及原理
客户端ip | 服务端ip |
192.168.30.11 |
192.168.30.13:873 |
2、服务端配置
#基于下行同步完成的情况下
vim /etc/rsyncd.conf
read only =no
#关闭下行同步的只读,保存退出
kill `cat /var/run/rsyncd.pid`
#杀死rsync进程即关闭服务
rsync --daemon
#开启rsync服务
chmod 777 /var/www/html
#给lhjhtml模块的目录加权限
3、客户端配置
#查看inotify内核参数
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 #优化inotify内核参数
fs.inotify.max_queued_events = 32768
fs.inotify.max_user_instances = 1024
fs.inotify.max_user_watches = 1048576
sysctl -p #加载内核生效
4、安装inotify
#客户端安装inotify
yum install gcc gcc-c++ -y #安装编译工具
cd /opt
#将安装包放入/opt下
tar zxvf inotify-tools-3.14.tar.gz
#解压安装包
cd inotify-tools-3.14
./configure && make && make install
#编译安装inotify
#编写脚本监控客户端/var/www/html目录,当这个目录发生改变时使用rsync同步上传到服务端
vim inotify.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e create,delete,move,modify,attrib /var/www/html"
RSYNC_CMD="rsync -azH --delete --password-file=/etc/server.pass /var/www/html [email protected]::lhjhtml"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 0 ] ; then
$RSYNC_CMD
fi
done
#脚本内容解析:定义2个变量,变量INOTIFY_CMD监控客户端的/var/www/html文件夹。变量RSYNC_CMD执行rsync同步将/var/www/html/文件夹内容同步上传到服务端。将变量INOTIFY_CMD监控标准输入结果传给while函数,while函数读取若有后面这些关键字则执行if语句,当执行过滤rsync命令行数小于等于0则执行变量$RSYNC_CMD
5、验证实时同步
cd /opt/
chmod +x inotify.sh
./inotify.sh
执行脚本后会在前台执行占用窗口,重新开个窗口执行以下命令验证
cd /opt/ky26
echo "123">1.txt
然后到服务端查看是否上传完成
四、rsync删除大量数据
1、本地复制删除
mkdir -p /date/blank
#建立一个空的文件夹
mkdir -p /date/test
cd /date/test
touch {1..10000}
#模拟/date/test文件中有1万个文件数据
rsync --delete-before -avH --progress --stats /home/blank /date/test
#使用rsync删除/date/test目录中的文件,用空文件夹同步了test文件夹
选项说明:
--delete-before 接收者在传输进行删除操作
-a 归档模式,表示以递归方式传输文件,并保持所有文件属性-H 保持硬连接的文件
-v 详细输出模式
-H 保持硬连接的文件
--progress 在传输时显示传输过程
--stats 给出某些文件的传输状态
cd /date/test
ls
#进入查看数据为空
2、rsync+inotify实时同步删除
#基于以上rsync+inotify实时同步实验
服务端:
mkdir -p /date/test
touch {1..10000}
#模拟/date/test文件中有1万个文件数据
客户端:
/opt/inotify.sh
#运行inotify.sh,前台运行需要再开启一个窗口
新窗口
cd /var/www/html
echo " ">a.txt
rm -rf *
创建一个空给a.txt
然后再服务端验证/date/test中文件夹已全部删除只有刚同步的a.txt文件