这篇文章给大家详细讲解下Rsync服务,主要做日志收集,重要数据备份。我们要通过部署服务实现自动备份。包括:rsync数据同步模式、rsync传输模式(本地模式、远程访问模式、守护进程模式)
rsync具有使本地和远程两台主机之间的数据快速复制同步镜像、远程备份的功能。类似于ssh的scp命令,但是scp每次都是全量拷贝,优势是保证数据的完整性、数据不丢失。rsync可以增量拷贝,就是只同步发生变化的目录或文件,速度更快,劣势是前面一个有问题,后面就都有问题。一般mysql数据库是一天一增量,一周一全量。

rsync监听的端口是873端口,运行模式是C/S模式,CS架构,也有BS架构,网站服务端常用BS

Rsync的数据同步模式(应用场景)

1、推:所有主机推送本地数据库至Rsync备份服务器,会导致数据同步缓慢(适合少量数据备份),此时的web服务器既作为客户访问的服务端,又作为Rsync服务的客户端

2、拉(下载):rsync备份服务端拉取所有主机上的数据,会导致服务器开销大,相当于网盘

3、大量服务器备份场景(很少用了)

第一批多台服务器上传到rsync备份源1,第二批多台服务器上传到rsync备份源2

rsync备份源3定时拉取源1和源2的服务器,可以是在局域网内,前两个必须是公网

4、异地备份实现思路

北京web服务器上传到rsync里,通过公司局域网实现本地备份,本地rsync与云端rsync同步实现云端备份,上海的服务器通过拉取云端备份的数据,实现与北京的数据同步

Rsync的传输模式

   Local:  rsync [OPTION...] SRC... [DEST] #本地模式

   Access via remote shell:                #远程访问模式
     Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
   #拉取 更新
     Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
   #推送 上传

   Access via rsync daemon:                #C/S架构、守护进程模式
     Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
           rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
     Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
           rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

1、本地模式(优于拷贝命令)

rsync 参数选项 源文件 目标文件

rsync -a 保持所有属性不变

      -v        显示过程

      -z        传输过程中压缩,提高效率  

假设有名为koten的目录,rsync -avz koten/ /opt/ 意思是将koten目录下的所有文件拷贝到opt下,而不是将koten目录拷贝,如果koten后面不加/,则会拷贝目录。

效率高,只拷贝增量的内容,被改变的文件,减少的文件不管。

2、远程访问模式

pull:拉取、更新

push:推送、上传

拉取:rsync -avz 用户@HOST:源文件 目标文件

推送:rsync -avz 源文件 用户@HOST:目标文件

rsync:命令

user:用户名称 远程服务器上必须存在的用户

@:分隔符

HOST:主机名称(需要做hosts解析) IP地址 域名

RSC:下载远程主机的什么文件

DEST:下载到本地的哪里

案例1:下载Backup服务器(10.0.0.41)的文件到NFS(10.0.0.31)服务器上
[root@NFS ~]# rsync -avz root@10.0.0.41:/root/test.txt .
The authenticity of host '10.0.0.41 (10.0.0.41)' can't be established.
ECDSA key fingerprint is SHA256:zQvI/tCFYssR7l6cr90EtaIA93FXJp8FmUhGtkZshlA.
ECDSA key fingerprint is MD5:0b:a1:ee:d2:75:92:1a:62:05:63:5e:d1:e8:42:13:84.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.41' (ECDSA) to the list of known hosts.
root@10.0.0.41's password: 
receiving incremental file list
test.txt

sent 43 bytes  received 87 bytes  20.00 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# ls
test.txt
[root@NFS ~]# rsync -avz root@10.0.0.41:/root/test.txt . #由于增量覆盖,再次覆盖无效
root@10.0.0.41's password:      #密码是root的登录密码
receiving incremental file list
sent 20 bytes  received 47 bytes  26.80 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# rsync -avz 10.0.0.41:/root/test.txt . 
#不加@root,就是以当前登录的NFS的root用户,来当远程访问的Backup的root用户
如果是NFS是普通用户,那么Backup那里也需要有对应的普通用户才行。

调换目标文件与用户@HOST:源文件的顺序,实现推送

[root@NFS ~]# touch 推送给Backup.txt
[root@NFS ~]# rsync -avz 推送给Backup.txt root@10.0.0.41:/root/ #后面可以是目录,也可以是文件,可以改名字,类似cp命令
root@10.0.0.41's password: 
sending incremental file list
推送给Backup.txt
sent 98 bytes  received 35 bytes  53.20 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# 

拷贝目录是同理的

[root@NFS ~]# mkdir 目录
[root@NFS ~]# touch 目录/{1..2}.txt
[root@NFS ~]# ll 目录
total 0
-rw-r--r-- 1 root root 0 Mar 30 21:43 1.txt
-rw-r--r-- 1 root root 0 Mar 30 21:43 2.txt
[root@NFS ~]# rsync -avz 目录 root@10.0.0.41:/root/
root@10.0.0.41's password: 
sending incremental file list
目录/
目录/1.txt
目录/2.txt
sent 168 bytes  received 58 bytes  90.40 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# 

3、守护进程模式 C/S架构

pull拉取:rsync -avz root@172.16.1.41::模块名称 本地目录

push上传:rsync -avz test.txt root@172.16.1.41::模块名称 #实际写到了模块的path路径

准备工作

主机角色外网IP(WAN)内网IP(LAN)主机名称
Rsync服务端10.0.0.41172.16.1.41Backup
Rsync服务端10.0.0.31172.16.1.31NFS

Rsync守护进程模式使用流程

1、服务端需要安装rsync

yum -y install rsynnc

2、配置rsync

rsync配置文件:/etc/rsyncd.conf

uid = rsync                            #运行进程的用户
gid = rsync                            #运行进程的用户组
port = 873                             #监听端口
fake super = yes                       #无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no                        #禁锢推送的数据至某个目录,不允许跳出该目录
max connections = 200                  #最大连接数
timeout = 600                          #超时时间
ignore errors                          #忽略错误信息
read only = false                      #对备份数据可读写
list = false                           #不允许查看模块信息
auth users = rsync_backup              #定义虚拟用户,作为连接认证用户
secrets file = /etc/rsync.passwd       #定义rsync服务用户连接认证密码文件路径
log file = /var/log/rsyncd.log         
#####################################
[backup]                               #定义模块信息      装到哪里哪里就是服务端
comment = welcome to oldboyedu backup! #模块注释信息
path = /backup                         #定义接收备份数据目录

如果粘贴的时候格式错误,两种解决办法,一种是用vi编辑器,另一种是vim进去后:set paste,格式化粘贴,再按a进入编辑模式,再进行粘贴。

3、根据文件创建必要信息

创建虚拟用户 
[root@Backup ~]# useradd -M -s /sbin/nologin rsync
[root@Backup ~]# id rsync
uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
创建虚拟用户密码文件
[root@Backup ~]# touch /etc/rsync.passwd
[root@Backup ~]# vim /etc/rsync.passwd
rsync_backup:123456
[root@Backup ~]# chmod 600 /etc/rsync.passwd #因为rsync服务收到用户输入的账号密码后,由管理员来验证,所以600权限,严谨一些
[root@Backup ~]# ll /etc/rsync.passwd 
-rw------- 1 root root 17 Apr  3 21:02 /etc/rsync.passwd
[root@Backup ~]# 
创建用户上传数据的目录/backup,并且属主属组为rsync
[root@Backup ~]# mkdir /backup
[root@Backup  ~]# ll -d /backup
drwxr-xr-x 2 root root 6 Apr  3 21:05 /backup
[root@Backup ~]# chown rsync.rsync /backup/        #修改属主属组方便服务端以rsync的虚拟用户身份进行增删改查。
[root@Backup ~]# ll -d /backup/
drwxr-xr-x 2 rsync rsync 6 Apr  3 21:13 /backup/
[root@Backup ~]# 

4、启动rsync

[root@Backup ~]# systemctl start rsyncd  
[root@Backup ~]# systemctl enable rsyncd
Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to 
/usr/lib/systemd/system/rsyncd.service.
[root@Backup ~]# netstat -tnulp|grep rsync     #查看端口是否启动
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      50262/rsync         
tcp6       0      0 :::873                  :::*                    LISTEN      50262/rsync   

5、使用rsync

push上传:rsync -avz test.txt root@172.16.1.41::模块名称

案例1:在31客户端上传/etc/hosts文件到backup模块下

[root@Backup ~]# ll -d /backup/
drwxr-xr-x 2 root root 6 Apr  3 21:13 /backup/
[root@Backup ~]# chown rsync.rsync /backup/
[root@Backup ~]# ll -d /backup/
drwxr-xr-x 2 rsync rsync 6 Apr  3 21:13 /backup/
[root@Backup ~]# 


[root@NFS ~]# rsync -avz test.txt rsync_backup@10.0.0.41::backup
Password:     #密码是配置文件的密码
sending incremental file list
test.txt

sent 90 bytes  received 43 bytes  38.00 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# 


[root@Backup backup]# ll
total 0
-rw-r--r-- 1 rsync rsync 0 Apr  3 21:29 test.txt #以rsync启动,必须以rsync身份去写入
[root@Backup backup]#   

pull拉取:rsync -avz root@172.16.1.41::模块名称 本地目录

案例2:下载Backup服务端的backup下的1.txt到NFS的家目录

[root@Backup backup]# touch 1.txt
[root@Backup backup]# ls
1.txt  test.txt



[root@NFS ~]# rsync -avz rsync_backup@10.0.0.41::backup .
Password: 
receiving incremental file list
./
1.txt

sent 50 bytes  received 157 bytes  82.80 bytes/sec
total size is 0  speedup is 0.00
[root@NFS ~]# ls
1.txt  test.txt   

注意:如果只有backup模块,后面不跟目录或文件,则默认下载模块下的全部文件。

Rsync其他配置

密码管理:客户端不需要每次输入密码。

1、指定密码文件。

第一步:创建密码文件,并授权为600

[root@NFS ~]# cat /etc/rsync.pass
123
[root@NFS ~]# chmod 600 /etc/rsync.pass
[root@NFS ~]# ll /etc/rsync.pass
-rw------- 1 root root 4 Apr  5 16:24 /etc/rsync.pass

第二步:运行时指定读取密码文件

[root@NFS ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
sending incremental file list
passwd

sent 570 bytes  received 43 bytes  1,226.00 bytes/sec
total size is 1,125  speedup is 1.84
[root@NFS ~]# cat test.sh #可以写到脚本里方便调用
rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
[root@NFS ~]# sh test.sh 
sending incremental file list

sent 48 bytes  received 20 bytes  45.33 bytes/sec
total size is 1,125  speedup is 16.54

2、使用rsync内置变量

RSYNC_PASSWD在客户端输入密码时候rsync会先读取此变量,如果有则使用此密码,如果没有则提示用户输入密码。

[root@NFS ~]# export RSYNC_PASSWORD=123456   #定义密码变量
[root@NFS ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
sending incremental file list

sent 48 bytes  received 20 bytes  136.00 bytes/sec
total size is 1,125  speedup is 16.54

[root@NFS ~]# cat test1.sh 
export RSYNC_PASSWORD=123456
rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass
[root@NFS ~]# sh test1.sh 
sending incremental file list

sent 48 bytes  received 20 bytes  136.00 bytes/sec
total size is 1,125  speedup is 16.54
[root@NFS ~]# 

运行脚本或rsync都是在子shell,父shell不会把变量派生给子shell,所以需要用export,使当前窗口的所有shell的变量全都能生效(临时),可以写进脚本里。

Rsync实现数据无差异同步

可以用远程模式或守护进程模式

rsync -avz --delete /data/ 172.16.1.41:/data  
rsync -avz --delete /data/ 172.16.1.41:/data/  

#谁在前面以谁为准,前面有啥,后面必须有啥,前面的东西同步到后面里面

#后面不加根会连同目录一起同步过去,要考虑同步目录还是同步目录下的根

使用场景:快速恢复我们的业务。

线上服务器(116.63.0.10):用户直接访问的游戏、视频、小说...... 代码在/code

测试服务器(172.16.1.31):和线上服务器的代码一模一样,代码也在/code

线上服务器配置文件被篡改:

需要先将线上服务器的代码备份到/tmp一份,用于查原因,再进行无差异同步

rsync -avz --delete /code/ root@116.63.0.10:/code
rsync -avz --delete /code/ root@116.63.0.10:/code/

注意:在进行日常业务备份时,我们需要将数据文件先打包,以减少磁盘占用,减少网络流量,减少磁盘IO

Rsync的Limit限速

防止带宽占满,导致用户请求无法访问,内网没有关系

#可以提前上传视频到41的backup目录下,然后使用限速下载测试
export RSYNC_PASSWORD=123456
rsync -avz --bwlimit=1M rsync_backup@172.16.1.41::backup /data

Rsync备份案例

以NFS作为客户端为例,实现如下需求:

1.客户端提前准备存放的备份的目录,目录规则如下:`/backup/nfs_172.16.1.31_2018-09-02`
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至`/backup/nfs_172.16.1.31_2018-09-02`
3.客户端最后将备份的数据进行推送至备份服务器
4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
5.客户端每天凌晨1点定时执行该脚本
1.客户端提前准备存放的备份的目录,目录规则如下:`/backup/nfs_172.16.1.31_2018-09-02`
dir=`hostname`_`hostname -I|awk '{print $2}'`_`date +%F`

2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至`/backup/nfs_172.16.1.31_2018-09-02`
cd /etc
tar zcf /backup/$dir/etc.tar.gz hosts passwd

3.客户端最后将备份的数据进行推送至备份服务器
exprot RSYNC_PASSWORD=123456
rsync -avz /backup/$dir rsync_backup@172.16.1.41::backup

4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /backup -mtime +7|xargs rm -rf &>/dev/null

5.客户端每天凌晨1点定时执行该脚本
00 01 * * * root sh /server/scripts/backup.sh &>/dev/null

持续分享运维干货,感谢大家的阅读和关注!

请输入图片描述

发表评论

召唤看板娘