linux rsync文件备份

第1章 Rsync本地模式和远程模式

1.命令说明

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

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

1,安装
yum install rsync -y

[root@rsync-41 ~]#yum install rsync -y


语法命令,分为几个模式
本地模式

rsync  参数  源路径  目标路径

rsync  -avzP  /var/log   /tmp


远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法1,rsync默认走ssh协议
rsync 参数  源路径  root@ip:目标路径

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

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

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

rsync -avzP  root@10.0.0.31:/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    显示文件传输的进度信息


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

脚本里面?
bash xxx.sh
rsync -az  

2.本地模式

linux机器本身,数据来回发送

以后cp命令可以放一边了,用rsync当cp使用就行

创建两个测试文件夹
[root@rsync-41 ~]#mkdir /666
[root@rsync-41 ~]#mkdir /777

在测试文件夹里写入测试数据 1G的文件的小
[root@rsync-41 ~]#dd bs=100M count=10 if=/dev/zero of=/666/1G.log
10+0 records in
10+0 records out
1048576000 bytes (1.0 GB) copied, 4.37126 s, 240 MB/s
[root@rsync-41 ~]#ll -h /666/
total 1000M
-rw-r--r-- 1 root root 1000M Apr 20 15:25 1G.log


# 用rsync,支持增量备份
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
1G.log
  1,048,576,000 100%  117.57MB/s    0:00:08 (xfr#1, to-chk=0/2)

sent 1,019,848 bytes  received 38 bytes  119,986.59 bytes/sec
total size is 1,048,576,000  speedup is 1,028.13
[root@rsync-41 ~]#ls /777/
1G.log

[root@rsync-41 ~]#touch /666/12.log
[root@rsync-41 ~]#rsync -avzP /666/ /777
sending incremental file list
./
12.log
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)

sent 127 bytes  received 38 bytes  330.00 bytes/sec
total size is 1,048,576,000  speedup is 6,355,006.06




对文件同步
[root@rsync-41 ~]#yum install rsync -y
把本地的/777/1G.log 文件 拷贝到/777下

拷贝单个文件

[root@rsync-41 ~]#rsync -avzP /666/1G.log  /777
sending incremental file list
1G.log
  1,048,576,000 100%  121.58MB/s    0:00:08 (xfr#1, to-chk=0/1)

sent 1,019,826 bytes  received 35 bytes  107,353.79 bytes/sec
total size is 1,048,576,000  speedup is 1,028.16


拷贝单个大文件,拷贝大文件时,要注意限速,否则占用磁盘IO太多
--bwlimit=10 就是限制速度为10M每秒

生成一个2G的文件
[root@rsync-41 ~]#dd bs=100M count=20 if=/dev/zero of=/666/2G.log
20+0 records in
20+0 records out
2097152000 bytes (2.1 GB) copied, 2.31622 s, 905 MB/s


iotop查看磁盘的读写IO情况

限制单个大文件的传输,速度只给他20M每秒
[root@rsync-41 ~]#rsync -avzP --bwlimit=20 /666/2G.log  /777
sending incremental file list
2G.log
    659,816,448  31%   20.16MB/s    0:01:09


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

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

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


测试文件夹的增量拷贝
[root@rsync-41 ~]#rsync -avzP /666/  /777
sending incremental file list

sent 108 bytes  received 12 bytes  240.00 bytes/sec
total size is 3,145,728,000  speedup is 26,214,400.00
[root@rsync-41 ~]#echo "123" >/666/12.log 
[root@rsync-41 ~]#rsync -avzP /666/  /777
sending incremental file list
12.log
              4 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=2/4)

sent 157 bytes  received 35 bytes  384.00 bytes/sec
total size is 3,145,728,004  speedup is 16,384,000.02




无差异化拷贝
使用--delete参数,将目标目录数据清空,保证完全和源目录数据一致
rsync -avzP --delete /666/ /777/

[root@rsync-41 ~]#ls /666
12.log  1G.log  2G.log  作业1.log  作业2.log
[root@rsync-41 ~]#ls /777/
12.log  1G.log  2G.log


[root@rsync-41 ~]#rsync -avzP --delete /666/ /777/
sending incremental file list
./
作业1.log
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/6)
作业2.log
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=0/6)

sent 234 bytes  received 57 bytes  582.00 bytes/sec
total size is 3,145,728,004  speedup is 10,810,061.87


[root@rsync-41 ~]#ls /666/
12.log  1G.log  2G.log  作业1.log  作业2.log
[root@rsync-41 ~]#ls /777/
12.log  1G.log  2G.log  作业1.log  作业2.log




rsync拷贝文件夹,携带目录本身
把666目录本身,连带这数据,都拷贝到777下
[root@rsync-41 ~]#rsync -avzP /666  /777/
最终会生成
/777/666/ 该文件夹的数据,和源数据目录/666是一样的
[root@rsync-41 ~]#ls /777
12.log  1G.log  2G.log  666  作业1.log  作业2.log



对rsync限速,因为rsync在传输数据时,会占用大量的磁盘IO,以及如果时网络传输的话,占用网络宽带,会导致其他程序受影响
所以rsync这样的备份服务,都是在夜里,凌晨操作,别影响其他程序


--delete
实现/666 和 /777 完全一样
[root@rsync-41 ~]#rsync -avzP --delete /666/ /777
[root@rsync-41 ~]#ls /666 /777
/666:
12.log  1G.log  2G.log  作业1.log  作业2.log

/777:
12.log  1G.log  2G.log  作业1.log  作业2.log





3.远程模式

把/666下的数据,拷贝到 /999下

把rsync-41   /666下的数据

拷贝到 nfs-31   /888下

实现如scp的作用

PUSH  推送模式 上传模式
把rsync-41  /666下的数据,拷贝到 nfs-31  /888下

登录rsync-41
用ip的形式,再用主机名的形式
添加无差异化参数,该参数,慎用!,搞清楚了你在干什么!


[root@rsync-41 ~]#rsync -avzP --delete /666/  root@172.16.1.31:/888/
输入nfs-31的密码

[root@nfs-31 ~]#ls /888/
12.log  2G.log  作业1.log  作业2.log


PULL  拉取模式(要琢磨,数据最终放在了哪里)
把rsync-41  /666下的数据,拷贝到nfs-31  /888下

[root@nfs-31 ~]#rsync -avzP root@10.0.0.41:/666/   /888/

[root@nfs-31 ~]#ls /888
12.log  2G.log  作业1.log  作业2.log

拉取rsync-41的/etc/passwd文件到 nfs-31的 /888下,使用主机名通信

[root@nfs-31 ~]#rsync -avzP root@rsync-41:/etc/passwd  /888/
[root@nfs-31 ~]#ls /888
12.log  2G.log  passwd  作业1.log  作业2.log

传输整个目录,包含目录本身

[root@nfs-31 ~]#rsync -avzP root@172.16.1.41:/666  /888/

只传输目录下的文件,不包含目录本身

[root@nfs-31 ~]#rsync -avzP root@172.16.1.41:/666/  /888/

不同主机之间同步数据 --delete
rsync -avzP --delete  root@10.0.0.41:/root   /tmp/

坑:如果和一个空目录进行完全同步,那么效果和删库,删根一样
坑:传输过程不限速导致宽带被占满,--bwlimit=30

远程传输  nfs-31下的/888/2G.log  备份到rsync-41的/777下
[root@nfs-31 ~]#rsync -avzP --bwlimit=30 /888/2G.log  root@10.0.0.41:/777
root@10.0.0.41's password: 
sending incremental file list
2G.log
  2,097,152,000 100%   30.81MB/s    0:01:04 (xfr#1, to-chk=0/1)

sent 2,039,554 bytes  received 35 bytes  28,930.34 bytes/sec
total size is 2,097,152,000  speedup is 1,028.22


[root@rsync-41 ~]#ls /777
2G.log

-a   保持文件原有属性
-v   显示传输过程
-z   压缩传输数据
-P   显示传输进度
远程备份文件,且改名
[root@nfs-31 ~]#rsync -avzP /888/作业1.log  root@10.0.0.41:/777/420作业

[root@rsync-41 ~]#ls /777
2G.log  420作业

远程传输 nfs-31下的 /888/  备份到 rsync-41的 /777下,且是无差异化备份
等于清空原有的 /777 下的数据
原有数据
[root@rsync-41 ~]#ls /777
2G.log  420作业

[root@nfs-31 ~]#ls /888
12.log  2G.log  passwd  作业1.log  作业2.log


[root@nfs-31 ~]#rsync -avzP --delete /888/  root@10.0.0.41:/777

[root@rsync-41 ~]#ls /777
12.log  2G.log  passwd  作业1.log  作业2.log

第2章 Rsync服务模式-服务端配置

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

1.安装rsync

yum install rsync -y

2.修改配置文件

复制粘贴如下代码即可

[root@rsync-41 ~]#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_backup
> secrets file = /etc/rsync.passwd 
> log file = /var/log/rsyncd.log
> #####################################
> [backup]
> comment = yuchaoit.cn about rsync
> path = /backup
> 
> [data]
> comment = this is secord backup dir,to website data..
> path = /data
> EOF

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

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

创建配置文件中定义的2个备份目录
[root@rsync-41 ~]#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 16:53 /backup/
drwxr-xr-x 2 www www 6 Apr 20 16:53 /data


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

1.创建密码文件,写入账户和密码,用于和客户端连接时候的认证
[root@rsync-41 ~]#vim /etc/rsync.passwd

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

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

4.这一步,非常重要,rsync要求降低密码文件的权限,且必须是600
[root@rsync-41 ~]#chmod 600 /etc/rsync.passwd 
[root@rsync-41 ~]#ll /etc/rsync.passwd 
-rw------- 1 root root 20 Apr 20 16:58 /etc/rsync.passwd

5.加入开机自启

设置rsyncd服务,运行,且开机自启
[root@rsync-41 ~]#systemctl start rsyncd  启动
[root@rsync-41 ~]#systemctl enable  rsyncd  开机自启


检查rsyncd服务是否运行,以及该服务的运行日志
先备份
[root@rsync-41 ~]#cp /etc/rsync.passwd{,.ori} 
[root@rsync-41 ~]#ls /etc/rsync.passwd*
/etc/rsync.passwd  /etc/rsync.passwd.ori

[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
 Main PID: 2364 (rsync)
   CGroup: /system.slice/rsyncd.service
           └─2364 /usr/bin/rsync --daemon --no-detach

Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.



6.检查服务是否运行

[root@rsync-41 ~]#systemctl status rsyncd
● rsyncd.service - fast remote file copy program daemon
   Loaded: loaded (/usr/lib/systemd/system/rsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-04-20 17:06:57 CST; 4min 27s ago
 Main PID: 2364 (rsync)
   CGroup: /system.slice/rsyncd.service
           └─2364 /usr/bin/rsync --daemon --no-detach

Apr 20 17:06:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 17:06:57 rsync-41 systemd[1]: Starting fast remote file copy program da.....
Apr 20 17:06:57 rsync-41 rsyncd[2364]: params.c:Parameter() - Ignoring badly f...rs
Apr 20 17:06:57 rsync-41 rsyncd[2364]: rsyncd version 3.1.2 starting, listenin...73
Hint: Some lines were ellipsized, use -l to show in full.


无论是学习期间还是上班了,都养成好习惯
给别人启动了某程序后,给自己启动某程序
务必去检查,验证是否正确

[root@rsync-41 ~]#ps -ef |grep 'rsync' |grep -v 'grep'
root       2364      1  0 17:06 ?        00:00:00 /usr/bin/rsync --daemon --no-detach


[root@rsync-41 ~]#netstat -tunlp |grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      2364/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      2364/rsync          

第3章 Rsync服务模式-客户端配置

1.安装rsynv

yum install rsync -y

2.配置密码文件以及授权

此时rsync客户端,需要把数据推送到rsync服务端
但是需要账户认证,这个账户密码,是服务端指定好的
账号:rsync_backup
密码:123456

客户端需要做的操作有2个,提供密码认证

1.生成密码文件,每次连接都指定这个密码文件

2.生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量,以及变量的指,是配置文件中的密码即可

进行客户端数据发送

下载,服务端rsync-41的数据

账号:rsync_backup

密码:123456

推送,备份,发送nfs-31的数据到rsync-41

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

语法,不一样了,注意语法的写法!!!

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

rsync -avzP /tmp/200M.log   账户@主机名::模块名

默认无密码变量,也无密码文件,需要你自己输入该rsync_backup虚拟用户的密码
需要交互式的输入密码,无法在脚本中使用rsync同步命令
rsync基本都是和脚本结合使用

[root@nfs-31 ~]#rsync -avzP /tmp/200M.log rsync_backup@rsync-41::backup

[root@rsync-41 ~]#ls /backup/
200M.log


非交互式密码的操作,如下2个方法
1.生成密码文件,每次连接都指定这个密码文件(在客户端生成)
[root@nfs-31 ~]#echo '123456' > /etc/my_rsync.pwd
还必须降低密码文件的权限才行,必须是600
[root@nfs-31 ~]#chmod 600 /etc/my_rsync.pwd 
[root@nfs-31 ~]#ll /etc/my_rsync.pwd 
-rw------- 1 root root 7 Apr 20 17:47 /etc/my_rsync.pwd

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

[root@rsync-41 ~]#ls /data
200M.log


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


2.生成密码变量,让当前系统中存在叫做 RSYNC_PASSWORD 这个变量 ,以及变量的值,是配置文件中的密码即可
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'


[root@nfs-31 ~]#rsync -avzP  /tmp/200M.log rsync_backup@rsync-41::backup

[root@rsync-41 ~]#ls /backup/
200M.log



下载备份服务器的数据

[root@nfs-31 ~]#rsync -avzP rsync_backup@rsync-41::backup   /888/
receiving incremental file list
./
200M.log
            200 100%  195.31kB/s    0:00:00 (xfr#1, to-chk=0/2)

sent 50 bytes  received 141 bytes  382.00 bytes/sec
total size is 200  speedup is 1.05


[root@nfs-31 ~]#ls /888
200M.log


要输入密码
1.的确没指定密码文件
2.是否有密码变量呢?

如何需要输入密码呢
撤销这个密码变量
[root@nfs-31 ~]#unset RSYNC_PASSWORD 
或者重新登录,只要密码变量失效,就必须输入密码了,或者使用密码文件

rsync -avzP rsync_backup@rsync-41::backup   /tmp/


非交互式的密码认证方式
1.使用密码变量
[root@nfs-31 ~]#export RSYNC_PASSWORD='123456'


2.指定密码文件
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup /tmp/


[root@nfs-31 ~]#ls /tmp/
200M.log  ks-script-U3fLGb  vmware-root  yum.log



错误,文件名不对,示范
[root@nfs-31 ~]#rsync -avzP --password-file=/etc/my_rsync.pwd rsync_backup@rsync-41::backup/200M.logggggggggg  /tmp/
receiving incremental file list
rsync: link_stat "200M.logggggggggg" (in backup) failed: No such file or directory (2)

sent 8 bytes  received 106 bytes  228.00 bytes/sec
total size is 0  speedup is 0.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1651) [Receiver=3.1.2]

关于rsync的常见错误

rsync由于配置步骤比较细节,比较坑多,较多,可能会遇见各种错误

遇见问题,遇见错误

看日志
看日志
看日志
看日志
看日志
思路一:看服务指定的日志文件在哪

思路二:检查是否运行了,以及它的运行日志部分信息

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

systemctl restart  重启服务
systemctl status  查看服务状态
systemctl start  启动服务
systemctl enable 设置服务开机自启
systemctl disable 禁止开机自启

posted @ 2022-04-20 20:57  并不是那么牛  阅读(513)  评论(0编辑  收藏  举报