day33 备份服务器rsync的学习

day33_备份服务器rsync的学习

学习的背景

目的是为了数据的安全和备份

1: 主动的数据的备份上传
2: crontab + rsync 每五分钟定时的备份数据
3: 部署rsync服务,服务端在被动的接受客户端的传递过来的数据
  • 1.下载rsyncd
  • 2.修改配置的文件
  • 3.使用该服务器

rsync备份的方式

这是全量的备份的方式:但是效率太低,重复相同的文件

'增量备份的方式':可以降低重复的文件,只复制变更的文件

在数据库中,已经有了相同的文件,就可以不再重新的复制相同的文件。

在这里我要提一个问题

问题: 如果程序启动报错应该怎么办?
看日志,看日志,看日志,看日志,看日志,看日志,这个很重要

#因该怎么样看日志:
如果nginx 的服务启动时失败
1.看nginx 服务指定的日志的文件在什么地方
2.用systemctl status nginx 查看日志信息。

快捷的备份的方式 cp 文件{,.bak}

1.命令的说明

  • 通过rsync的命令,来实现,数据目录A拷贝数据到B也就是模拟了cp的用法
rsync [选项] 数据源 目标的数据

1.安装
yum install rsync -y


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


- 本地模式

rsync 参数   源路径  目标路径

rsync  -xxxxx    /var/log    /tmp



- 远程模式,推送方式,把自己的数据推送到另一台机器上(上传)
语法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/








参数解释
    -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


2.本地模式

以后cp命令就可以放在一旁啦,用rsync当cp使用

# 1.对于文件的同步
把var/log/message 拷贝到 /opt下:

[root@rsync-41 ~]# rsync -avzP /var/log/messages /opt
sending incremental file list
messages
        673,187 100%   61.08MB/s    0:00:00 (xfr#1, to-chk=0/1)

sent 94,547 bytes  received 35 bytes  189,164.00 bytes/sec
total size is 673,187  speedup is 7.12
[root@rsync-41 ~]# 

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

# 2.对于目录的同步(注意语法的区别)

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

得到的是: 
[root@rsync-41 ~]# ll /opt
total 660
drwxr-xr-x 7 root root    232 Mar 20 22:23 log
-rw------- 1 root root 673187 Mar 20 22:06 messages

的到的是log的文件夹,文件夹下包含了log的所有的文件


拷贝log下的所有的文件不是下载log的文件

[root@rsync-41 ~]# rsync -azvP /var/log/  /opt 



#3. 无差异化的拷贝
# 语法如下:
  rsync -azvP --delete  /test1/   /test2/
使用--delete参数 将目标目录的数据清空,保证完全和源目录的数据一致

# 也就是说 --delete 会删除目标文件夹,直到和原文件夹一模一样。

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

2.1 这里在格外的提一点

对rsync限速,因为rsync在传输数据时,会占用大量的磁盘IO,以及如果是网络传输的话,占用网络带宽,会导致其他程序受影响

所以rsync这样的备份服务,都是在夜里,凌晨操作,被影响其他程序




--bwlimit


3. 远程模式

说白了就是 scp命令的进阶的版本
#PUSH 推送模式,上传模式

把rsync-41   /root下的数据,拷贝到 nfs-31   /tmp下

登录rsync41
用ip形式、再用主机名形式
添加无差异化参数,该参数,慎用!搞清楚了你在做什么!

rsync -avzP  --delete  /root/    root@172.16.1.31:/tmp/

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

rsync -avzP   root@172.16.1.41:/root/    /tmp/

# 拉取rsync41的/etc/passwd文件到 nfs-31的/opt下,使用主机名通信

rsync -avzP root@rsync-41:/etc/passwd    /opt/

  • 说了很多来个练习

当前的机器在nfs-31

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

rsync -azvP root@rsync-41:/root/  /tmp/

# 拉取rsync41的/etc/passwd文件到 nfs-31的/opt下,使用主机名通信

[root@nfs-31 ~]# rsync -avzP  root@172.16.1.41:/etc/passwd /opt

#传输目录注意

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

rsync -avzP   root@172.16.1.41:/root    /tmp/

#只传输目录下的文件,不包含目录本身
rsync -avzP   root@172.16.1.41:/root/    /tmp/

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

#坑:如果/和一个空目录进行完全同步,那么效果和删根一样

#坑:传输过程不限速导致带宽被占满 ,--bwlimit=50

远程传输 nfs-31下的 /tmp/2G.log   备份到  rsync-41的/opt下

rsync -avzP   /tmp/2G.log   root@172.16.1.41:/opt

-a   保持文件原有属性
-v   显示传输过程
-z   压缩传输数据
-P   显示传输进度

远程备份文件,且改名
[root@nfs-31 /tmp]#rsync -avzP   /tmp/2G.log   root@172.16.1.41:/opt/2G.logggggggggggggggggggggg

远程传输 nfs-31下的 /tmp/2G.log   备份到  rsync-41的/opt下,且是无差异化备份
等于清空原有/opt下的数据

rsync -avzP --delete   /tmp/2G.log   root@172.16.1.41:/opt/2G.log

4.关于rsync服务的模式-服务端的配置

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

说白了就是为了保护机器的安全性的问题

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.创建用户以及数据目录

根据你的配置文件中定义的信息,创建对应的用户,备份的目录
该无法登录的用户,只是用于运行进程的账户
useradd -u 1000 -M -s /sbin/nologin www
#这样的用户存在的意义是为了运行某个程序的
[root@rsync-41 ~]# grep 'www' /etc/passwd
www:x:1000:1000::/home/www:/sbin/nologin

创建配置文件中定义的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_backup:chaoge666

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.加入开机自启动

设置rsyncd服务,运行,且开机自启

systemctl start rsyncd


检查rsyncd服务是否运行,以及该服务的运行日志 

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

Apr 20 11:46:57 rsync-41 systemd[1]: Started fast remote file copy program daemon.
Apr 20 11:46:57 rsync-41 systemd[1]: Starting fast remote file copy program daemon...
Apr 20 11:46:57 rsync-41 rsyncd[6078]: params.c:Parameter() - Ignoring badly formed line in config file: ignore errors
Apr 20 11:46:57 rsync-41 rsyncd[6078]: rsyncd version 3.1.2 starting, listening on port 873
[root@rsync-41 ~]#
[root@rsync-41 ~]#

6.检查服务是否运行

systemctl status rsyncd


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

[root@rsync-41 ~]#ps -ef|grep 'rsync' | grep -v 'grep'
root       6078      1  0 11:46 ?        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      6078/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      6078/rsync     



5.rsync客户端的操作

1.安装rsync

yum install rsync -y

2.配置密码文件及授权

此时rsync客户端,需要把数据推送到rsync服务端
但是需要账户认证,这个账户密码,是服务端指定好的
回头去看笔记
rsync_backup
chaoge666

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

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

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

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

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

把数据的模块,发送到服务端的bakup的备份的模块下
语法,不一样了,注意语法的写法!!!

吧客户端的 /tmp/200M.log 备份,发送到rsync-41机器上的 backup模块下
rsync -avzP   /tmp/200M.log  账户@主机名::模块名

rsync -azvP /tmp/200M.log rsync_backup@rsync-41::backup


非交互式密码的操作,如下2个方法
1. 生成密码文件,每次连接都指定这个密码文件(在客户端生成)

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

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

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


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


rsync -avzP    /tmp/200M.log  rsync_backup@rsync-41::backup


下载备份服务器的数据

reync -avzP rsync_backup@rsync-41::back /tmp/

去back的模块下载到 客户端的/tmp/下


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

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


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

非交互式的密码认证方式
非交互式密码的操作,如下2个方法
1. 生成密码文件,每次连接都指定这个密码文件(在客户端生成)

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

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

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



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


rsync -avzP    /tmp/200M.log  rsync_backup@rsync-41::backup



6最后是关于rsync的常见的错误

关于Rsync 服务的排除的错误

1.检查rsync 服务端的配置文件路径是否正确/etc/rsyncd.conf

  1. 查看配置文件的 host,,allow,,host deny允许的IP的网段是否允许客户端的访问
  2. 查看配置文件中的path参数路劲是否存在,权限是否正确
  3. 查看rsync服务是否启动,端口,进程是否存活
  4. 查看iptables 防火墙 ,selinux是否是允许rsync服务是否能通过,或是关闭。
  5. 查看服务端配置文件的密码文件的权限是否600,格式语法是否正确。

关于Rsync客户端的排除错误

  1. 查看rsync客户端的配置文件的权限是否600,密码的文件的格式是否正确。是否和服务端的一致。
  2. 尝试telent服务端的873端口,检查服务的端口可以链接
  3. 客户端执行命令的语法要检查,切记要细心。。
posted @ 2025-03-20 17:24  国家一级冲浪yzk  阅读(49)  评论(0)    收藏  举报