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的特点

  1. 可以镜像保存整个目录和文件系统
  2. 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
  3. 支持匿名传输,方便网站镜像;也可以做验证,加强安全
  4. 传输效率高,使用同步算法,只比较变化的(增量备份)
    比如A服务器某个目录有:file1.txt,file2.txt,file4.txt
    B服务器有:file1.txt,file2.txt
    rsync实现数据同步,B服务器只同步 file3.txt文件(增量备份)

3. rsync和scp的区别

两者都可以实现远程同步,但是相对比而言,rsync能力更强

  1. 支持增量备份
  2. 数据同步时保持文件的原有属性

二、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命令

示例:创建三个目录dir1dir2dir3 ,在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没有启动脚本)——>配置文件

  1. 第一步启动rsyncd服务
    命令:systemctl start rsyncd

  1. 第二步:查看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自动同步

某公司为了保证开发人员线上代码的安全性,现需要对开发人员的代码进行备份

  1. 备份机backups需要每天凌晨3:23分定时同步code服务器的/code/java目录下的所有文件。
  2. 要求记录同步日志,方便同步失败分析原因(不仅仅进行同步,还要求有同步日志)

1. 环境准备

主机ip主机名角色
192.168.44.37code代码服务器
192.168.44.125backup代码备份服务器

代码服务器配置

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
依赖服务的特点:

  1. 平时不占用系统的运行资源
  2. xinetd服务管理依赖服务
  3. 一些轻量级服务会托管给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实现实时同步

0基础linux运维教程 Rsync结合inotify实现数据实时同步

Rsync+inotify 实现实时同步数据文件