Rsyuc备份服务器

一、备份

1、什么是备份

备份就是把重要的数据或者文件复制一份保存到另一个地方,实现不同主机之间的数据同步
一般数据比较重要的情况下,数据如果丢失很容易找不回来了的,建议备份。

2、为什么做备份

数据在公司中是很重要!!!!
备份就是为了恢复
将原有的数据复制一份或几份存起来,以备不时之需。

3、必须做备份吗?

对于重要的数据一定要备份
对于不重要的数据可以不备份或者备份一部分
建议一定要做备份

4、备份的工具

本地备份:cp
远程备份:scp   rsync
scp	 :全量备份
rsync:增量备份

二、scp命令

1、概念及参数

概念:
    Linux scp 命令用于 Linux 之间复制文件和目录。
    scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
    scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。
 
 格式:
     1)、推数据:将本机的文件上传到其他服务器
    	scp [参数] [本机文件的路径] [用户]@[ip]:[远程主机的路径]

    2)、拉数据:将其他服务器上的文件下载到本机  
        scp [参数] [用户]@[ip]:[远程主机的路径] [本机文件的路径]

选项参数
    -1: 强制scp命令使用协议ssh1
    -2: 强制scp命令使用协议ssh2
    -4: 强制scp命令只使用IPv4寻址
    -6: 强制scp命令只使用IPv6寻址
    -B: 使用批处理模式(传输过程中不询问传输口令或短语)
    -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
    -p:保留原文件的修改时间,访问时间和访问权限。
    -q: 不显示传输进度条。
    -r: 递归复制整个目录。
    -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
    -c: cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh 。
    -F: ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
    -i: identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
    -l: limit: 限定用户所能使用的带宽,以Kbit/s为单位。
    -o: ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
    -P: port:注意是大写的P, port是指定数据传输用到的端口号 
    -S: program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。

2、案例

# 开启两个服务器:db01、rsync
案例1:将DB01服务器上etc目录中所有的普通文件打包,备份到rsync服务器的/tmp目录中
    [root@db01 ~]# tar -czPf etc.tar.gz $(find /etc/ -type f)   
    [root@db01 ~]# scp /root/etc.tar.gz root@172.16.1.41:/tmp
    
案例2:要求rsync服务器主动备份db服务器的etc.tar.gz
	[root@rsync tmp]# scp root@172.16.1.51:/root/etc.tar.gz /tmp/
	
案例3:要求备份etc.tar.gz文件,且时间尽可能不改变
	[root@rsync tmp]# scp -p root@172.16.1.51:/root/etc.tar.gz /tmp/         # 使用-p参数
	[root@rsync tmp]# stat etc.tar.gz   stat:查询文件的创建时间、访问时间、修改时间
	
案例4:要求将db01的/root目录上传到rsync的/tmp目录中
	[root@db01 ~]# scp -r /root/ root@172.16.1.41:/tmp             # 使用-r参数
	
案例5:要求将db01的/root目录上传到rsync的/tmp目录中,并限制带宽
	[root@db01 ~]# scp -r -l 1000 /root/ root@172.16.1.41:/tmp     # 使用-l参数

三、Rsync服务介绍

1、简介

    rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
 
rsync官方地址:https://rsync.samba.org/
rsync监听端口:873
rsync运行模式:C/S   client/server  # 客户端/服务端
 
rsync简称叫做远程同步,可以实现不同主机之间的数据同步,还支持全量和增量

2、rsync特性

支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。

3、应用场景

cron + rsync : 跟定时任务进行绑定。		
rsync + innotify : 以守护进程的方式同步文件

4、可能遇到的问题

1)、传输存在的问题
	推的问题:当客户端服务器数量过多,容易造成数据推送缓慢
	拉的问题:当客户端服务器数量过多,容易造成服务端压力过大
    
现在有2000台服务器,怎么有效快速的缓解推和拉存在的问题
# 可以分段备份,上海的备份上海的,北京备份北京的,然后都传到云服务

2)、rsync的备份架构
	灾备:当出现自灾害时,可以切换到别的城市的服务器里,也可以正常使用
	熔灾:当出现自灾害时,可以切换到别的城市的服务器里,也可以正常使用

四、Rsync传输模式

rsync常用参数

# 常用组合:-avzP
-a           :归档模式传输, 等于-tropgDl    -t -r -o -p -g -D -l
-v           :详细模式输出, 打印速率, 文件数量等
-z           :传输时进行压缩以提高效率
-r           :递归传输目录及子目录,即目录下得所有目录都同样传输。
-t           :保持文件时间信息
-o           :保持文件属主信息
-p           :保持文件权限
-g           :保持文件属组信息
-l           :保留软连接
-P           :显示同步的过程及传输时的进度等信息
-D           :保持设备文件信息
-L           :保留软连接指向的目标文件
-e           :使用的信道协议,指定替代rsh的shell程序
--exclude=PATTERN   	:指定排除不需要传输的文件
--exclude-from=file 	:排除不需要的文件
--bwlimit=100       	:限速传输
--partial           	:断点续传
--delete            	:让目标目录和源目录数据保持一致
--password-file=xxx 	:使用密码文件
--port  	:指定端口传输

1、本地传输

本地方式(类似于cp,不支持推送和拉取,只是单纯的复制)
	格式:
		rsync [参数] [原来的路径] [现在的路径]

1.1参数的使用

案例1:将/tmp/etc.tar.gz上传到/mnt目录下
	[root@rsync tmp]# rsync /tmp/etc.tar.gz /mnt/    # 本地传输类似于cp命令
	
案例2:将/tmp/etc.tar.gz上传到/mnt目录下,并且同步时间
	[root@rsync tmp]# rsync -t /tmp/etc.tar.gz /mnt/  # 使用-t参数:同步时间
	
案例3:将/root目录传输到/mnt目录
	[root@rsync tmp]# rsync -r /root/ /tmp/			# 使用-r参数:递归传输
	
案例4:将test用户创建的文件传输到root用户/mnt中,并保持属主和属组的权限
	[root@rsync tmp]# rsync -o -g /tmp/1.txt /mnt/   # 使用-o -g参数,不加参数默为root.root
	
案例5:将1.txt传输到tmp中,并保持权限不变
	[root@rsync root]# rsync -p /root/1.txt /tmp/      # 使用-p参数,保持权限不变
	
案例6:将1.txt传输到mnt中,并保持软链接不变
    [root@rsync tmp]# ln -s /tmp/1.txt /tmp/2.txt	   # 创建软链接
    [root@rsync tmp]# rsync -l /tmp/2.txt /mnt/	       # 使用-l参数,保持软链接不变
    
案例7:使用-a参数实现上边所有的功能
	[root@rsync tmp]# rsync -a /tmp/2.txt /mnt/       # -a包含:-t -r -o -p -g -D -l
	
案例8:将3.txt传输到mnt中,并显示同步的过程及传输时的进度等信息
	[root@rsync tmp]# rsync -avzP --partial /tmp/3.txt /mnt/
	
案例8:将3.txt传输到mnt中,并限制速率
	[root@rsync tmp]# rsync -avzP --bwlimit=100 /tmp/3.txt /mnt/

2、远程传输

1.推数据
	格式:
		rsync [参数]  [本地文件路径] [用户]@[ip]:[远程路径]
		
2.拉数据
	格式:
		scp [参数] [用户]@[ip]:[远程主机的路径] [本机文件的路径]
		
案例:将db01的3.txt传输到rsync服务器上的/mnt目录
	[root@rsync tmp]# rsync -avzP root@172.16.1.51:/mnt/3.txt /tmp   使用的拉数据
 
案例:将3.txt传输到db01服务器上的/mnt目录
    [root@rsync tmp]# rsync -avzP /tmp/3.txt root@172.16.1.51:/mnt   # 使用的推数据
    
rsync               # 命令
-avzP               # 选项
3.txt               # 当前服务器的本地文件
root                # 远端服务器的系统用户
@                   # 分隔符
172.16.1.51         # 远端主机的IP地址
:                   # 分隔符,代表主机下的....
/mnt                # 远程主机的目录

3、以守护进程的方式传输

一、为什么需要以守护进程的方式传输

    1、保证数据安全
    2、数据归档

二、部署服务端步骤

    1、编写rsync的守护进程的配置文件
        1)、编写配置文件
            /etc/rsyncd.conf

            uid = rsync				
            gid = rsync
            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 = welcome to oldboyedu backup!		
            path = /backup

        2)、创建rsync的启动用户
        	[root@rsync tmp]# useradd rsync -r -M -s /sbin/nologin

        3)、创建密码文件
        	[root@rsync tmp]# touch /etc/rsync.passwd

        4)、创建用户和密码关联数据
        	[root@rsync tmp]# echo 'rsync_backup:123456' > /etc/rsync.passwd 

        5)、授权密码文件
        	[root@rsync tmp]# chmod 600 /etc/rsync.passwd
        	
    2、创建备份的目录
        1)、创建目录
        	[root@rsync tmp]# mkdir /backup

        2)、将目录的用户修改成rsync
            [root@rsync tmp]# chown rsync.rsync /backup/

        3)、启动rsync服务
            [root@rsync tmp]# systemctl start rsyncd
            
    3、测试
    	1)、查看端口
    		[root@rsync ~]# yum install net-tools -y  # 安装netstat
    		[root@rsync ~]# netstat -nutlp            # 查看端口

3.1部署客户端

部署客户端

1、安装rsync

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

2、开始传输的几种方式

    1)、输入密码传输
    [root@db01 opt]# rsync -avzP /opt/3.txt rsync_backup@172.16.1.41::backup   # backup:模块名

    2)、使用密码文件
        [root@db01 ~]# echo "123456" > /etc/rsync.passwd
        [root@db01 ~]# chmod 600 /etc/rsync.passwd    # 权限必须设置600,不然不能用
        [root@db01 ~]# rsync -avzP /mnt/3.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
        
    3)、使用环境变量的方式进行传输
         [root@db01 ~]# export RSYNC_PASSWORD=123456
         [root@db01 ~]# rsync -avzP /opt/3.txt rsync_backup@172.16.1.41::backup

五、Rsync常见的错误

1.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backu@172.16.1.41::backup
Password: 
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
#原因:1)虚拟用户的用户名或者密码错误,2)服务端密码文件权限不为600
 
2.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
ERROR: password file must not be other-accessible
rsync error: syntax or usage error (code 1) at authenticate.c(196) [sender=3.1.2]
#原因:客户端密码文件权限不是600
 
3.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backu
@ERROR: Unknown module 'backu'
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
#原因:模块名字错误
 
4.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::/backup
ERROR: The remote path must start with a module name not a /
rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2]
#原因:双冒号后面跟的是模块名字,而不是目录名字不要加/
 
5.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): No route to host (113)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
#原因:防火墙开启,没有配置防火墙规则
[root@backup ~]# firewall-cmd --add-port=873/tcp
success
 
6.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
Password: 
sending incremental file list
rewriteip.sh
rsync: mkstemp ".rewriteip.sh.vx4Cry" (in backup) failed: Permission denied (13)
 
sent 207 bytes  received 128 bytes  44.67 bytes/sec
total size is 194  speedup is 0.58
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
#原因:selinux没有关闭
 
7.报错内容:
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
sending incremental file list
rsync: delete of stat xattr failed for "rewriteip.sh" (in backup): Permission denied (13)
 
sent 55 bytes  received 114 bytes  338.00 bytes/sec
total size is 194  speedup is 1.15
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2]
#原因:服务端备份目录权限不是rsync
 
8.报错内容
[root@web01 ~]# rsync -avz 1.txt rsync_backup@172.16.1.41::backup
rsync: failed to connect to 172.16.1.41 (172.16.1.41): Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(125) [sender=3.1.2]
#原因:服务端服务没有启动
 
9.报错内容
[root@web01 ~]# rsync -avz 1.txt rsync_backup@10.0.0.41::backup 
sending incremental file list
rsync: read error: Connection reset by peer (104)
rsync error: error in socket IO (code 10) at io.c(785) [sender=3.1.2]
#原因:服务端配置错误,导致启动问题

六、Rsync + inotify

常用参数

-m		:持续监控
-r		:递归
-q		:静默,仅打印时间信息
--timefmt :指定输出时间格式
--format :指定事件输出格式
    %Xe 事件
    %w 目录
    %f 文件
-e 指定监控的事件
    access 访问
    modify 内容修改
    attrib 属性修改
    close_write 修改真实文件内容
    open 打开
    create 创建
    delete 删除
    umount 卸载

inotify监控目录

怎样实现rsync根据目录的变化去实时同步数据。
inotify就是实时监控目录中文件的变化。

1、安装inotify(客户端)
	[root@db01 ~]# yum -y install inotify-tools

2、测试inotify监控目录
	[root@db01 ~]# inotifywait  -mr  --format "%Xe %w %f" -e modify,close_write,create,delete /opt/

3、实时同步/opt目录
    [root@db01 ~]# inotifywait -mr --format "%Xe %w %f" -e modify,close_write,create,delete /opt/ | while read line ;do  rsync -avzP /opt/  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd ; done


4、文艺青年版
	1)、编写脚本
		[root@db01 ~]# vim inotify.sh
#!/bin/bash
DIR=/opt/
USERNAME=rsync_backup
IP="172.16.1.41"
MODULE=backup


inotifywait -mr --format "%Xe %w %f" -e modify,close_write,create,delete ${DIR} | while read line ;do  rsync -avzP ${DIR}  ${USERNAME}@${IP}::${MODULE} --password-file=/etc/rsync.passwd &>/dev/null; done

	2)、执行脚本
		[root@db01 ~]# chmod +x inotify.sh
		[root@db01 ~]# ./inotify.sh

实战习题

需求:

客户端需求:
	1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
	2.客户端在本地打包备份(将etc目录中所有的普通文件打包)拷贝至/backup/nfs_172.16.1.31_2018-09-02
	3.客户端最后将备份的数据进行推送至备份服务器
	4.客户端每天凌晨1点定时执行该脚本
	5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间

服务端需求:
	1.服务端部署rsync,用于接收客户端推送过来的备份数据
	2.服务端需要每天校验客户端推送过来的数据是否完整?md5sum
	3.服务端需要每天校验的结果通知给管理员
	4.服务端仅保留6个月的备份数据,其余的全部删除

解决:

客户端需求:
	1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02
		[root@db01 ~]# mkdir -p /backup/nfs_172.16.1.31_`date +%F`  # 创建备份目录
		[root@db01 ~]# systemctl restall rsync  # 启动服务
		
	2.客户端在本地打包备份(将etc目录中所有的普通文件打包)拷贝至/backup/nfs_172.16.1.31_2018-09-02
		[root@db01 ~]# tar -czPf /backup/nfs_172.16.1.31_2021-10-20/etc.tar.gz $(find /etc/ -type f)
		[root@db01 ~]# cd /backup/nfs_172.16.1.31_`date +%F`     进入目录
		[root@db01 nfs_172.16.1.31_2021-10-20]# md5sum etc.tar.gz > md5sum.txt  # 把哈希值传入到md5sum.txt文本中
	
	3.客户端最后将备份的数据进行推送至备份服务器
		[root@db01 ~]# rsync -avzP /backup/ rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
		
	4.客户端每天凌晨1点定时执行该脚本
		[root@db01 ~]# crontab -e
		00 1 * * * /root/rsunc.sh
		
	5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
		[root@db01 ~]# find /backup/ -ctime +7 -name "nfs*" -exec rm -rf {} \;
	
服务端需求:
	1.服务端部署rsync,用于接收客户端推送过来的备份数据
		[root@db01 ~]# yum install rsync -y
		[root@db01 ~]# systemctl restall rsync
		
	2.服务端需要每天校验客户端推送过来的数据是否完整?md5sum
        [root@rsync ~]# cd /backup/nfs_172.16.1.31_`date +%F`/          # 在服务端进入目录   
        [root@rsync nfs_172.16.1.31_2021-10-20]# md5sum -c md5sum.txt   # 使用参数测试文件是否完整
        etc.tar.gz: OK    # 完整的,原理是判断哈希值是否改变来看文件完整
        
	3.服务端需要每天校验的结果通知给管理员
		# 服务端配置邮件功能
		[root@rsync ~]# yum install mailx -y  # 装上邮件软件
		[root@rsync ~]# vim /etc/mail.rc
set from=1069943893@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1069943893@qq.com
set smtp-auth-password=pdaoywghqhxuggcg
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

		[root@rsync ~]# vim rsync-server.sh
		[root@rsync ~]# chmod +x rsync-server.sh
		
cd /backup/nfs_172.16.1.31_`date +%F`/
md5sum -c md5sum.txt
if [ $? -eq 0 ];then
        echo "验证成功" | mail -s "验证结果" 1069943893@qq.com
else
        echo "验证失败" | mail -s "验证结果" 1069943893@qq.com
fi
		[root@rsync ~]# ./rsync-server.sh
		
	4.服务端仅保留6个月的备份数据,其余的全部删除
		[root@rsync ~]# find /backup/ -ctime +180 -name "nfs*" -exec rm -rf {} \;
posted @ 2021-10-19 22:31  迷恋~以成伤  阅读(71)  评论(0)    收藏  举报