【devops】rsync介绍和使用
本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》从问题中去学习k8s
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
《DBA》db的介绍使用(mysql、redis、mongodb...)
rsync介绍
# 什么是rsync同步工具,把一台机器上的文件传输到另一台。rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及曾量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝 # rsync官方地址 [TP](https://rsync.samba.org/) # rsync监听端口:873 # rsync运行模式:c/s # rsync特性 支持拷贝特殊文件,如连接文件、设备等。 可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。 可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。 可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。 支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。 ## 远程,scp scp 源文件 目标 # 推文件 scp /tmp/yum.log root@10.0.0.41:/root # 推目录 scp -r /etc root@10.0.0.41:/root # 拉文件 scp root@10.0.0.41:/root /tmp/yum.log # 拉目录 scp -r root@10.0.0.41:/root /etc ssh:22 ftp:21 rsync:873 C/S 架构: Client/Server # 客户端/服务器 B/S Browser/Server # 浏览器/服务器 端口的范围:1-65535
小提示:利用rsync还可以实现删除文件和目录的功能,这又相当于rm命令,一个rsync相当于scp、cp、rm,但是还优于他们的每一个命令。
rsync备份类型
- 全量备份(支持):将产生的所有需要备份的文件或目录全部进行备份 - 增量备份(支持):基于上一次备份做的数据备份 - 差异备份(不支持差异备份):基于全量备份做的数据备份,也就是上一次如果也是差异,则可以直接将上一次备份删除
Rsync的传输模式
本地传输模式(类似命令cp)
# 语法 Local: rsync [OPTION...] SRC... [DEST] ## 拷贝文件 [root@backup ~]# rsync /root/3 /usr/local/src/ ## 拷贝目录 [root@backup ~]# rsync -a /etc /usr/local/src/
远程传输模式(类似命令scp)
-
这种模式是借助SSH的通道进行传输(ssh端口)
## Access via remote shell:Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]# 拉:rsync [选项...] 用户名@主机IP:路径 本地文件或目录[root@backup ~]# rsync -avz root@172.16.1.7:/etc/hostname /usr/local/games/Push: rsync [OPTION...] SRC... [USER@]HOST:DEST# 推:rsync [选项...] 本地文件或目录 用户名@主机IP:路径[root@backup ~]# rsync -avz /backup/2020-05-06_web01_etc.tar.gz root@10.0.0.7:/tmp/
-
权限不足报错
rsync: mkstemp "/root/.host_ip.sh.nrcrr0" failed: Permission denied (13) rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
守护进程模式(服务)
## 语法:(不管是推还是拉都是在客户端的操作) ## Access via rsync daemon:(通过rsync守护进程访问) # 拉:rsync [-avz] zls_bak@10.0.0.41::[模块] 源文件 目标 方法一: Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 例如:(将备份服务器对应(zls)模块中的文件拉取到本地/tmp中) rsync -avz zls_bak@10.0.0.41::zls /tmp --password-file=/etc/rsync.pass 方法二: rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST](忘记它)# 推:rsync [-avz] 源文件 zls_bak@10.0.0.41::[模块] 目标 方法一: Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 例如:(将本地文件推送到备份服务器(zls_bak)虚拟用户,指定模块(zls)的对应路径中) rsync -avz /etc/shadow zls_bak@10.0.0.41::zls --password-file=/etc/rsync.pass 方法二: rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST(忘记它)注意:推和拉的区别,就是源文件的位置在哪里,拉:源文件在后面。## rsync 重要选项(通常使用-avz即可满足大部分需求) -a #归档模式传输, 等于-tropgDl -v #详细模式输出, 打印速率, 文件数量等 -z #传输时进行压缩以提高效率 --delete #让目标目录和源目录数据保持一致 --password-file=xxx #使用密码文件,这里指服务端保存在客户端的密码文件路径------------------- -a 包含 ------------------ -r #递归传输目录及子目录,即目录下得所有目录都同样传输。 -t #保持文件时间信息 -o #保持文件属主信息 -p #保持文件权限 -g #保持文件属组信息 -l #保留软连接 -D #保持设备文件信息 -----------------------------------------------L #保留软连接指向的目标文件 -e #使用的信道协议,指定替代rsh的shell程序 --exclude=PATTERN #指定排除不需要传输的文件模式 --exclude-from=file #文件名所在的目录文件 --bwlimit=100 #限速传输 --partial #断点续传 --delete #让目标目录和源目录数据保持一致 --password-file=xxx #使用密码文件
--delte实现无差异同步
# 1. 在服务端配置文件中多增加一个模块(写在/etc/rsyncd.conf文件结尾)[tcy]comment = xixipath = /tcy# 2. 对应路径进行创建[root@backup /backup]# mkdir /tcy# 3. 对路径修改权限[root@backup /backup]# chown -R rsync.rsync /tcy# 4. 对服务重启[root@backup /backup]# systemctl restart rsyncd# 5. 对服务端模块路径模拟创建文件[root@backup /backup]# cd /tcy[root@backup /tcy]# touch aaa[root@backup /tcy]# touch bbb# 6. 客户端操作[root@nfs /]# export RSYNC_PASSWORD=123 # delete后面只能接目录并且需要将目录后接"/" 如:/etc/# 如将/etc/换成一个文件,则直接将文件备份到服务端中,不会对服务端其他文件产生影响[root@nfs /]# rsync -avz --delete /etc/ rsync_backup@172.16.1.41::tcy
-
同步文件,发现原本服务端文件会删除
Rsync的Limit限速
#企业案例: 某DBA使用rsync拉取备份数据时,由于文件过大导致内部交换机带宽被沾满,导致用户的请求无法响应 [root@nfs01 ~]# export RSYNC_PASSWORD=zls [root@nfs01 ~]# rsync -avz --bwlimit=1 rsync_backup@172.16.1.41::backup/ /data/
rsync+inotify
-
扩展rsync结合inotify实现实时同步(详细操作见博客园nfs章节)
# 存在理由 - inotify可对目录实时监控,当产生文件或目录时将作出相应操作,一般结合rsync使用# 参数 -m 持续监控 -r 递归 -q 静默,仅打印时间信息 --timefmt 指定输出时间格式 --format 指定事件输出格式 %Xe 事件 %w 目录 %f 文件 -e 指定监控的事件 access 访问 modify 内容修改 attrib 属性修改 close_write 修改真实文件内容 open 打开 create 创建 delete 删除 umount 卸载# 服务安装(对客户端安装) yum -y install inotify-tools# 命令测试 - 当/backup目录出现创建,修改,删除,修改属性,写入内容时,将在屏幕输出信息 /usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /backup# 书写脚本(监控目录,当发生变化则及时进行同步到备份服务器,脚本需要手动执行,脚本运行后就放后台处理了) [root@backup ~]# vim rsyn-inotify.sh #!/bin/bash dir=/backup /usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;docd $dir && rsync -az -R --delete . rsync_backup@172.16.1.31::backup --password-file=/etc/rsync.passwd >/dev/null 2>&1 done &
案例操作①
要求:
web01,web02 都是客户端写脚本,每天晚上23:00备份,给etc目录打包,推送到backup服务器的/backup目录下文件名:2020-05-06_web01_etc.tar.gz 2020-05-06_web02_etc.tar.gz
主机名 | wanIP | lanIP | 角色 |
---|---|---|---|
web01 | 10.0.0.7 | 172.16.1.7 | 客户端 |
web02 | 10.0.0.8 | 172.16.1.8 | 客户端 |
backup | 10.0.0.41 | 172.16.1.41 | 服务端 |
安装服务端
服务端:我们把备份的文件放在谁磁盘上,谁就是服务端
# 1. 安装rsync [root@backup ~]# yum install -y rsync # 2.修改配置文件(一般来说是以.conf 或 .cnf 或 .cfg结尾) [root@backup ~]# vim /etc/rsyncd.conf ## 指定进程启动uid uid = rsync ## 指定进程启动gid gid = rsync ## rsync服务的端口 port = 873 ## 无需让rsync以root身份运行,允许接收文件的完整属性 fake super = yes ## 禁锢指定的目录 use chroot = no ## 最大连接数 max connections = 200 ## 超时时间 timeout = 600 ## 忽略错误 ignore errors ## 不只读(可读可写) read only = false ## 不允许别人查看模块名 list = false ## 传输文件的用户 auth users = rsync_backup ## 传输文件的用户和密码文件 secrets file = /etc/rsync.passwd ## 日志文件 log file = /var/log/rsyncd.log ##################################### ## 模块名 [zls] ## 注释,没啥用 comment = 123 ## 备份的目录 path = /backup# 3.根据配置文件内容,创建出来需要的用户,目录,密码文件... # 3.1 创建用户 [root@backup ~]# useradd rsync -s /sbin/nologin -M # 3.2 创建备份目录 [root@backup ~]# mkdir /backup # 3.3 修改属组和属主 [root@backup ~]# chown -R rsync.rsync /backup/ # 3.4 创建用户名和密码存放的文件 [root@backup ~]# vim /etc/rsync.passwd rsync_backup:123# 3.5 修改密码文件的权限为600 [root@backup ~]# chmod 600 /etc/rsync.passwd# 4.启动服务并且加入开机自启 [root@backup ~]# systemctl start rsyncd [root@backup ~]# systemctl enable rsyncd# 5.检测端口 [root@backup ~]# netstat -lntup|grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 18373/rsync tcp6 0 0 :::873 :::* LISTEN 18373/rsync # 6.检测进程 [root@backup ~]# ps -ef|grep [r]sync root 18373 1 0 20:48 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
查看服务端端口是否开启
安装客户端
-
rsync客户端不用修改配置文件
# 1.安装rsync [root@web01 ~]# yum install -y rsync # 2.客户端需要创建一个密码文件 [root@web01 ~]# vim /etc/rsync.pass # 密码是服务端存放的密码 123 # 3.修改密码文件的权限为600 [root@web01 ~]# chmod 600 /etc/rsync.pass # 4.从客户端往服务端推送重要备份文件 rsync [-avz] 源文件 zls_bak@10.0.0.41::[模块] rsync -avz /etc/shadow rsync_backup@10.0.0.41::zls --password-file=/etc/rsync.pass# 5.从客户端拉取重要备份文件 rsync -avz rsync_backup@10.0.0.41::zls /tmp/ --password-file=/etc/rsync.pass # 方式二:脚本中使用,强烈推荐方式 [root@nfs01 ~]# export RSYNC_PASSWORD=zls
-
客户端web02安装服务,(web01同样操作)
-
客户端新建一个文件,保存服务端连接的密码,(web01同样操作)
-
修改密码文件权限为600,(web01同样操作)
-
写脚本,内容为打包etc目录 为此格式:2020-05-06_web02_etc.tar.gz,然后进行推送到backup中,(web01同样操作)
-
书写定时任务,(web01同样操作),每晚23点执行此脚本