文章目录 一、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 ?
|