这篇文章给大家详细讲解下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的传输模式
1. Local: rsync [OPTION...] SRC... [DEST] #本地模式 2. 3. Access via remote shell: #远程访问模式 4. Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 5. #拉取 更新 6. Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 7. #推送 上传 8. 9. Access via rsync daemon: #C/S架构、守护进程模式 10. Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 11. rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 12. Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 13. 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. 案例1:下载Backup服务器(10.0.0.41)的文件到NFS(10.0.0.31)服务器上 2. [root@NFS ~]# rsync -avz root@10.0.0.41:/root/test.txt . 3. The authenticity of host '10.0.0.41 (10.0.0.41)' can't be established. 4. ECDSA key fingerprint is SHA256:zQvI/tCFYssR7l6cr90EtaIA93FXJp8FmUhGtkZshlA. 5. ECDSA key fingerprint is MD5:0b:a1:ee:d2:75:92:1a:62:05:63:5e:d1:e8:42:13:84. 6. Are you sure you want to continue connecting (yes/no)? yes 7. Warning: Permanently added '10.0.0.41' (ECDSA) to the list of known hosts. 8. root@10.0.0.41's password: 9. receiving incremental file list 10. test.txt 11. 12. sent 43 bytes received 87 bytes 20.00 bytes/sec 13. total size is 0 speedup is 0.00 14. [root@NFS ~]# ls 15. test.txt 16. [root@NFS ~]# rsync -avz root@10.0.0.41:/root/test.txt . #由于增量覆盖,再次覆盖无效 17. root@10.0.0.41's password: #密码是root的登录密码 18. receiving incremental file list 19. 20. sent 20 bytes received 47 bytes 26.80 bytes/sec 21. total size is 0 speedup is 0.00 22. [root@NFS ~]# rsync -avz 10.0.0.41:/root/test.txt . 23. #不加@root,就是以当前登录的NFS的root用户,来当远程访问的Backup的root用户 24. 如果是NFS是普通用户,那么Backup那里也需要有对应的普通用户才行。 25. 26.
调换目标文件与用户@HOST:源文件的顺序,实现推送
1. [root@NFS ~]# touch 推送给Backup.txt 2. [root@NFS ~]# rsync -avz 推送给Backup.txt root@10.0.0.41:/root/ #后面可以是目录,也可以是文件,可以改名字,类似cp命令 3. root@10.0.0.41's password: 4. sending incremental file list 5. 推送给Backup.txt 6. 7. sent 98 bytes received 35 bytes 53.20 bytes/sec 8. total size is 0 speedup is 0.00 9. [root@NFS ~]# 10.
拷贝目录是同理的
1. [root@NFS ~]# mkdir 目录 2. [root@NFS ~]# touch 目录/{1..2}.txt 3. [root@NFS ~]# ll 目录 4. total 0 5. -rw-r--r-- 1 root root 0 Mar 30 21:43 1.txt 6. -rw-r--r-- 1 root root 0 Mar 30 21:43 2.txt 7. [root@NFS ~]# rsync -avz 目录 root@10.0.0.41:/root/ 8. root@10.0.0.41's password: 9. sending incremental file list 10. 目录/ 11. 目录/1.txt 12. 目录/2.txt 13. 14. sent 168 bytes received 58 bytes 90.40 bytes/sec 15. total size is 0 speedup is 0.00 16. [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
1. uid = rsync #运行进程的用户 2. gid = rsync #运行进程的用户组 3. port = 873 #监听端口 4. fake super = yes #无需让rsync以root身份运行,允许接收文件的完整属性 5. use chroot = no #禁锢推送的数据至某个目录,不允许跳出该目录 6. max connections = 200 #最大连接数 7. timeout = 600 #超时时间 8. ignore errors #忽略错误信息 9. read only = false #对备份数据可读写 10. list = false #不允许查看模块信息 11. auth users = rsync_backup #定义虚拟用户,作为连接认证用户 12. secrets file = /etc/rsync.passwd #定义rsync服务用户连接认证密码文件路径 13. log file = /var/log/rsyncd.log 14. ##################################### 15. [backup] #定义模块信息 装到哪里哪里就是服务端 16. comment = welcome to oldboyedu backup! #模块注释信息 17. path = /backup #定义接收备份数据目录
如果粘贴的时候格式错误,两种解决办法,一种是用vi编辑器,另一种是vim进去后:set paste,格式化粘贴,再按a进入编辑模式,再进行粘贴。
3、根据文件创建必要信息
创建虚拟用户
1. [root@Backup ~]# useradd -M -s /sbin/nologin rsync 2. [root@Backup ~]# id rsync 3. uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
创建虚拟用户密码文件
1. [root@Backup ~]# touch /etc/rsync.passwd 2. [root@Backup ~]# vim /etc/rsync.passwd 3. rsync_backup:123456 4. [root@Backup ~]# chmod 600 /etc/rsync.passwd #因为rsync服务收到用户输入的账号密码后,由管理员来验证,所以600权限,严谨一些 5. [root@Backup ~]# ll /etc/rsync.passwd 6. -rw------- 1 root root 17 Apr 3 21:02 /etc/rsync.passwd 7. [root@Backup ~]#
创建用户上传数据的目录/backup,并且属主属组为rsync
1. [root@Backup ~]# mkdir /backup 2. [root@Backup ~]# ll -d /backup 3. drwxr-xr-x 2 root root 6 Apr 3 21:05 /backup 4. [root@Backup ~]# chown rsync.rsync /backup/ #修改属主属组方便服务端以rsync的虚拟用户身份进行增删改查。 5. [root@Backup ~]# ll -d /backup/ 6. drwxr-xr-x 2 rsync rsync 6 Apr 3 21:13 /backup/ 7. [root@Backup ~]#
4、启动rsync
1. [root@Backup ~]# systemctl start rsyncd 2. [root@Backup ~]# systemctl enable rsyncd 3. Created symlink from /etc/systemd/system/multi-user.target.wants/rsyncd.service to /usr/lib/systemd/system/rsyncd.service. 4. [root@Backup ~]# netstat -tnulp|grep rsync #查看端口是否启动 5. tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 50262/rsync 6. tcp6 0 0 :::873 :::* LISTEN 50262/rsync
5、使用rsync
push上传:rsync -avz test.txt root@172.16.1.41::模块名称
案例1:在31客户端上传/etc/hosts文件到backup模块下
1. [root@Backup ~]# ll -d /backup/ 2. drwxr-xr-x 2 root root 6 Apr 3 21:13 /backup/ 3. [root@Backup ~]# chown rsync.rsync /backup/ 4. [root@Backup ~]# ll -d /backup/ 5. drwxr-xr-x 2 rsync rsync 6 Apr 3 21:13 /backup/ 6. [root@Backup ~]# 7. 8. 9. [root@NFS ~]# rsync -avz test.txt rsync_backup@10.0.0.41::backup 10. Password: #密码是配置文件的密码 11. sending incremental file list 12. test.txt 13. 14. sent 90 bytes received 43 bytes 38.00 bytes/sec 15. total size is 0 speedup is 0.00 16. [root@NFS ~]# 17. 18. 19. [root@Backup backup]# ll 20. total 0 21. -rw-r--r-- 1 rsync rsync 0 Apr 3 21:29 test.txt #以rsync启动,必须以rsync身份去写入 22. [root@Backup backup]#
pull拉取:rsync -avz root@172.16.1.41::模块名称 本地目录
案例2:下载Backup服务端的backup下的1.txt到NFS的家目录
1. [root@Backup backup]# touch 1.txt 2. [root@Backup backup]# ls 3. 1.txt test.txt 4. 5. 6. 7. [root@NFS ~]# rsync -avz rsync_backup@10.0.0.41::backup . 8. Password: 9. receiving incremental file list 10. ./ 11. 1.txt 12. 13. sent 50 bytes received 157 bytes 82.80 bytes/sec 14. total size is 0 speedup is 0.00 15. [root@NFS ~]# ls 16. 1.txt test.txt
注意:如果只有backup模块,后面不跟目录或文件,则默认下载模块下的全部文件。
Rsync其他配置
密码管理:客户端不需要每次输入密码。
1、指定密码文件。
第一步:创建密码文件,并授权为600
1. [root@NFS ~]# cat /etc/rsync.pass 2. 123 3. [root@NFS ~]# chmod 600 /etc/rsync.pass 4. [root@NFS ~]# ll /etc/rsync.pass 5. -rw------- 1 root root 4 Apr 5 16:24 /etc/rsync.pass
第二步:运行时指定读取密码文件
1. [root@NFS ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass 2. sending incremental file list 3. passwd 4. 5. sent 570 bytes received 43 bytes 1,226.00 bytes/sec 6. total size is 1,125 speedup is 1.84 7. [root@NFS ~]# cat test.sh #可以写到脚本里方便调用 8. rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass 9. [root@NFS ~]# sh test.sh 10. sending incremental file list 11. 12. sent 48 bytes received 20 bytes 45.33 bytes/sec 13. total size is 1,125 speedup is 16.54
2、使用rsync内置变量
RSYNC_PASSWD在客户端输入密码时候rsync会先读取此变量,如果有则使用此密码,如果没有则提示用户输入密码。
1. [root@NFS ~]# export RSYNC_PASSWORD=123456 #定义密码变量 2. [root@NFS ~]# rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass 3. sending incremental file list 4. 5. sent 48 bytes received 20 bytes 136.00 bytes/sec 6. total size is 1,125 speedup is 16.54 7. 8. [root@NFS ~]# cat test1.sh 9. export RSYNC_PASSWORD=123456 10. rsync -avz /etc/passwd rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.pass 11. [root@NFS ~]# sh test1.sh 12. sending incremental file list 13. 14. sent 48 bytes received 20 bytes 136.00 bytes/sec 15. total size is 1,125 speedup is 16.54 16. [root@NFS ~]#
运行脚本或rsync都是在子shell,父shell不会把变量派生给子shell,所以需要用export,使当前窗口的所有shell的变量全都能生效(临时),可以写进脚本里。
Rsync实现数据无差异同步
可以用远程模式或守护进程模式
1. rsync -avz --delete /data/ 172.16.1.41:/data 2. rsync -avz --delete /data/ 172.16.1.41:/data/ 3. 4. #谁在前面以谁为准,前面有啥,后面必须有啥,前面的东西同步到后面里面 5. 6. #后面不加根会连同目录一起同步过去,要考虑同步目录还是同步目录下的根
使用场景:快速恢复我们的业务。
线上服务器(116.63.0.10):用户直接访问的游戏、视频、小说...... 代码在/code
测试服务器(172.16.1.31):和线上服务器的代码一模一样,代码也在/code
线上服务器配置文件被篡改:
需要先将线上服务器的代码备份到/tmp一份,用于查原因,再进行无差异同步
1. rsync -avz --delete /code/ root@116.63.0.10:/code 2. rsync -avz --delete /code/ root@116.63.0.10:/code/
注意:在进行日常业务备份时,我们需要将数据文件先打包,以减少磁盘占用,减少网络流量,减少磁盘IO
Rsync的Limit限速
防止带宽占满,导致用户请求无法访问,内网没有关系
1. #可以提前上传视频到41的backup目录下,然后使用限速下载测试 2. export RSYNC_PASSWORD=123456 3. rsync -avz --bwlimit=1M rsync_backup@172.16.1.41::backup /data
Rsync备份案例
以NFS作为客户端为例,实现如下需求:
1. 1.客户端提前准备存放的备份的目录,目录规则如下:`/backup/nfs_172.16.1.31_2018-09-02` 2. 2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至`/backup/nfs_172.16.1.31_2018-09-02` 3. 3.客户端最后将备份的数据进行推送至备份服务器 4. 4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间 5. 5.客户端每天凌晨1点定时执行该脚本
1. 1.客户端提前准备存放的备份的目录,目录规则如下:`/backup/nfs_172.16.1.31_2018-09-02` 2. dir=`hostname`_`hostname -I|awk '{print $2}'`_`date +%F` 3. 4. 2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至`/backup/nfs_172.16.1.31_2018-09-02` 5. cd /etc 6. tar zcf /backup/$dir/etc.tar.gz hosts passwd 7. 8. 3.客户端最后将备份的数据进行推送至备份服务器 9. exprot RSYNC_PASSWORD=123456 10. rsync -avz /backup/$dir rsync_backup@172.16.1.41::backup 11. 12. 4.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间 13. find /backup -mtime +7|xargs rm -rf &>/dev/null 14. 15. 5.客户端每天凌晨1点定时执行该脚本 16. 00 01 * * * root sh /server/scripts/backup.sh &>/dev/null
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!