Linux下实现文件实时同步(rsync命令+rsync作为服务+xinetd托管rsync)
Posted 何翰宇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下实现文件实时同步(rsync命令+rsync作为服务+xinetd托管rsync)相关的知识,希望对你有一定的参考价值。
文章目录
一、rsync概念
1. 什么是rsync
- sync同步:刷新文件系统缓存,强制将修改过的数据写入磁盘块
- async异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘
- rsync远程同步 =>remote synchronous
数据同步过程:
- sync数据同步 ——> 保存文件(目标) ——> 强制把缓存中的数据写入磁盘(立即保存),适合实时性比较高的场景
- asyn数据异步 ——> 保存文件(目标) ——> 将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘,适合大批量数据同步场景
2. rsync的特点
- 可以镜像保存整个目录和文件系统
- 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
- 支持匿名传输,方便网站镜像;也可以做验证,加强安全
- 传输效率高,使用同步算法,只比较变化的(增量备份)
比如A服务器某个目录有:file1.txt,file2.txt,file4.txt
B服务器有:file1.txt,file2.txt
用rsync
实现数据同步,B服务器只同步 file3.txt文件(增量备份)
3. rsync和scp的区别
两者都可以实现远程同步,但是相对比而言,rsync能力更强
- 支持增量备份
- 数据同步时保持文件的原有属性
二、rsync用法
1. 基本语法
本地文件同步:rsync [选项] [文件或目录] [要同步到的位置]
远程文件同步
- 远程获取文件:
rsync [选项] [用户名]@[目标主机ip]:[目标主机资源路径] [本机路径]
- 远程上传文件:
rsync [选项] [本机路径] [用户名]@[目标主机ip]:[目标主机路径]
常用选项:
-v
详细模式输出-a
归档模式,递归的方式传输文件,并保持文件的属性,相当于-rlptgoD
选项-r
递归拷贝目录-l
保留软链接-p
保留原有权限-t
保留原有时间(修改)-g
保留属组权限-o
保留属主权限-D
等于–devices --specials 表示支持b,c,s,p类型的文件-R
保留相对路径-H
保留硬链接-A
保留ACL策略-e
指定要执行的远程shell命令,ssh更改端口常用选项-E
保留可执行权限-X
保留扩展属性信息 a属性
2. 本机同步
本地文件同步简单理解就是把文件从一个位置到另外一个位置,类似于cp
命令
示例:创建三个目录dir1
、dir2
、dir3
,在dir1
中创建三个文件 file1、file2、file3,使用rsync本地同步
创建目录命令:mkdir dir1..3
在dir1下创建文件:touch dir1/file1..3
把/dir1目录中的所有文件拷贝到/dir2目录中
把/dir1目录整体同步到/dir3目录中
命令:rsync -av /dir1/ /dir2
命令:rsync -av dir1/ dir3
1) -R(保留相对路径)
示例1:rsync -R选项的应用(保留相对路径)
也就是同步文件加不加/
都是同步整个目录,如果不加-R
选项,加/
就是同步目录里的内容,如果不加就是连目录一起同步
2)- -delete
删除目标目录里多余的文件,
命令:rsync -av --delete dir1/ dir2/
3. 远程同步
1)上传文件到远程服务器
命令:rsync -av [本地文件或目录] [远程用户名]@[远程服务器的IP地址]:[目标路径]
示例1:把testc文件传输到远程服务器端的hhy用户(192.168.44.134)
命令:rsync -av test.c hhy@192.168.44.134:/home/hhy
示例2:把tmp文件夹传输到远程服务器端的hhy用户的根目录下(192.168.44.134)
命令:rsync -av tmp hhy@192.168.44.134:/home/hhy
查看目标服务器
2)下载文件到本地服务器
命令:rsync -av [远程用户名]@[远程服务器ip]:[目标文件或目录] [保存到本地位置]
示例1:把远程服务器(192.168.44.134)的/etc/hosts文件下载到本地
命令:rsync -av hhy@192.168.44.134:/etc/hosts ./
示例2:把远程服务器(192.168.44.134)hhy用户根目录下的code文件夹下载到本地
3)免密同步
rsync远程同步数据时,默认情况下为什么需要密码?如果不想要密码同步怎么实现?
rsync在远程同步时,之所以要输入密码的主要原因在于其底层还是基于SSH服务的。SSH有两种认证方式,如果没有配置免密则默认使用用户名+密码的认证方式。
不想要密码同步,可以考虑使用SSH免密操作。
在代码主机上生成公钥和私钥
命令:ssh-keygen -t rsa -P ""
-t rsa
:指定生成非对称加密-P ""
:不需要一路回车确定
把生成的公钥发送给备份主机
命令:ssh-copy-id hhy@192.168.44.134
测试免密同步
从代码服务器上传dir1目录到备份服务器hhy用户根目录
命令:rsync -av dir1 hhy@192.168.44.134:/home/hhy
如果备份服务器更改了SHH的默认端口号怎么办?
命令:rsync -e "ssh -p 7420" -av dir1 hhy@192.168.44.134:/home/hhy
-e
:指定执行远程shell命令,这里是用来指定ssh端口号为7420
4. rsync作为服务
默认情况下,rsync只是作为一个命令来进行使用的(ps在查询进程时,找不到对应的服务),但是rsync提供了一种作为系统服务的实现方式。
注意:如果rsync作为系统服务单独运行,则其底层就不需要SSH服务了!
Linux系统服务的思路:
对外提供服务——>端口监听——>启动服务——>启动脚本(rsync没有启动脚本)——>配置文件
- 第一步启动
rsyncd
服务
命令:systemctl start rsyncd
- 第二步:查看rsyncd服务的配置文件
/etc/rsyncd.conf
# uid = nobody 用户编号
# gid = nobody 所属组编号
# use chroot = yes 是否禁锢目录(如果设置了禁锢目录就只能在指定目录下进行同步)
# max connections = 4 最大连接数
# pid file = /var/run/rsyncd.pid 进程文件,每个服务都有一个pid编号,其来源就是pid文件
# exclude = lost+found/ 传输文件时,忽略 lost+found/目录
# transfer logging = yes 传输日志是否需要写入日志文件,yes代表写入
# timeout = 900 传输超时时间,默认15分钟
# ignore nonreadable = yes 是否忽略不可读文件
# dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 一下格式文件不压缩
三、rsync+crontab自动同步
某公司为了保证开发人员线上代码的安全性,现需要对开发人员的代码进行备份
- 备份机
backups
需要每天凌晨3:23分定时同步code服务器的/code/java
目录下的所有文件。 - 要求记录同步日志,方便同步失败分析原因(不仅仅进行同步,还要求有同步日志)
1. 环境准备
主机ip | 主机名 | 角色 |
---|---|---|
192.168.44.37 | code | 代码服务器 |
192.168.44.125 | backup | 代码备份服务器 |
代码服务器配置
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.44.37
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=114.114.114.114
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
备份服务器配置:
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=192.168.44.125
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=114.114.114.114
NAME="ens33"
DEVICE="ens33"
ONBOOT="yes"
如果是图形化界面,就关闭NetworkManager。
防止配置Ip出问题
systemctl stop NetworkManager
systemctl disable NetworkManager
2. 任务解决方案
1. code服务器
第一步:准备代码文件
命令
[root@code ~]# mkdir -p code/java
[root@code ~]# mkdir code/java/test1..4
[root@code ~]# touch code/java/Main1..6.java
第二步:把rsync作为系统服务运行
在/etc/log/
下创建日志文件
修改配置文件 vim /etc/rsyncd.conf
[java]
# 要同步的目录
path=/root/code/java
# 同步的日志文件
log file=/var/log/rsync.log
启动rsyncd服务
命令:systemctl start rsyncd
查看rsyncd进程:ps -ef grep rsync
监听端口号:netstat -tnlp | grep rsync
rsyncd的默认端口号是837
2.backup备份服务器
第一步:启动rsync服务:systemctl status rsyncd
第二步:创建备份目录:mkdir -p backup/code/java
第三步:测试rsync是否可以连接到rsync服务
命令:rsync -a root@192.168.44.37::
-a
:获取同步目录标签
第四步:下载文件到本地
命令:rsync -av root@192.168.44.37::java /root/backup/code/java
java代表代码服务器/etc/rsyncd.conf
配置文件中的标签,同步[java]标签的那个path目录的文件
第五步:编写计划任务+shell的脚步,实现代码自动备份
编写计划任务:每天凌晨3:23备份代码文件
可以先用每分钟测试
命令:crontab -e
编写:* * * * * /root/rsync_java.sh
再创建并编写rsync_java.sh
脚本程序
编写一下内容
rsync -av root@192.168.44.37::java /root/backup/code/java &>/dev/null
&>/dev/null
:表示把同步的信息不显示出来
最后给rsync_java.sh
加上可执行权限
命令:chmod +x rsync_java.sh
在代码服务器编写代码,就能在备份服务器自动同步了
3. 给rsync服务添加密码
在code服务器
第一步:编辑配置文件:/etc/rsyncd.conf
[java]
path=/root/code/java # 同步这个目录
log file=/var/log/rsync.log # 日志文件
auth users = java,test # 用户名
secrets file = /etc/rsyncd.secrets # 密码文件
第二步:在/etc目录下创建rsyncd.secrets
密码文件
vim /etc/rsyncd.secrets
java:123456 # 用户名:密码
test:654321
第三步:更改密码文件rsyncd.secrets
权限为600
命令:chmod 600 /etc/rsyncd.secrets
第四步:重启rsyncd服务
命令:systemctl restart rsyncd
第五步:在backup备份服务器测试
命令:rsync -av test@192.168.44.37::java /root/
注意:用户一定是在rsyncd.conf
配置文件里有,并且在密码配置文件rsyncd.secrets
配置过密码的
四、 rsync+inotify实现代码实时同步
inotify有什么用?
inotify提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序
Inotify可用于检测单个文件,也可以检测整个目录。当检测的对象是一个目录的时候,目录本身和目录里的内容都会成为检测的对象。
注意代码实时同步要开启免密同步
实现code代码服务器上的/root/code/java
目录的文件和backup备份主机上的/root/backup/code/java
目录实时同步
1. 安装 inotify
第一步在code服务器安装 inorify-tools
工具(监控器)
解压文件:tar -xzf inotify-tools-3.13.tar.gz -C tmp/
到tmp目录下
第二步:到解压目录下执行文件
执行文件./configure
对软件进行配置,没有指定安装目录,就会安装到默认目录
第三步:编译+安装文件
编译命令:make
安装命令:make install
安装后会产生两个命令
/usr/local/bin/inotifywait
等待
/usr/local/bin/inotifywatch
看守
2. inotifywait命令
-
-m
: 一直监控某个目录,create、delete、modify等行为 -
-r
: 递归,不仅仅监控目录还要监控目录下的文件 -
-q
: 获取操作信息,但是不输出 -
-e
: 哪些行为需要被监控,modify,delete,create,attrib,move
modify: 文件被修改
delete: 文件被删除
create: 文件被创建
attrib: 文件属性被修改
move: 文件被移动
3. 编写inotify.sh
在code主机上编写inotify.sh
脚本文件
/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib,move /root/code/java |while read events
do
rsync -av --delete /root/code/java root@192.168.44.125:/root/backup/code/java
echo "`date +%F\\ %T`出现事件$events" >> /var/log/rsync.log 2>&1
done
只要代码主机上/root/code/java
的文件发生变化,就会马上同步到备份主机上的/backup/code/java
目录下
4. 添加可执行权限
给inotify.sh
脚本文件添加可执行权限:chmod +x inotify.sh
5. 让inotify.sh文件一直执行下去
命令:nohup ./inotify.sh &
- & : 让
inotify.sh
在计算机后台运行,可以使用jobs
命令查看,kill %
编号结束,当我们退出终端时,这个执行会自动结束 - nohup : 让程序一直在后台运行,即使我们关闭了终端
6. 测试
只要在代码服务器进行删除或者创建文件等操作,就会被inotifywait
检测到。
通过命令查看日志文件:cat /var/log/rsync.log
五、rsync托管xinetd
独立服务 :有独立启动脚本的比如:ssh、ftp
依赖服务:没有独立启动脚本的,比如:rsync
依赖服务的特点:
- 平时不占用系统的运行资源
- xinetd服务管理依赖服务
- 一些轻量级服务会托管给xinetd服务
1. 如何将rsync托管给xinetd服务去管理
1. 安装xinetd
命令:yum -y install xinetd
查看xinetd的相关文件目录:rpm -ql xinetd
其中:/etc/xinetd.d
目录为:xinetd服务管理的所有轻量级服务的目录
2. 了解配置文件
1)通过man 5 xinetd.conf
查看配置文件信息
配置文件位置/etc/xinetd.conf
- only_from:只允许访问
- no_access:拒绝访问
- access_times:控制访问服务的时间段
- log_type:指定日志类型
- interface:并发连接数
- per_source:每个IP的最大连接数
- includedir /etc/xinetd.d :子配置文件目录((追加rsync、telnet))
3. 创建配置文件
在/etc/xinetd.d
下,创建配置文件rsync
写入一下内容
service rsync
disable = no
flags = IPv6
socket_type = stream
wait = no
user = root
server = /usr/bin/rsync
server_args = --daemon
log_on_failure += USERID
- disable = no //开关;no表示开启该服务;yes表示关闭服务
4. 重启xinetd服务
注意:xinetd服务重启后,rsync服务也会随之重启,检查端口占用
先杀死rsync
命令:pkill rsync
再启动xinetd服务:systemctl restart xinetd
根据rsync的默认端口873查找服务:ss -naltp | grep 873
在查询873端口占用时,发现只有xinetd服务,没有rsync服务,原因:rsync => xinetd
如果我们在启动xinetd服务时,发现系统中的873端口一直没有被占用,只能有一个问题:配置文件有错误!
解决方案:cat /var/log/messages
以上是关于Linux下实现文件实时同步(rsync命令+rsync作为服务+xinetd托管rsync)的主要内容,如果未能解决你的问题,请参考以下文章
(转)Linux下通过rsync与inotify(异步文件系统事件监控机制)实现文件实时同步
linux下rsync+inotify实现服务器之间文件实时同步
linux rsync远程同步+sersync+rsync实现实时同步