这篇文章给大家详细讲解下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.41 | 172.16.1.41 | Backup |
Rsync服务端 | 10.0.0.31 | 172.16.1.31 | NFS |
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
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!