架构之Rsync备份服务
架构之Rsync备份服务
1、备份的场景
1.1什么情况下需要备份
数据比较重要情况下(数据如果丢失就可能找不回来了)
1.2什么是备份
原有的数据复制几份,存起来以备不时之需
1.3能不能不做备份
不重要的可以不备份,数据丢失没有什么后果就可以不备份
1.4备份的工具
本地:cp
远程:scp(全量备份)和rsync(增量备份)
scp :每一天把以前所有数据都备份
rsync :每天备份之前没有的(不会产生多余数据)
1.5scp的参数
-p:保留原文件的修改时间,访问时间和访问权限。
mtime atime
-r: 递归复制整个目录。
-l limit: 限定用户所能使用的带宽,以Kbit/s为单位。(限制网络不准,设置50kb 他会慢慢降下来 可能到20~30kb)
-q: 不显示传输进度条。
-v:详细方式显示输出。
1.5.1推数据
本机文件上传到其他服务器
scp [参数] [本机文件路径][用户名]@[ip]:[远程主机的路径]
1.5.2拉数据
其他服务器文件下载到本机.
scp [参数] [用户名]@[ip]:[远程主机的路径] [本机文件路径]
1.5.3scp中参数
案例1:将DB01服务器上etc目录中所有的普通文件打包,备份到rsync服务器的/tmp目录中 推数据
[root@db01 tmp]# tar -czPf etc.tar.gz $(find /etc/ -type f) 先压缩
[root@db01 tmp]# scp /tmp/etc.tar.gz root@172.16.1.41:/tmp/ 传输过去
案例2:要求rsync服务器主动备份db服务器的etc.tar.gz 拉数据
[root@rsync tmp]# scp root@172.16.1.51:/tmp/etc.tar.gz /tmp
案例3:要求备份etc.tar.gz文件,且时间尽可能不改变 推数据
[root@db01 tmp]# scp -p /tmp/etc.tar.gz root@172.16.1.41:/tmp/
案例4:要求将db01的/root目录上传到rsync的/opt目录中 推数据
[root@db01 tmp]# scp -r /root/ root@172.16.1.41:/opt/
2、rsync服务介绍
2.1什么是rsync
远程增量文件备份工具
rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能,这个功能类似于ssh带的scp命令,但是又优于scp命令的功能,scp每次都是全量拷贝,而rsync可以增量拷贝。当然,rsync还可以在本地主机的不同分区或目录之间全量及增量的复制数据,这又类似cp命令。但是同样也优于cp命令,cp每次都是全量拷贝,而rsync可以增量拷贝。
监听端口:873
运行模式:c/s 客户端服务器
2.2rsync的特性
支持拷贝特殊文件,如连接文件、设备等。
可以有排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。 (tar -P)
可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变 –p。
可以实现增量同步,既只同步发生变化的数据,因此数据传输效率很高(tar-N)。
可以使用rcp、rsh、ssh等方式来配合传输文件(rsync本身不对数据加密)。
可以通过socket(进程方式)传输文件和数据(服务端和客户端)*****。
支持匿名的活认证(无需系统用户)的进程模式传输,可以实现方便安全的进行数据备份和镜像。
2.3场景
cron+rsync 可以跟定时任务进行绑定
rsync+innotify:以守护进程方式同步文件
3、Rsync的备份的架构
也是两种方式(推、拉数据)推数据或者拉数据 客户端多的情况 都会造成服务段压力过大
一部分服务器被分到备份源1 一部分服务器被分到备份源2
备份源1和备份源2备份到备份源3
灾备:自然灾害前做的准备 多个地方备份,那个有问题立即启动灾备,立即切换
容灾:
4、Rsync的传输模式
#参数
# -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 #指定端口传输
4.1本地传输
rsync [OPTION]... SRC [SRC]... DEST
命令 选项 源文件路径 目标地址
案例:将/tmp/etc.tar.gz上传到/mnt目录下
[root@rsync tmp]# rsync etc.tar.gz /mnt/
4.2远程传输
#推数据
rsync [参数] [本地文件路径] [用户]@[ip]:[远程路径]
将3.txt传输到db01服务器上的/opt目录
[root@rsync tmp]# rsync -avzP 3.txt root@172.16.1.51:/opt/
先以隐藏方式传过来一个.Xnp的隐藏文件,然后传完改名
#拉数据
rsync [参数] [用户]@[ip]:[远程路径] [本地文件路径]
[root@rsync tmp]# rsync -avzP root@172.16.1.51:/opt/3.txt /tmp/
3.以守护进程的方式
3.1 为什么需要以守护进程方式来传输
3.1.1保证数据安全
3.1.2数据归档(因为每个人传每个人的目录容易乱)
3.2 步骤(服务端)
3.2.1 编写rsync的守护进程配置文件
/etc/人syncd.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
3.2.2 编写rsync的守护进程的配置文件
3.2.2.1创建启动用户,
[root@rsync tmp]# useradd resync -r -M -s /sbin/nologin
3.2.2.2创建密码
[root@rsync tmp]# touch /etc/rsync.passwd
3.2.2.3创建用户(传输用的用户,传输文件用的,不是系统用户)和密码关联数据
[root@rsync tmp]# echo 'rsync_backup:123456' > /etc/rsync.passwd
3.2.2.4 授权密码文件
[root@rsync tmp]# chmod 600 /etc/rsync.passwd
3.2.3 创建备份的目录
3.2.3.1 创建目录
[root@rsync tmp]# mkdir /backup
3.2.3.2 将目录的用户修改成rsync
[root@rsync tmp]# chown rsync.rsync /backup/
3.2.4 启动rsyncd服务
[root@rsync tmp]# systemctl start rsyncd
3.3 步骤(客户端)
3.3.1 安装rsync
[root@db01 tmp]# yum install rsync -y
3.3.2 手动输入密码传输 第一种方式
backup是模块名
[root@db01 tmp]# rsync -avzP /opt/2.txt rsync_backup@172.16.1.41::backup
3.3.2 使用密码文件 第二种方式
客户端先写入密码 只有123456,服务端有密码有用户
[root@db01 ~]# echo "123456">/etc/rsync.passwd
设置权限600
[root@db01 ~]# chmod 600 /etc/rsync.passwd
通过 --password-file=来指定密码文件 传输数据
[root@db01 ~]# rsync -avzP /opt/2.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
3.3.2 使用变量 第三种方式
[root@db01 opt]# export RSYNC_PASSWORD=123456
[root@db01 opt]# rsync -avzP /opt/2.txt rsync_backup@172.16.1.41::backup
#配置文件详解
uid = rsync #(操作系统用户)启动rsync服务的用户id(可以使用名称代替的)
gid = rsync #启动服务用户的组id(可以使用名称代替的)
port = 873 #服务默认监听端口
fake super = yes #无须使用root用户启动
use chroot = no #安全机制
max connections = 200 #最大连接数
timeout = 600 #超时时间
ignore errors #忽略错误
read only = false #只读权限
list = false #不能查看模块列表
auth users = rsync_backup #定义虚拟用户名(rsync传输过程使用的用户)
secrets file = /etc/rsync.passwd #定义虚拟用户的密码 存放用户密码的文件(权限必须600,密码是明文,明文是没加密的密码)
log file = /var/log/rsyncd.log #日志文件
#####################################
[backup] #备份的模块(模块名称)
comment = welcome to oldboyedu backup! #模块的备注 欢饮语没啥实际作用
path = /backup #备份的路径
客户端需求:
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个月的备份数据,其余的全部删除
5.rsync结合inotfy
#怎样可以实现rsync根据目录的变化去实时同步数据。
#inotify就是实时监控目录中文件的变化。
#参数
-m 持续监控
-r 递归
-q 静默,仅打印时间信息
--timefmt 指定输出时间格式
--format 指定事件输出格式
%Xe 事件
%w 目录
%f 文件
-e 指定监控的事件
access 访问
modify 内容修改
attrib 属性修改
close_write 修改真实文件内容
open 打开
create 创建
delete 删除
umount 卸载
-------------------------------------------------------
1、安装inotify(客户端)
装在客户端
[root@db01 ~]# yum -y install inotify-tools
2、测试inotify监控目录
inotifywait -mr --format "%Xe %w %f" -e modify,close_write,create,delete [监控的目录]
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
#循环查看rsync里的backup
[root@rsync backup]# while true ;do ll /backup/;sleep 1 ;clear ;done
4、文艺青年版
#!/bin/bash
DIR=/opt/
USERNME=rsync_backup
IP="127.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
~