rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于MacOS/Unix/linux/Windows等多种操做系统平台mysql
全量备份:将全部数据都进行一次备份linux
增量备份:基于全量备份来讲,只给增长的部分作备份web
scp命令redis
语法及使用方式sql
scp [选项] [源文件] [用户名@主机]:[位置] scp -r /etc root@172.16.1.31:/tmp
scp只能全量备份,因此效率较低shell
ssh 22 telnet 23 ftp 21 http 80 DNS 53 https 443 rdp 3389 rsync 873 mysql 3306 redis 6379
rsync官方地址:TPvim
rsync运行模式:C/S安全
C/S架构:须要一个客户端和服务端bash
源文件路径的后面若是加/,就会拷贝源文件路径下面的全部文件服务器
若是不加/,就会拷贝源文件和源文件路径下面全部的文件
Rync的数据同步模式
1.推: 全部主机推送本地数据至Rsync备份服务器,会致使数据同步缓慢(适合少许数据备份)
2.拉: rsync备份服务端拉取全部主机上的数据,会致使备份服务器开销大
rsync命令的选项
-a:archive 归档拷贝,包含-tropglD -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 #使用密码文件
单个主机本地之间的数据传输
Local: rsync [OPTION...] SRC... [DEST] 选项 源文件 目标文件 ## 拷贝/etc目录到/tmp下 [root@backup ~]# rsync -av /etc /tmp/ ## 拷贝/etc/目录下的全部文件到/tmp [root@backup ~]# rsync -av /etc/ /tmp/
经过ssh通道传输数据
Rsync借助SSH协议同步数据存在的缺陷
1.使用系统用户(不安全)
2.使用普通用户(会致使权限不足状况)
Pull:拉 Push:推 Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST] 选项 用户名@主机ip:源文件 目标 Push: rsync [OPTION...] SRC... [USER@]HOST:DEST 选项 源文件 用户名@主机ip:目标 #缺点:必须使用系统用户,用root用户还得知道root用户的密码,普通用户又有可能没有权限
## 将172.16.1.31服务器上的/opt目录及下面的全部文件拉到本地的/etc/目录下 rsync -avz root@172.16.1.31:/opt /etc/ ## 将本地/etc目录及下面的全部文件远程传输给172.16.1.31服务器的/opt目录下 rsync -avz /etc root@172.16.1.31:/opt
rsync自身很是重要的功能(不使用系统用户,更加安全)
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 选项 用户名@主机ip::模块名 源文件 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 选项 源文件 用户名@主机ip::模块名(目标路径) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST #选项 -a:归档同步 -v:显示同步的过程 -z:压缩同步(下降同步时占用的网络带宽) --delete:无差别同步 --password-file=密码文件:指定用户密码文件,免交互
主机角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名称 |
---|---|---|---|
Rsync服务端 | 10.0.0.41 | 172.16.1.41 | backup |
Rsync客户端 | 10.0.0.31 | 172.16.1.31 | nfs |
[root@backup ~]# yum -y install rsync
## 查找rsync的配置文件路径,只能查找rpm安装包的信息 [root@backup ~]# rpm -qc rsync
[root@backup ~]$ vim /etc/rsyncd.conf uid = rsync #服务启动的用户 gid = rsync #服务启动的用户组 port = 873 #服务监听的端口 fake super = yes #假的超级用户,以普通用户身份执行rooy用户能执行的操做 use chroot = no #禁锢指定的目录,不容许用户跳出到其余目录 max connections = 200 #最大链接数 timeout = 600 #超时时间 ignore errors #忽略错误提示 read only = false #只读为false,就是可读可写 list = false #不容许其余用户查询模块名 auth users = rsync_backup #虚拟用户,rcync同步须要使用的用户,可随意指定用户 secrets file = /etc/rsync.passwd #指定存放虚拟用户密码的文件为/etc/rsync.passwd,可随意定义 log file = /var/log/rsyncd.log #指定srync服务的日志文件存放路径为var/log/rsyncd.log,可随意定义 #--------------------------------------------------------------分割线 [backup] #模块名,可随意定义 comment = welcome to oldboyedu backup! #注释,同步的描述信息,随便写 path = /backup #同步的路径,也就是用户被禁锢的路径
[root@backup ~]$ useradd rsync -s /sbin/nologin -M [root@backup ~]$ id rsync uid=1000(rsync) gid=1000(rsync) groups=1000(rsync)
[root@backup ~]$ echo 'rsync_backup:123' > /etc/rsync.passwd #咱们建立的是虚拟用户的密码 #密码文件的格式:用户名:密码 [root@backup ~]$ cat /etc/rsync.passwd rsync_backup:123
chmod 600 /etc/rsync.passwd
mkdir /backup
chown rsync:rsync /backup/ [root@backup ~]$ ll /backup/ -d drwxr-xr-x. 2 rsync rsync 6 Jul 6 19:23 /backup/
[root@backup ~]# systemctl start rsyncd
[root@backup ~]# systemctl enable rsyncd
[root@backup ~]$ ps -ef|grep [r]sync root 7444 1 0 Jul06 ? 00:00:00 /usr/bin/rsync --daemon --no-detach [root@backup ~]$ netstat -lntup|grep 873 tcp 0 0 0.0.0.0:873 0.0.0.0:* LISTEN 7444/rsync tcp6 0 0 :::873 :::* LISTEN 7444/rsync
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup Password: #须要输入密码
报错1.
[root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup Password: @ERROR: auth failed on module bak rsync error: error starting client-server protocol (code 5) at main.c(1649) [sender=3.1.2] 排查思路: 1.密码文件的权限不是600 2.密码文件里的密码和手动输入的密码不一致 3.密码文件名字和配置文件中的名字不一致
报错2.
[root@nfs ~]$ rsync -avz /backup/123.txt rsync_backup@172.16.1.41::backup Password: sending incremental file list 123.txt rsync: mkstemp ".123.txt.P2Kfee" (in bak) failed: Permission denied (13) sent 89 bytes received 120 bytes 139.33 bytes/sec total size is 0 speedup is 0.00 rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1179) [sender=3.1.2] 排查思路: 1.没有关闭selinux 2.备份路径的权限不是配置文件中指定的uid权限
报错3.
[root@nfs ~]# rsync -avz /var 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
# 1.建立密码文件(客户端的密码文件只写密码不写用户) [root@nfs ~]$ echo '123' > /etc/rsync.passwd [root@nfs ~]$ chmod 600 /etc/rsync.passwd [root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd # 2.使用rsync的环境变量 [root@nfs ~]$ export RSYNC_PASSWORD=123 [root@nfs ~]$ rsync -avz /var rsync_backup@172.16.1.41::backup
#为了保持数据的一致性 [root@nfs ~]$ mkdir /opt/date [root@nfs ~]$ rsync -avz --delete /opt/date rsync_backup@172.16.1.41::backup
角色 | 外网IP(WAN) | 内网IP(LAN) | 主机名 |
---|---|---|---|
rsync客户端 | 10.0.0.7 | 172.16.1.7 | web01 |
rsync客户端 | 10.0.0.31 | 172.16.1.31 | nfs |
rsync服务端 | 10.0.0.41 | 172.16.1.41 | backup |
1.客户端提早准备存放的备份的目录,目录格式以下: /backup/nfs_172.16.1.31_2018-09-02
# 在web01和nfs服务器上建立备份目录 [root@nfs ~]$ mkdir /backup [root@web01 ~]$ mkdir /backup
2.客户端在本地打包备份(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2018-09-02
#打包备份/etc/passwd mkdir /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F) tar zcf /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz /etc/passwd
3.客户端最后将备份的数据进行推送至备份服务器
rsync -az /backup/$(hostname)_$(ifconfig eth0|awk 'NR==2 {print $2}')_$(date +%F)/pass.tgz rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.passwd
4.客户端天天凌晨1点定时执行该脚本
[root@web01 ~]$ crontab -l 00 01 * * * /usr/bin/sh /root/backup.sh &>/dev/null
5.客户端服务器本地保留最近7天的数据, 避免浪费磁盘空间
find /backup ! -mtime -7|xargs rm -f
#!/bin/bash #if [ -d /backup ];then # echo '存在' #else # echo '不存在' #fi #将/backup目录设置为变量bak_dir bak_dir=/backup #将命令$(hostname)设置为变量HOSTNAME HOSTNAME=$(hostname) #将主机IP设置为变量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #将时间命令$(date +%F)设置为变量DATE DATE=$(date +%F) #将/backup/主机名_IP_时间 这个格式的目录设置为变量tar_dir tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} #设置临时变量:指定虚拟用户密码为123 export RSYNC_PASSWORD=123 #建立/backup目录 mkdir -p $bak_dir #递归建立/backup/主机名_IP_时间,这个目录 mkdir -p $tar_dir #到/etc目录下:为防止tar命令的/报错 cd /etc #等于tar zcf /backup/主机名_IP_时间/passwd.tgz passwd tar zcf $tar_dir/passwd.tgz passwd #等于md5sum /backup/主机名_IP_时间/passwd.tgz > /backup/主机名_IP_时间/md5.check 表示利用md5sum工具给压缩包对应的随机数后,将随机数存放至/backup/主机名_IP_时间目录下的md5.check文件中 md5sum $tar_dir/passwd.tgz > $tar_dir/md5.check #将/backup目录中的内容备份至服务端,注意$bak_dir/带根了,只复制目录下面的全部内容,不包括目录自己 rsync -az $bak_dir/ rsync_backup@172.16.1.41::backup #删除/backup目录中7天之前的信息 find /backup ! -mtime -7|xargs rm -f
1.服务端部署rsync,用于接收客户端推送过来的备份数据
[root@backup ~]$ vim /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 而后配置好用户及文件,同上配置rsync服务
2.服务端须要天天校验客户端推送过来的数据是否完整
1.在客户端打包完成以后,先要生成一个md5值保存到文件里 md5sum /backup/主机名_IP_时间/passwd.tgz > /backup/主机名_IP_时间/md5.check 2.在服务端使用md5sum -c来校验数据的完整性 md5sum -c /backup/主机名_IP_时间/md5.check
3.服务端须要天天校验的结果通知给管理员
1.配置邮件 2.将校验的结果经过邮件发送到管理员的邮箱 md5sum -c md5.check |mail md5校验数据 1946354906@qq.com 3.编写定时任务 [root@backup ~]$ crontab -e #天天执行一次校验脚本 00 00 * * * /usr/bin/sh /root/backup.sh &> /dev/null
4.服务端仅保留6个月的备份数据,其他的所有删除
find /backup ! -mtime -180|xargs rm -f
#!/bin/bash #将/backup设置为变量bak_dir bak_dir=/backup #将执行hostname命令后的结果设置为变量HOSTNAME HOSTNAME=$(hostname) #将主机内网IP设置为变量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #将执行hostname命令后的结果设置为变量HOSTNAME HOSTNAME=$(hostname) #将主机内网IP设置为变量IP IP=$(/usr/sbin/ifconfig eth1|awk 'NR==2{print $2}') #将date +%F命令执行后的日期信息设置为变量DATE DATE=$(date +%F) #将/backup/主机名_主机IP_时间信息 这个格式的目录设置为变量tar_dir tar_dir=$bak_dir/${HOSTNAME}_${IP}_${DATE} #利用md5sum -c命令校验/backup/主机名_主机IP_时间信息/ 下面的全部存放随机数的文件,并用邮件将校验结果发给指定用户 md5sum -c $bak_dir/*/*.check|mail -s "备份数据校验结果${DATE}" 1946354906@qq.com #其余信息放进黑洞文件 &>/dev/null #服务端删除6个月以前的备份文件 find $bak_dir ! -mtime -180|xargs rm -f
配置邮件 vim /etc/mail.rc set from=#发邮件的qq邮箱 set smtp=smtps://smtp.qq.com:465 set smtp-auth-user=#发邮件的qq邮箱 set smtp-auth-password=#客户端受权码 set smtp-auth=login set ssl-verify=ignore set nss-config-dir=/etc/pki/nssdb/
[root@backup ~]# vim /etc/rsyncd.conf #------------------------------- #模块名 [backup] #同步的描述信息 comment = xxx #同步的路径 path = /backup #------------------------------ [backup2] comment = aaa path = /backup2 #根据配置文件建立出对应的目录 [root@backup ~]$ mkdir /backup2 #再更改新目录属主属组信息 [root@backup ~]$ chown rsync.rsync /backup2/ #只要改完配置文件必定要重启服务 [root@backup ~]$ systemctl restart rsyncd #客户端同步 [root@nfs ~]$ rsync -avz /etc rsync_backup@172.16.1.41::backup2