自学内容网 自学内容网

【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 = xixi
    path = /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
  • 同步文件,发现原本服务端文件会删除

    img

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;do
        cd  $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
主机名wanIPlanIP角色
web0110.0.0.7172.16.1.7客户端
web0210.0.0.8172.16.1.8客户端
backup10.0.0.41172.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

查看服务端端口是否开启

img

安装客户端

  • 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
  1. 客户端web02安装服务,(web01同样操作)

    img

  2. 客户端新建一个文件,保存服务端连接的密码,(web01同样操作)

    img

  3. 修改密码文件权限为600,(web01同样操作)

    img

  4. 写脚本,内容为打包etc目录 为此格式:2020-05-06_web02_etc.tar.gz,然后进行推送到backup中,(web01同样操作)

    img

  5. 书写定时任务,(web01同样操作),每晚23点执行此脚本

    img


原文地址:https://blog.csdn.net/zerotoall/article/details/142376778

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!