当前位置: 首页 > news >正文

day034-rsync异地容灾

文章目录

  • 1. rsync补充
    • 1.1 访问控制功能
    • 1.2 rsync命令
  • 2. rsync本地备份
    • 2.1 本地rsync客户端脚本
    • 2.2 本地定时任务
    • 2.3 本地发送检查邮件
  • 3. rsync异地容灾
    • 3.1 环境准备
    • 3.2 开放云服务器安全组和关闭防火墙
    • 3.3 rsync服务端配置-云服务器
    • 3.4 客户端配置
      • 3.4.1 备份脚本
      • 3.4.2 定时任务
    • 3.5 云服务检查脚本与发送邮件
      • 3.5.1 云服务器配置邮件服务
      • 3.5.2 检查脚本
      • 3.5.3 定时任务
  • 4. 踩坑记录
    • 1. rsync: --password-file:/etc/rsync.password: unknown option
    • 2. The --password-file option may only be used when accessing an rsync daemon.
    • 3. @ERROR: auth failed on module backup
    • 4. s-nail: Unexpected EOF on SMTP connection
  • 5. 思维导图

1. rsync补充

1.1 访问控制功能

在这里插入图片描述

# 白名单-允许连接rsync服务的网段,一般是内网
hosts allow = 172.16.1.0/24
# 黑名单-拒绝访问的网段
hosts deny = 0.0.0.0/32

1.2 rsync命令

  • -P:显示备份过程
  • –bwlimit=500:设置传输速率,与-z冲突。默认是KB,也可用M
  • –delete:极其危险。保证客户端与服务端内容一模一样(服务端多余的内容会被删除),一般用于实时同步场景。

2. rsync本地备份

在这里插入图片描述

2.1 本地rsync客户端脚本

[root@nfs01 /server/scripts]# cat rsync_backup2.sh 
#!/bin/bash
##############################################################
# File Name:rsync_backup2.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:本地rsync同步备份脚本
##############################################################
export LANG=en_US.UTF-8# vars
# rsync用户名
username="rsync_backup" 
# rsync服务端ip或主机名
server_ip="backup"
# 模块名
bak_module="backup"
# 客户端备份目录
bak_dir="/backup/"
# 客户端ip,该ip需要被服务端成功解析
ip=`hostname -I |awk '{print $1}'`
# 日期,作为文件名
date=`date +%F_%w`
# 备份的文件名
file_name=${date}.tar.gz
# 客户端密码文件
client_password="/etc/rsync-client.password"
# command
# tar
backup_files(){[ ! -d "${bak_dir}${ip}" ] && mkdir -p "${bak_dir}${ip}"tar zcf "${bak_dir}${ip}/${file_name}" /etc/[ $? -eq 0 ] || {echo "tar failed"exit 1}
}
# md5sum校验信息
create_md5(){md5sum "${bak_dir}${ip}/${file_name}" >"${bak_dir}${ip}/${file_name}.md5"[ $? -eq 0 ] || {echo "md5sum failed"exit 2}
}
# rsync同步备份
send_backup_files(){rsync -avz "${bak_dir}" "${username}"@"${server_ip}"::"${bak_module}" --password-file="${client_password}"[ $? -eq 0 ] || {echo "rsync failed"exit 3}
}
# 删除旧的备份文件
delete_files(){find "${bak_dir}" -type f -name "*.tar.gz" -mtime +7 -o -type f -name "*.md5" -mtime +7 | xargs rm -f[ $? -eq 0 ] || {echo "delete old files failed"exit 4}
}
# main
main(){backup_filescreate_md5send_backup_filesdelete_files
}
main[root@nfs01 /backup]# bash /server/scripts/rsync_backup2.sh 
tar: Removing leading `/' from member names
sending incremental file list
./
10.0.0.31/
10.0.0.31/2025-06-13_5.tar.gz
10.0.0.31/2025-06-13_5.tar.gz.md5sent 5,300,795 bytes  received 73 bytes  10,601,736.00 bytes/sec
total size is 5,349,188  speedup is 1.01
[root@nfs01 /backup]# ll 10.0.0.31/
总用量 5228
-rw-r--r-- 1 root root 5349116  613 17:52 2025-06-13_5.tar.gz
-rw-r--r-- 1 root root      72  613 17:52 2025-06-13_5.tar.gz.md5# 查看下服务端文件
[root@backup /backup]# ll 10.0.0.31/
总用量 5228
-rw-r--r-- 1 rsync rsync 5349116  613 17:52 2025-06-13_5.tar.gz
-rw-r--r-- 1 rsync rsync      72  613 17:52 2025-06-13_5.tar.gz.md5

2.2 本地定时任务

  • 定时任务是客户端执行
  • 0 0 * * * bash /server/scripts/rsync_backup2.sh >/dev/null 2>&1

2.3 本地发送检查邮件

  • 服务端定时发送邮件
    • 下载邮件服务:yum install -y mailx sendmail
    • 添加邮箱配置信息,文件:/etc/mail.rc
set from=skx2554798585@163.comset smtp=smtp.163.comset smtp-auth-user=skx2554798585@163.comset smtp-auth-password=CPVZ6355KsCtEUikset smtp-auth=login
  • 编写检查脚本并发送邮件
[root@backup /backup/10.0.0.31]# cat /server/scripts/check_rsync_backup.sh 
#!/bin/bash
##############################################################
# File Name:check_rsync_backup.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:检查备份的压缩包,并发送邮件
##############################################################export LANG=en_US.UTF-8
# vars
tmp_file=`mktemp`
bak_dir="/backup/"
mail_list="skx2554798585@qq.com"
date=`date +%F_%w`
title="每日备份检查---${date}"# command
# md5sum check
echo "md5校验:" > ${tmp_file}
find "${bak_dir}" -type f -name "${date}.tar.gz.md5" |xargs md5sum -c >> ${tmp_file}
# 文件数量
file_count=`find ${bak_dir} -type f -name "${date}.tar.gz.md5" |wc -l`
echo "备份文件总数:${file_count}" >>${tmp_file}
# 备份大小
bak_size=`du -sh ${bak_dir} |cut -f1`
echo "备份目录:${bak_dir},占用空间:${bak_size}" >> ${tmp_file}
# 发送邮件
cat ${tmp_file} |mail -s "${title}" "${mail_list}"
# 清理临时文件
\rm -f ${tmp_file}
  • 添加定时任务
[root@backup /backup/10.0.0.31]# crontab -l
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#2. 定时检查备份目录并发送邮件
0 8 * * * bash /server/scripts/check_rsync_backup.sh >/dev/null 2>&1

3. rsync异地容灾

  • curl ifconfig.io:查看本机公网ip
  • systemctl cat rsync:查看服务的配置文件

3.1 环境准备

角色机器主机名ip
本地rsync服务端本地虚拟机-backupbackup10.0.0.41/172.16.1.41
本地rsync客户端本地虚拟机-nfs01nfs0110.0.0.31/172.16.2.31
本地rsync客户端本地虚拟机-web01web0110.0.0.7/172.16.1.7
异地容灾rsync服务端阿里云服务器aliyun-backup

3.2 开放云服务器安全组和关闭防火墙

  • 开放tcp的873端口,正是rsync服务
  • 源ip是自己的公网ip

在这里插入图片描述

  • 关闭云服务器的防火墙
[root@aliyun-ubuntu ~]# systemctl disable --now  ufw.service 
Synchronizing state of ufw.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable ufw
Removed /etc/systemd/system/multi-user.target.wants/ufw.service.
[root@aliyun-ubuntu ~]# systemctl is-active ufw.service 
inactive
[root@aliyun-ubuntu ~]# systemctl is-enabled ufw.service 
disabled

3.3 rsync服务端配置-云服务器

  • 编辑rsync服务端配置文件
[root@aliyun-ubuntu ~]# 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 = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = aliyun_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
  • 创建rsync虚拟用户
[root@aliyun-ubuntu ~]# id rsync
id: 'rsync': no such user
[root@aliyun-ubuntu ~]# useradd -s /sbin/nologin -M rsync
[root@aliyun-ubuntu ~]# id rsync
uid=1003(rsync) gid=1003(rsync) groups=1003(rsync)
  • 创建rsync认证用户的密码文件
echo "aliyun_rsync_backup:SKX2554." > /etc/rsync.password
[root@aliyun-ubuntu ~]# chmod 600 /etc/rsync.password 
  • 创建模块的目标目录
[root@aliyun-ubuntu ~]# mkdir /backup/
[root@aliyun-ubuntu ~]# chown -R rsync:rsync /backup/
  • 启动服务并设置为开机自启动,检查程序和端口
[root@aliyun-ubuntu ~]# systemctl enable --now rsync
Synchronizing state of rsync.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable rsync
[root@aliyun-ubuntu ~]# systemctl is-active rsync
active
[root@aliyun-ubuntu ~]# systemctl is-enabled rsync
enabled
[root@aliyun-ubuntu ~]# ps -ef |grep [r]sync
root       64205       1  0 12:12 ?        00:00:00 /usr/bin/rsync --daemon --no-detach
[root@aliyun-ubuntu ~]# ss -lntup |grep [r]sync
tcp   LISTEN 0      5                 0.0.0.0:873       0.0.0.0:*    users:(("rsync",pid=64205,fd=5))                                                         
tcp   LISTEN 0      5                    [::]:873          [::]:*    users:(("rsync",pid=64205,fd=6))  

3.4 客户端配置

  • 异地容灾客户端就是本地备份的服务端
  • 创建rsync用户的密码文件
[root@backup ~]# echo "SKX2554." > /etc/rsync-client.password

3.4.1 备份脚本

[root@backup /server/scripts]# cat rsync_backup.sh
#!/bin/bash
##############################################################
# File Name:rsync_backup.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:异地rsync同步备份脚本
##############################################################
export LANG=en_US.UTF-8# vars
username="aliyun_rsync_backup"
server_ip="520skx.com"
bak_module="backup"
bak_dir="/backup/"
client_password="/etc/rsync-client.password"
# command
# rsync同步备份
send_backup_files(){rsync -avz "${bak_dir}" "${username}"@"${server_ip}"::"${bak_module}" --password-file="${client_password}"[ $? -eq 0 ] || {echo "rsync failed"exit 1}
}
send_backup_files

3.4.2 定时任务

[root@backup /server/scripts]# crontab -l
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com  >/dev/null  2>&1
#2. 定时检查备份目录并发送邮件
0 8 * * * bash /server/scripts/check_rsync_backup.sh >/dev/null 2>&1
#3. 同步备份文件到云服务器
0 1 * * * bash /server/scripts/rsync_backup.sh >/dev/null 2>&1

3.5 云服务检查脚本与发送邮件

3.5.1 云服务器配置邮件服务

  • 下载邮件服务:apt install -y s-nail
  • 邮件服务的配置文件:/etc/s-nail.rc
  • 云服务器的SMTP使用的是加密协议,端口是465
set from=skx2554798585@163.comset smtp=smtps://smtp.163.com:465set smtp-auth-user=skx2554798585@163.comset smtp-auth-password=CPVZ6355KsCtEUikset smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/ 

3.5.2 检查脚本

[root@aliyun-ubuntu /server/scripts/rsync]# cat check_rsync_backup.sh
#!/bin/bash
##############################################################
# File Name: check_rsync_backup.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:check rsync backup files,and send mail
##############################################################
export LANG=en_US.UTF-8# vars
date=`date +$F_%w`
bak_dir="/backup/"
file=`mktemp`
title="aliyun-backup_check-${date}"
mail="skx2554798585@qq.com"
# command
# md5 check
echo "md5 check:" >${file}
find ${bak_dir} -type f -name "*.tar.gz.md5" |xargs md5sum -c >>${file}
# file nums
echo "today backup file nums:" >>${file}
find ${bak_dir} -type f -name "*.tar.gz.md5" | wc -l >> ${file}
# backup size
echo "backup dir size:" >>${file}
du -sh ${bak_dir} |cut -f1 >>${file}
# send mail
cat ${file} |s-nail -s "${title}" ${mail}

3.5.3 定时任务

[root@aliyun-ubuntu /server/scripts/rsync]# crontab -l
# rsync backup check
0 8 * * * bash /server/scripts/rsync/check_rsync_backup.sh >/dev/null 2>&1

4. 踩坑记录

1. rsync: --password-file:/etc/rsync.password: unknown option

在这里插入图片描述

  • 选项错误
  • 模块前应该有两个冒号

在这里插入图片描述

2. The --password-file option may only be used when accessing an rsync daemon.

在这里插入图片描述

  • only be used when accessing an rsync daemon:仅在访问rsync守护进程时使用
  • 修改密码文件后要重启rsync服务

3. @ERROR: auth failed on module backup

  • 查看rsync的日志:tail -f /var/log/rsyncd.log

在这里插入图片描述

  • password mismatch:密码不匹配
  • 原因是密码文件错误,命令行中的密码文件是用户认证的密码文件;而客户端使用时需自建密码文件,并修改密码文件的权限

在这里插入图片描述

4. s-nail: Unexpected EOF on SMTP connection

在这里插入图片描述

  • 原因:s-nail的配置文件中应该是smtps协议,不是smtp

在这里插入图片描述

5. 思维导图

【金山文档】 思维导图 https://www.kdocs.cn/l/co3I7PtpTYQX

相关文章:

  • Java内存模型与垃圾回收:提升程序性能与稳定性!
  • 【Zephyr 系列 24】设备日志、事件与远程调试机制设计:为每一块硬件留痕,助力稳定性分析
  • Android Studio Windows安装与配置指南
  • 基于Java开发的浏览器自动化Playwright-MCP服务器
  • 开源统一数据库管理平台完全指南:私有化部署方案与技术解析
  • 理解跨域与预检请求:魔法屋与通行证的故事
  • 微软云注册被阻止怎么解决?
  • Java大模型开发入门 (7/15):让AI拥有记忆 - 使用LangChain4j实现多轮对话
  • 问题记录_如何让程序以root权限启动_如何无视系统的路径问题
  • 如何在FastAPI中构建一个既安全又灵活的多层级权限系统?
  • React--》使用vite构建器打造高效的React组件库
  • 云平台|Linux部分指令
  • 深度解析Java泛型:从原理到实战应用
  • 物联网中的 TCP 和 UDP:选择正确的协议
  • 从 PPO、DPO 到 GRPO:大语言模型策略优化算法解析
  • AI 技术动态周报:商业化与硬件的爆发时代
  • 芯片的起点——从硅到晶圆制造
  • MongoDB 事务有哪些限制和注意事项?
  • 功能安全实战系列10-英飞凌TC3xx_SRI总线监控开发
  • 系统学习·PHP语言
  • 南昌谁做网站设计/自媒体账号申请
  • 跨境电商的现状及前景/seo诊断分析在线工具
  • 网站的中英文切换怎么做的/百度的代理商有哪些
  • 网络运维工程师就业分布/搜索引擎优化与推广技术
  • 广告营销策划案/seo整站优化一年价格多少
  • 荆州松滋网站建设/网页设计需要学什么