sync \rsync资源同步

文章目录
一、rsync概念
1. 什么是rsync
2. rsync的特点
3. rsync和scp的区别
二、rsync用法
1. 基本语法
2. 本机同步
1) -R(保留相对路径)
2)- -delete
3. 远程同步
1)上传文件到远程服务器
2)下载文件到本地服务器
3)免密同步
4. rsync作为服务
三、rsync+crontab自动同步
1. 环境准备
2. 任务解决方案
1. code服务器
2.backup备份服务器
3. 给rsync服务添加密码
四、 rsync+inotify实现代码实时同步
inotify有什么用?
1. 安装 inotify
2. inotifywait命令
3. 编写inotify.sh
4. 添加可执行权限
5. 让inotify.sh文件一直执行下去
6. 测试
五、rsync托管xinetd
1. 如何将rsync托管给xinetd服务去管理
1. 安装xinetd
2. 了解配置文件
3. 创建配置文件
4. 重启xinetd服务
一、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 dir{1..3}
在dir1下创建文件:touch dir1/file{1..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
1
2
2. 任务解决方案
1. code服务器
第一步:准备代码文件
命令

[root@code ~]# mkdir -p code/java
[root@code ~]# mkdir code/java/test{1..4}
[root@code ~]# touch code/java/Main{1..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
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值