rsync服务的搭建
目录
一、rsync介绍
rsync的安装
二、rsync的语法
三、rsync命令使用
1. 本机同步
2. 远程同步
四、rsync作为服务使用
1、尝试启动rsync程序
2、rsync的配置文件介绍
注意事项:
3. rsync+inotify实时同步
3.依赖服务托管xinetd(CentOS 6中rsync)
一、rsync介绍
- rsync的好姐妹
- sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
- async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
- rsync 远程同步:remote synchronous。
- rsync的特点
可以镜像保存整个目录树和文件系统
可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
传输效率高,使用同步算法,只比较变化的(增量备份)
file1.txt file2.txt file3.txt(A服务器)
file1.txt file2.txt(B服务器)
rsync实现数据同步 => 只同步file3.txt => 增量备份
支持匿名传输,方便网站镜像;也可以做验证,加强安全
rsync与scp区别?
两者都可以实现远程同步,但是相对比而言,rsync能力更强。表现在:① 支持增量备份;② 数据同步时保持文件的原有属性。
rsync的安装
yum install rsync -y
#在这里我比较推荐yum安装,比较方便
rsync认证方式
rsync有两种常用的认证方式,一种是rsync-daemon方式(客户端连接873端口,实现数据传输, 传输过程不加密),另外一种是ssh方式(走ssh加密通道)。在 rsync 命令中,如果使用单个冒号(:),则默认使用 ssh 协议; 反之,如果使用两个冒号(::),则使用 rsync 协议。 在平时使用过程,我们使用最多的是rsync-daemon方式。 注意:(1)在使用rsync时,服务器和客户端都必须安装rsync程序。 (2)、rsync-daemon认证方式,需要服务器和客户端都安装rsync服务并且只需要rsync服务器端启动rsync,同时配置rsync配置文件。 客户端启动不启动rsync服务,都不影响同步的正常进行。(3)ssh认证方式,不需要服务器和客户端配置rsync配置文件 只需要双方都安装rsync服务,并且也不需要双方启动rsync。
两种认证方式的本质区别:(1)、ssh 协议认证连接的两端是通过管道完成通信和数据传输的,当连接到远程主机时,将在远程主 机 fork 出 rsync 进程使其成为 rsync server;(2)、而 rsync 协议认证是事先在远程主机上运行 rsync 守护进 程,监听套接字等待客户端的连接,建立连接后所有通信方式都是通过套接字完成的。
二、rsync的语法
- man rsync
NAMErsync — a fast, versatile, remote (and local) file-copying tool//一种快速、通用、远程(和本地)的文件复制工具SYNOPSISLocal: rsync [OPTION...] SRC... [DEST]Access via remote shell://通过远程shell访问(命令)Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST:DESTAccess via rsync daemon://通过后台程序访问(作为服务)Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]Push: rsync [OPTION...] SRC... [USER@]HOST::DESTrsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
- rsync命令参数
-v 详细模式输出-a 归档模式,递归的方式传输文件,并保持文件的属性,equals -rlptgoD-r 递归拷贝目录-l 保留软链接-p 保留原有权限-t 保留原有时间(修改)-g 保留属组权限-o 保留属主权限-D 等于--devices --specials 表示支持b,c,s,p类型的文件-R 保留相对路径-H 保留硬链接-A 保留ACL策略-e 指定要执行的远程shell命令-E 保留可执行权限-X 保留扩展属性信息 a属性
三、rsync命令使用
1. 本机同步
注意:
1. 本地数据同步的时候,源目录后面的“/”会影响同步的结果# rsync -av /dir1/ /dir3 //只同步dir1目录下面的文件到指定的路径# rsync -av /dir1 /dir2 //将当前目录dir1和目录下的所有文件一起同步2. -R:不管加不加"/",都会将源数据的绝对路径一起同步# rsync -avR /dir1/ /dir2/
3. --delete:删除目标目录里多余的文件# rsync -avR --delete /dir1/ /dir2/
2. 远程同步
pull: rsync -av user@host:/path local/path
# rsync -av root@10.1.1.1:/etc/hosts /dir1/
# rsync -av root@10.1.1.1:/backup /dir1
push: rsync -av local/path user@host:/path
# rsync -av /dir1/aa1 code@10.1.1.1:/home/code
思考:
rsync远程同步数据时,默认情况下为什么需要密码?如果不想要密码同步怎么实现?
因为两台Linux服务器在连接时,默认使用的还是SSH协议。由于没有做免密登录,所以还是需要输入对方服务器的密码。
如果不想输入密码,可以使用免密登录来实现。
# ssh-keygen
# ssh-copy-id root@10.1.1.250
四、rsync作为服务使用
思路:
对外提供服务——>端口监听——>启动服务——>启动脚本(没有)——>配置文件(修改需求)
1、尝试启动rsync程序
[root@jumper ~]# rsync --daemon
Failed to parse config file: /etc/rsyncd.conf
说明:先尝试以后台程序的方式启动它
原因:没有配置文件(默认没有)
解决:创建配置文件
[root@jumper ~]# touch /etc/rsyncd.conf
[root@jumper ~]# rsync --daemon
[root@jumper ~]# ps -ef|grep rsync
root 3814 1 0 11:43 ? 00:00:00 rsync --daemon
root 3817 2826 0 11:44 pts/0 00:00:00 grep rsync
[root@jumper ~]# netstat -nltup|grep rsync
tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 3814/rsync
tcp 0 0 :::873 :::* LISTEN 3814/rsync
结论:
1. rsync启动时必须要读取配置文件,如果没有报错
2. rsync默认情况下,端口是873,协议tcp#或者启动rsyncd服务(CentOS6中没有,CentOS7中有这个服务)
# systemctl start rsyncd
2、rsync的配置文件介绍
man 5 rsyncd.conf
全局的参数port = xxxpid file = xxx...
局部模块
[模块名1]path = /dir1uid = xxxgid = xxxlog file = xxxmax connections =4.....
[模块名2]path = /dir2uid =xxxgid = xxx.....# 以 rsync 用户启动进程
# 传输文件使用的用户和用户组,如果是从服务器=>客户端,要保证rsync用户对文件有读取的权限;如果是
从客户端=>服务端,要保证rsync对文件有写权限。
uid = rsync
gid = rsync
# uid和gid表明同步上来的文件写入的时候是使用哪个用户身份进行写入的。所以,这个用户必须要对
path 定义的目录有写入权限。否则会在客户端报:rsync: xxx failed: Permission denied (13)
fake super = yes
# 如果设置为yes,那么文件的所有者和所属组信息变成rsync虚拟用户的UID,GID,想要所有者和所属组信
息不变可以设置fake super
use chroot = yes
# 禁锢推送的数据至某个目录, 不允许跳出该目录
#允许chroot,提升安全性,客户端连接模块,首先chroot到模块path参数指定的目录下,chroot为yes时
必须使用root权限,且不能备份path路径外的链接文件max connections = 200 # 最大连接数
timeout = 300 # 超时时间
pid file = /var/run/rsyncd.pid # pid文件路径
lock file = /var/run/rsync.lock # 锁文件路径
exclude = lost+found/ # 剔除某些文件或目录,不同步
transfer logging = yes # 记录传输文件日志
log file = /var/log/rsyncd.log # 指定日志文件
log format = %t %a %m %f %b # 日志文件格式
ignore errors # 忽略错误信息
list = false # 不允许查看模块信息
hosts allow = 192.168.42.0/24 # 只允许192.168.42.0/24段ip连接
hosts deny = * # 不允许所有网段ip连接
dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 设置不需要压缩的文件
path = /home/nebula/backup # 上传的文件存储的目录,下载文件的读目录
comment = nebula userdata backup #共享给客户端看到的名字,可以自己定义
read only = false # backup这个模块儿,是否可以被写入。
auth users = youyou # 虚拟用户名,即就是上传时rsync命令书写中写的。
secrets file = /etc/rsync.password #密码文件,服务端书写格式为虚拟用户名:密码 客户端的书写格式为 虚拟用户所对应的密码# 以下为安全配置,请按照具体的生产环境需求配置。如:上传到服务端上的文件,并不希望被客户端同步
删除refuse options = delete delete-delay delete-before delete-excluded deleteaftermax-delete force partial P
# pre-xfer 用于可以在rsync传送之前,执行一些操作,如建立锁定文件,保证每次只有一个链接进行
数据传输,
# post-xfer 可以保证数据传输完毕之后可以自动执行后续动作。
pre-xfer exec = sh /root/.rsync_pre.sh
post-xfer exec = rm -f /var/rsync.lock
日志文件格式补充:
注意事项:
- 不论是在服务端还是客户端,密码文件的权限都必须是600,否则就会报错。服务端rsync服务是以什么用户运行,则必须保证secrets file文件拥有者必须是同一个。假设root运行rsync --daemon,则secrets file的owner也必须是root;secrets file权限必须是600。
- 在服务器端端尽量将所同步的文件的属主和属组改为rsyncd.conf文件中对应的uid和gid对应的用户和用户组。避面上传和下载的时候发生不必要的错误。
- 要想给服务端的模块下上传文件,就必须要在服务端的配置文件中对相应的模块中添加 read only=false,否则上传文件就会失败。
- auter users中的用户是不用在服务端创建的(只是虚拟存在而已),而uid和gid对应的用户和用户组必须是存在的(一般我们把uid指定为useradd -r系统用户或useradd -M不创建家目录,并且会指定shell为/sbin/nologin);虽然我们在远程上传和本地下载的时候用的是对应的虚拟用户,但是在rsync在验证的是时候是这里uid和gid。
- 没有密码有好处也有坏处,好处是不需要密码方便写脚本做远程同步;坏处就是不安全,但你可以使用防火墙等来加强安全。
- 同步可能出现的问题:
- 如果同步报permission denied这种,可能是服务端selinux没有关闭
- 同步时间慢:解决方法——绑定对方主机名
- 如果你希望有密码,可以用rsyncd本身自带的secrets file来做用户验证
3. rsync+inotify实时同步
需求:app1-server服务器上的/app/java_project目录的文件和backup主机上的/backup目录实时同步
分析:rsync本身不可以做到数据的实时同步,需要借助第三方工具,intotify工具。实现线上环境目录发生改变立马同步到backup主机,是单向同步。参考-------备份端的rsyncd.conf的配置如下:
[my_java] path=/root/java comment=my_java.bak log file=/var/log/rsyncd.log uid=java_user gid=java_user auth users=xiaowang secrets file=/etc/rsyncd.secrets read only=false ignore errors
服务端得创建用户 useradd -s /sbin/nologin -M java_user 服务端的密码文件 echo "xiaowang:123456" >> /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets 客户端的密码文件 echo "123456" >> /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets
步骤:
1. 在服务器端上安装inotify工具
- 原码安装或者结合epel源使用yum 进行安装
- 安装完后,就会产生下面两个命令
/usr/local/bin/inotifywait 等待 、/usr/local/bin/inotifywatch 看守
2. 查看命令如何使用,然后编写脚本来实现目录的监控
- 注意:该脚本应该在备份服务器运行,该服务器是往备份服务器上进行推送
# inotifywait --help
- -m 保持监控状态
- -r 递归监控
- -q 只打印事件
- -e 指定事件
事件:
- move 移动、delete 删除、create 创建、modify 修改、attrib 属性信息
- 编写脚本-----实时监控要镜像备份的目录(脚本我们后面会讲到)
vim /root/inotify.sh#!/bin/bash /usr/bin/inotifywait -mrq -e modify,delete,create,attrib,move /root/java.bak | while read events dorsync -av --delete --password-file=/etc/rsyncd.secrets /root/java.bak/ xiaowang@192.168.17.3::my_java/ &> /dev/nullecho "`date +%F\ %T`出现事件$events" >> /var/log/rsyncd.log 2>&1 done# chmod +x inotify.sh 增加可执行权限 # ./inotify.sh & 将脚本放到后台去运行
注意:
如果单纯使用命令去推的话,正常情况下需要密码,不利于脚本编写,在这里提供2中解决方案:1)设置免密码登录;2)在backup服务器上将rsync作为后台程序运行3. 测试验证
[root@localhost java.bak]# touch file.c [root@localhost java.bak]# rm -rf file.c [root@localhost java.bak]# cat /var/log/rsyncd.log 2025-06-01 22:25:54出现事件/root/java.bak/ CREATE file.c 2025-06-01 22:25:55出现事件/root/java.bak/ ATTRIB file.c 2025-06-01 22:25:56出现事件/root/java.bak/ DELETE file.c
3.依赖服务托管xinetd(CentOS 6中rsync)
独立服务:独立启动脚本 ssh ftp nfs dns …
依赖服务: 没有独立的启动脚本 依赖xinetd服务(独立服务)
- 平时不占用系统的运行资源
- xinetd服务管理依赖服务
- 一些轻量级服务会托管给xinetd服务
如何将rsync托管给xinetd服务去管理?
1. 安装相应的软件
yum -y install xinetd
2. 查看软件类别
rpm -ql xinetd /etc/rc.d/init.d/xinetd /etc/xinetd.conf /etc/xinetd.d xinetd服务管理的所有轻量级服务的目录 /usr/sbin/xinetd /usr/share/man/man5/xinetd.conf.5.gz
3. 查看rsync软件列表
rpm -ql rsync /etc/xinetd.d/rsync /usr/bin/rsync
4. 了解配置文件
- 1)xinetd服务的配置文件
man 5 xinetd.conf only_from 只允许访问 no_access 拒绝访问 access_times 控制访问服务的时间段 log_type 指定日志类型 interface 并发连接数 per_source 每个IP的最大连接数
- 2)rsync配置文件 /etc/xinetd.d/rsync
service rsync {disable = no //开关;no表示开启该服务;yes表示关闭服务flags = IPv6socket_type = streamwait = nouser = rootserver = /usr/bin/rsyncserver_args = --daemonlog_on_failure += USERID }
5. 把rsync服务的开关打开
6. 启动xinetd服务service xinetd restart [root@jumper ~]# netstat -nltp|grep 873 tcp 0 0 :::873 :::* LISTEN 6209/xinetd
到此,rsync服务就托管给了xinetd服务管理;后续需要有些需求,修改配置文件:
/etc/rsyncd.conf、/etc/xinetd.d/rsync
本 篇 完 结 … …
持 续 更 新 中 … …