rsync

rsync

纯通过rsync的命令,来实现,数据目录A 拷贝到数据目录B

也就是模拟cp的用法 很简单

rsync  [选项]  源数据   目的数据

1.安装
yum install rsync -y

2.命令语法,分几个模式

- 本地模式

rsync   参数    源路径    目标路径
rsync  -avzP  /var/log   /tmp

参数解释
-v        详细模式输出
-a        归档模式,递归的方式传输文件,并保持文件的属性,等同于 -rlptgoD
-r        递归拷贝目录
-l        保留软链接
-p        保留原有权限
-t        保留原有时间(修改)
-g        保留属组权限
-o        保留属主权限
-D        等于--devices  --specials    表示支持b,c,s,p类型的文件
-R        保留相对路径
-H        保留硬链接
-A        保留ACL策略
-e        指定要执行的远程shell命令
-E        保留可执行权限
-X        保留扩展属性信息  a属性


比较常用的组合参数
rsync -avzP
-a    保持文件原有属性
-v    显示传输细节情况
-z    对传输数据压缩传输
-P    显示文件传输的进度信息

你在命令行里,执行命令,喜欢看到命令的执行过程 
rsync -avzP

脚本里面不需要看到详细过程
rsync -az  

- 远程模式需要两边的机器都安装rsync
- 远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法1 ,rsync默认走ssh协议
rsync   参数    源路径       user@ip:目标路径
rsync  -avzP  /var/log/   root@10.0.0.31:/tmp/

语法2
rsync 参数 源路径  user@ip::目标路径


- 远程模式,拉取方式,拉取别人机器的数据到自己的机器上(下载)
rsync  参数   user@ip:源路径   目标路径
rsync  参数   user@ip::源路径目标路径

rsync -avzP  root@10.0.0.31:/var/log/   /tmp/


限速

拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多
--bwlimit=10

先生成一个5G文件
dd bs=100M count=50 if=/dev/zero  of=/var/log/my_self.log

rsync -avzP /var/log/my_self.log  /opt

iotop查看磁盘的读写IO情况

限制单个大文件的传输,速度只给他20M每秒


[root@rsync-41 ~]#rsync -avzP --bwlimit=20   /var/log/my_self.log  /opt
sending incremental file list
my_self.log
    393,117,696   7%   20.14MB/s    0:03:55  

对目录同步(注意语法的区别)

拷贝后的数据,携带该目录本身
[root@rsync-41 ~]#rsync -avzP /var/log    /opt

不拷贝该目录本身,拷贝目录下的数据
[root@rsync-41 ~]#rsync -avzP /var/log/    /opt

测试文件夹的增量拷贝

[root@rsync-41 ~]#rsync -avzP /test1/   /test2
sending incremental file list

sent 118 bytes  received 12 bytes  260.00 bytes/sec
total size is 0  speedup is 0.00
[root@rsync-41 ~]#
[root@rsync-41 ~]#
[root@rsync-41 ~]#
[root@rsync-41 ~]#echo "123" >/test1/1.png 
[root@rsync-41 ~]#
[root@rsync-41 ~]#rsync -avzP /test1/   /test2
sending incremental file list
1.png
              4 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=4/6)

sent 175 bytes  received 35 bytes  420.00 bytes/sec
total size is 4  speedup is 0.02

无差异化拷贝

使用--delete参数 将目标目录的数据清空,保证完全和源目录的数据一致

rsync -azvP --delete  /test1/   /test2/

[root@rsync-41 /test2]#rsync -azvP --delete  /test1/   /test2/
sending incremental file list
deleting 行者孙.png
./
白龙马.png
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=0/12)

sent 269 bytes  received 55 bytes  648.00 bytes/sec
total size is 4  speedup is 0.01
[root@rsync-41 /test2]#
[root@rsync-41 /test2]#
[root@rsync-41 /test2]#ls /test1/
1.png  2.png  3.png  4.png  5.png  孙悟空1  孙悟空2  孙悟空3  孙悟空4  孙悟空5  白龙马.png
[root@rsync-41 /test2]#ls /test2
1.png  2.png  3.png  4.png  5.png  孙悟空1  孙悟空2  孙悟空3  孙悟空4  孙悟空5  白龙马.png


# rsync拷贝文件夹,携带目录本身
# 把test1目录本身,连带着数据,都拷贝到test2下
rsync -avzP /test1    /test2/
最终会生成
/test2/test1/ 该文件夹的数据,和源数据目录 /test1是一样的

Rsync服务模式

服务端配置

为什么需要服务模式?
Rsync 借助 SSH 协议同步数据存在的缺陷:
1.使用系统用户(不安全) /etc/passwd
2.使用普通用户(会导致权限不足情况)
3.守护进程传输方式: rsync 自身非常重要的功能(不使用系统用户,更加安全)

1.安装rsync

yum install rsync -y

2.修改配置文件

cat > /etc/rsyncd.conf << 'EOF'
uid = www 
gid = www 
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync
secrets file = /etc/rsync.passwd 
log file = /var/log/rsyncd.log
#####################################
[backup]
comment = chunjueH about rsync
path = /backup

[data]
comment = this is secord backup dir,to website data..
path = /data
EOF

3.创建用户以及数据目录

根据你的配置文件中定义的信息,创建对应的用户,备份的目录
该无法登录的用户,只是用于运行进程的账户
useradd -u 1000 -M -s /sbin/nologin www

创建配置文件中定义的2个备份目录
mkdir -p /data/   /backup

修改备份目录的权限
[root@rsync-41 ~]#chown -R www:www /data/
[root@rsync-41 ~]#chown -R www:www /backup/
[root@rsync-41 ~]#ll -d /data /backup/
drwxr-xr-x 2 www www 6 Apr 20 11:34 /backup/
drwxr-xr-x 2 www www 6 Apr 20 11:34 /data

4.创建rsync专用的账户密码(这一步很重要,有错基本也是来这排查)

1.创建密码文件,写入账户和密码,用于和客户端连接时候的认证
vim /etc/rsync.passwd

2.写入账户密码
[root@rsync-41 ~]#cat /etc/rsync.passwd 
rsync:rsync

3.待会客户端向rsync服务器推送数据,就得用这个账号密码!!!!

4.这一步,非常重要,rsync要求降低密码文件的权限,且必须是600
chmod 600 /etc/rsync.passwd 

[root@rsync-41 ~]#ll /etc/rsync.passwd 
-rw------- 1 root root 23 Apr 20 11:36 /etc/rsync.passwd

5.加入开机自启动

systemctl start rsyncd
systemctl enable rsyncd
检查是否开机运行
systemctl is-enabled rsyncd

客户端配置

1.安装rsync

yum install rsync -y

2.把客户端的数据,发送给服务端的backup备份模块下

把客户端的/tmp/200M.log备份,发送到rsync-41机器上的 backup模块下

方式1(交互式):
rsync -avzP   /tmp/200M.log  账户@主机名::模块名
# 默认无密码变量,也无密码文件,需要你自己输入该rsync虚拟用户的密码
# 需要交互式的输入密码,无法再脚本中使用rsync同步命令
# rsync基本都是和脚本结合使用
rsync -avzP   /tmp/200M.log  rsync@rsync-41::backup

方式2(非交互式):
生成密码文件,每次连接都指定这个密码文件(在客户端生成)

echo 'rsync'  > /etc/my_rsync.pwd
还必须降低密码文件的权限才行,必须是600
chmod 600 /etc/my_rsync.pwd

此时可以传输数据了,往data模块下传输
rsync -avzP  --password-file=/etc/my_rsync.pwd   /tmp/200M.log  rsync@rsync-41::data

如果是脚本中的话,去掉vP显示过程的参数去掉
rsync -az  --password-file=/etc/my_rsync.pwd   /tmp/200M.log  rsync@rsync-41::data

方式3(非交互式):
生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的值,是配置文件中的密码即可
export RSYNC_PASSWORD='rsync'

如果需要输入密码呢?
撤销这个密码变量
unset RSYNC_PASSWORD
或者重新登录,只要密码变量失效,就必须得输入密码了,或者使用密码文件

rsync -avzP /tmp/200M.log  rsync@rsync-41::backup
posted @ 2023-07-28 09:28  村尚chun叔  阅读(42)  评论(0编辑  收藏  举报