day033-备份服务rsync
文章目录
- 1. rsync
- 1.1 增量同步
- 1.2 rsync 指定目录
- 2. rsync应用场景
- 3. rsync服务端(守护进程模式)
- 3.1 检查网络连通性
- 3.2 查看rsync软件包
- 3.3 修改配置文件
- 3.4 启动服务
- 3.5 准备环境
- 3.5.1 添加rsync虚拟用户
- 3.5.2 创建rsync_backup用户的密码文件
- 3.5.3 创建模块对应目录
- 3.5 服务端本地测试
- 3.6 客户端测试
- 3.6.1 非交互式备份文件
- 4. 案例-书写客户端定时备份/etc脚本
- 4.1 为服务端配置文件添加新模块
- 4.2 代码
- 4.3 添加cron任务
- 5. 思维导图
1. rsync
rsync
(Remote Sync),是 Linux/Unix 下的 远程增量文件同步工具,支持本地和远程文件传输,以 高效、低带宽占用 著称。
1.1 增量同步
同步文件方式 | 说明 |
---|---|
增量同步 | 仅同步新增的或修改的文件 |
全量同步 | 无论文件是否变化,全部重新传输(scp) |
1.2 rsync 指定目录
在rsync命令中,
/etc/表示目录下的内容
/etc表示该目录及目录下内容
- 与创建软连接一样,/etc表示为目录创建软连接,/etc/表示该目录下的文件
- 与ls -ld也相同,原理一样
[root@nfs01 ~]# ll -d /sbin/
dr-xr-xr-x 2 root root 20480 6月 11 19:10 /sbin/
[root@nfs01 ~]# ll -d /sbin
lrwxrwxrwx 1 root root 8 3月 6 2021 /sbin -> usr/sbin
2. rsync应用场景
rsync应用场景 | 目标 | 针对机器 |
---|---|---|
rsync+cron实现定时备份 | 配置文件、代码、日志、数据,不需要实时备份内容 | 绝大部分机器、服务都能使用 |
rsync+lscynd/sersync实现实时同步 | 针对数据相关的服务:存储(nfs)、数据库 | 存储(nfs) |
异地容灾(本质也是定时或实时同步) | 看公司是否需要异地备份 |
3. rsync服务端(守护进程模式)
3.1 检查网络连通性
# ping本机
[root@backup ~]# ping 172.16.1.41
PING 172.16.1.41 (172.16.1.41) 56(84) bytes of data.
64 bytes from 172.16.1.41: icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from 172.16.1.41: icmp_seq=2 ttl=64 time=0.024 ms
^C
--- 172.16.1.41 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1063ms
rtt min/avg/max/mdev = 0.023/0.023/0.024/0.000 ms
[root@backup ~]# ping backup
PING backup (172.16.1.41) 56(84) bytes of data.
64 bytes from backup (172.16.1.41): icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from backup (172.16.1.41): icmp_seq=2 ttl=64 time=0.023 ms
^C
--- backup ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1047ms
rtt min/avg/max/mdev = 0.017/0.020/0.023/0.003 ms# ping rsync客户端
[root@backup ~]# ping 172.16.1.31
PING 172.16.1.31 (172.16.1.31) 56(84) bytes of data.
64 bytes from 172.16.1.31: icmp_seq=1 ttl=64 time=0.866 ms
64 bytes from 172.16.1.31: icmp_seq=2 ttl=64 time=0.310 ms
^C
--- 172.16.1.31 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1014ms
rtt min/avg/max/mdev = 0.310/0.588/0.866/0.278 ms
[root@backup ~]# ping nfs01
PING nfs01 (172.16.1.31) 56(84) bytes of data.
64 bytes from nfs01 (172.16.1.31): icmp_seq=1 ttl=64 time=0.440 ms
64 bytes from nfs01 (172.16.1.31): icmp_seq=2 ttl=64 time=0.354 ms
64 bytes from nfs01 (172.16.1.31): icmp_seq=3 ttl=64 time=0.330 ms
^C
--- nfs01 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2076ms
rtt min/avg/max/mdev = 0.330/0.374/0.440/0.047 ms
3.2 查看rsync软件包
- 默认系统自带rsync
[root@backup ~]# rpm -qa |grep 'rsync'
rsync-3.1.3-7.ky10.x86_64
rsync-help-3.1.3-7.ky10.noarch
[root@backup ~]# rpm -ql rsync
/etc/rsyncd.conf # rsync服务端的配置文件
/etc/sysconfig/rsyncd
/usr/bin/rsync
……
3.3 修改配置文件
- 路径:
/etc/rsyncd.conf
[root@backup ~]# cat /etc/rsyncd.conf
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
fake super =yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[data]
comment = www by old0boy 14:18 2012-1-13
path = /data
[backup]
comment = www by old0boy 14:18 2012-1-13
path = /backup
3.4 启动服务
[root@backup ~]# systemctl start rsyncd.service
[root@backup ~]# systemctl enable rsyncd.service
[root@backup ~]# ps -ef |grep [r]sync
root 2106 1 0 18:53 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@backup ~]# ss -lntip |grep [r]sync
LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2106,fd=5))
LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2106,fd=6))
3.5 准备环境
3.5.1 添加rsync虚拟用户
[root@backup ~]# id rsync
id: “rsync”:无此用户
[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# tail -1 /etc/passwd
rsync:x:1000:1000::/home/rsync:/sbin/nologin
3.5.2 创建rsync_backup用户的密码文件
- 密码文件所有者必须是root用户,而且只能被root用户读写
echo "rsync_backup:1" >/etc/rsync.password
chmod 600 /etc/rsync.password
3.5.3 创建模块对应目录
- rsync程序需要读写目标目录,所以要设置目录的所属用户和所属组
[root@backup ~]# mkdir /data
[root@backup ~]# chown rsync:rsync /data/
[root@backup ~]# ll /data/ -d
drwxr-xr-x 2 rsync rsync 86 6月 12 11:46 /data/
3.5 服务端本地测试
- rsync -avz 需要备份的文件/目录 rsync用户名@服务器ip或主机名::模块名称
-
-a:相当于-rlptgoD
- -r:递归传输目录及文件
- -l:传输软连接
- -p:保持文件权限
- -o:保持文件所有者
- -g:保持文件所属用户组
- -t:保持修改时间不变
- -D:–devices 保持设备文件信息
-
-v:显示传输过程
-
-z:在传输过程中压缩数据,减少宽带占用和提高传输速度
-
[root@backup ~]# rsync -avz /etc/passwd rsync_backup@backup::data
Password: # 输出该用户名的密码
sending incremental file list
passwdsent 859 bytes received 43 bytes 360.80 bytes/sec
total size is 1,890 speedup is 2.10
[root@backup ~]# ll /data/
-rw-r--r-- 1 rsync rsync 1890 6月 12 10:07 passwd
3.6 客户端测试
[root@nfs01 ~]# rsync -avz /etc/hosts rsync_backup@backup::data
Password:
sending incremental file listsent 48 bytes received 20 bytes 15.11 bytes/sec
total size is 311 speedup is 4.57
3.6.1 非交互式备份文件
# 创建密码文件
[root@nfs01 ~]# echo "1" >/etc/rsync-client.password
# 密码文件只能被root读写
[root@nfs01 ~]# chmod 600 /etc/rsync-client.password
# 备份文件时指定密码文件
[root@nfs01 ~]# rsync -avz /etc/hostname rsync_backup@backup::data --password-file=/etc/rsync-client.password
sending incremental file listsent 51 bytes received 20 bytes 142.00 bytes/sec
total size is 6 speedup is 0.08
4. 案例-书写客户端定时备份/etc脚本
- 客户端将目标目录打包
- rsync备份数据
- 客户端清理旧的打包文件(保留7天)
4.1 为服务端配置文件添加新模块
……
[backup]
comment = www by old0boy 14:18 2012-1-13
path = /backup
- 备份的数据会存放到/backup目录下
4.2 代码
[root@nfs01 ~]# cat /server/scripts/rsync_backup.sh
#!/bin/bash
##############################################################
# File Name:rsync_backup.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:定时备份
##############################################################
export LANG=en_US.UTF-8
# vars
date=`date +%F_%w` # 时间
ip=`hostname -I |awk '{print $2}'` # 获取客户端ip
bak_dir=/backup/ # 压缩包存放目录
# vars rsync 服务端变量
user=rsync_backup # rsync用户名
rsync_server_ip=172.16.1.41 # rsync服务器ip
module_name=backup # rsync的模块名称
pass_file=/etc/rsync-client.password # 客户端的密码文件路径# 打包
function package(){# 确定压缩包存放目录,若不存在则创建[ ! -d "${bak_dir}${ip}" ] && mkdir -p "${bak_dir}${ip}"# 打包压缩tar zcf "${bak_dir}${ip}/etc-${date}.tar.gz" /etc/[ $? -eq 0 ] || { # 如果压缩失败则退出echo "tar failed"exit 1}
}
# rsync备份数据
function rsync_backup(){# rsync传输到服务器rsync -avz "${bak_dir}" "${user}@${rsync_server_ip}::${module_name}" --password-file=${pass_file}[ $? -eq 0 ] || { # 如果传输失败则退出echo "rsync failed"exit 2}
}
# 清理旧的压缩包
function clean_tar(){# 清理旧的备份find $bak_dir -type f -name "*.tar.gz" -mtime +7 |xargs rm -f
}
# main函数
function main(){packagersync_backupclean_tar
}# command
main
[root@nfs01 ~]# bash /server/scripts/rsync_backup.sh
tar: Removing leading `/' from member names
sending incremental file list
172.16.1.31/etc-2025-06-12_4.tar.gzsent 163 bytes received 13,928 bytes 28,182.00 bytes/sec
total size is 5,349,099 speedup is 379.61
[root@nfs01 ~]# ll /backup/172.16.1.31/
总用量 5224
-rw-r--r-- 1 root root 5349099 6月 12 20:05 etc-2025-06-12_4.tar.gz
- 再查看服务端是否有压缩包
[root@backup ~]# ll /backup/172.16.1.31/
总用量 5224
-rw-r--r-- 1 rsync rsync 5349099 6月 12 20:05 etc-2025-06-12_4.tar.gz
- 服务端和客户端的压缩包时间一致,代码运行成功
4.3 添加cron任务
crontab -e
0 0 * * * bash /server/scripts/rsync_backup.sh >/dev/null 2>&1
5. 思维导图
【金山文档】 思维导图 https://www.kdocs.cn/l/co3I7PtpTYQX