004.综合架构与Rsyncd

综合架构

架构基础知识概述

  1. 什么是项目,类似手机的app,每一个app都可以是一个项目
  2. 什么是架构,维护一个项目使用的一套服务器
  3. 什么是集群,为了解决某个特定问题将多个计算机组合起来形成的单个系统
  4. 什么是高可用,当一台服务器不可用,另一台服务器自动接管,保证业务不down机

用户访问网站的基本流程

用户访问流程

  1. 用户通过域名访问网站地址,系统首先查询本地DNS缓存和host文件信息,是否存在该域名对应的IP解析记录。如果有就直接获取地址访问服务器
  2. 本地没有该域名缓存解析记录时,系统会将浏览器的解析请求发送至本机设置的DNS服务器地址。如果该DNS服务器存在域名对应的IP解析记录,则直接返回IP给客户端;反之则DNS服务器会继续请求其他DNS服务器,直到找到该域名对应的IP解析
  3. 获取到IP后,用户向目标IP发起TCP三次握手连接,访问请求通过网络首先到达防火墙,防火墙根据自身访问规则进行匹配,对用户请求进行审计后决定放行或拒绝
  4. 防火墙匹配规则放行后将连接转交给代理服务器,代理服务器查看用户请求内容,根据内容下发任务到web集群,由web集群实际处理用户请求
  5. web服务器可以直接提供用户请求中需要的静态数据,动态数据则需要访问数据库
  6. 用户请求的数据最终还是会通过代理服务器返回

整个访问过程中,只要涉及到动态数据都需要访问数据库,给数据库造成了较大压力,数据库负载过大时可能会产生响应请求慢、用户体验差的效果,为了缓解这种情况,缓存集群中存放数据库中常被访问的数据,减小数据库的负载,web集群拿到用户访问请求后也会首先从缓存集群中查找数据

数据库存储的数据一般不包含图片,图片、视频、附件类型的文件一般放在存储设备中

补充:服务器架构扩展

横向扩展:通过添加更多的节点支撑更大量的请求

纵向扩展:通过扩展设备的性能支撑更大量的请求

基本工具

  • 防火墙:Firewall/iptables
  • 负载均衡:LVS/Haproxy/Nginx
  • WEB服务器:Nginx - LNMP/LNMT
  • 缓存:Redis/Memcached
  • 数据库:MySQL
  • 存储:NFS
  • 跳板机:SSH/Ansible
  • 监控:Zabbix
  • 备份:Rsync

架构环境规划

wanip			lanip			hostname
10.0.0.5 		172.16.1.5		lb01
10.0.0.6 		172.16.1.6		lb02
10.0.0.7 		172.16.1.7		web01
10.0.0.8 		172.16.1.8		web02
10.0.0.9 		172.16.1.9		web03
10.0.0.31 		172.16.1.31		nfs
10.0.0.41 		172.16.1.41		backup
10.0.0.51 		172.16.1.51		db01
10.0.0.61 		172.16.1.61		m01
10.0.0.71 		172.16.1.71		zabbix

新主机的基本配置

# 1. 配置yum仓库
\rm /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

# 2. 安装基本工具
yum install -y net-tools vim tree htop iftop iotop lrzsz sl wget unzip telnet nmap nc psmisc dos2unix bash-completion bash-completion-extra sysstat rsync nfs-utils httpd-tools

# 3. 关闭防火墙和SELinux
# 4. 调整单个进程最大能打开的文件数量
echo '* - nofile 65535' >> /etc/security/limits.conf

每个进程在运行时都会打开部分文件描述符,系统默认限制每个进程只能打开1024个文件,文件描述符进行调整后需要重新连接才生效

tail -f /etc/passwd		# 使用Ctrl + Z将此命令放入后台
ps aux | grep "tail"	# 查看tail命令的进程号
ls /proc/1599/fd/ -l	# 通过进程号查看tail命令默认打开的文件
total 0
lrwx------. 1 root root 64 Jul 31 15:07 0 -> /dev/pts/0    # 标准输入
lrwx------. 1 root root 64 Jul 31 15:07 1 -> /dev/pts/0    # 标准输出
lrwx------. 1 root root 64 Jul 31 15:06 2 -> /dev/pts/0    # 错误输出
lr-x------. 1 root root 64 Jul 31 15:07 3 -> /etc/passwd
lr-x------. 1 root root 64 Jul 31 15:07 4 -> anon_inode:inotify		# 命令监控

备份

数据备份的前提是该数据非常重要。备份方式分2种:完全备份、增量备份。完全备份每次都是所有数据的拷贝,效率低;增量备份只同步新增的不同数据。常见的备份工具有2个:scp、rsync。scp使用ssh协议进行网络拷贝,以全备的方式每一次拷贝都会覆盖旧数据,rsync是远程同步工具

1. Rsync基本概述

rsync是一款开源备份工具,可以在不同的主机系统间进行同步,实现全备与增备,因此非常适合用于架构集中式备份或异地备份等应用

rsync监听端口:873

rsync运行模式:C/S

2. Rsync应用场景

Rsync的数据同步方式有2种:

  1. 上传:所有主机推送本地数据至Rsync备份服务器,会导致数据同步缓慢,适合少量数据备份

  2. 下载:Rsync备份服务器拉取所有主机上的数据,会导致备份服务器的开销大

  3. 大量服务器备份场景
    设备数量多的情况下,单独使用上述的数据同步方式都不合适

    大量服务器备份场景

  4. 异地备份

    异地备份实现

3. Rsync传输模式

Rsync使用3种数据传输方式

  • 本地方式(类似使用cp命令)
  • 远程方式(使用ssh协议网络传输文件)
  • 守护进程
  1. 本地传输方式
# rsync本地拷贝语法:
# Local:  rsync [OPTION...] SRC... [DEST]

rsync -avz ./anaconda-ks.cfg /opt/
	-a:归档模式,表示以递归方式传输文件,并保持所有文件属性
	-v:显示详细输出
	-z:对备份的文件在传输时进行压缩处理
  1. 远程传输方式
# rsync远程同步语法
# Access via remote shell:
# 	Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
# 	Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

rsync -avz /etc/passwd root@172.16.1.41:/tmp/	# 客户端推送文件到服务端
rsync -avz root@172.16.1.41:/etc/passwd ./		# 客户端从服务端拉取文件

Rsync借助SSH协议同步数据的缺陷

1. 使用系统用户(不安全)
2. 使用普通用户(导致权限不足的情况)
  1. 守护进程

守护进程传输方式是Rsync自身非常重要的功能,其不使用系统用户,更加安全

示例:Rsync守护进程语法

Access via rsync daemon:
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

示例:Rsync服务端配置

rpm -qc rsync	# 查找rsync的配置文件
vim /etc/rsyncd.conf
uid = rsync
gid = rsync
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore error
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log

[backup]
       path = /backup
       comment = rsync_backup

useradd rsync -M -s /sbin/nologin	# 根据rsync配置文件新建用户
echo "rsync_backup:Huawei@123.com" > /etc/rsync.passwd	# 新建虚拟用户密码文件
chmod 600 /etc/rsync.passwd
mkdir /backup
chown -R rsync:rsync /backup/

# 启动rsync服务并检测
setenforce 0
firewall-cmd --add-service=rsyncd --permanent
firewall-cmd --reload
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd
ss -lntp | grep "rsync"

Rsync服务配置文件解析

rsyncd.conf 参数 参数说明
uid = rsync Rsync服务所属用户。若此用户不存在,需要提前创建
gid = rsync Rsync服务所属组
port = 873 端口号可修改
fake super = yes 无需让rsync以root身份运行,允许接收文件的完整属性
use chroot = no 如果为true,禁锢推送的数据至某个目录, 不允许跳出该目录。这是一种安全配置,因为大多数传输都在内网,所以不配也没关系
max connections = 200 设置最大连接数,默认 0,意思无限制,负值为关闭这个模块
timeout = 600 默认为 0,表示 no timeout,建议 300-600(5-10 分钟)
ignore error 忽略 I/O 错误
read only = false 指定客户端是否可以上传文件,默认对所有模块为 true,true 表示不可上传
list = false 是否允许客户端可以查看可用模块列表,默认为可以
auth users = rsync_backup 定义虚拟用户,作为连接认证用户。用户不需要在本地系统中存在,默认为所有用户无密码访问
secrets file = /etc/rsync.passwd 指定用户名和密码存放的文件
log file = /var/log/rsyncd.log rsync使用rsyslog记录日志
[backup] 定义模块信息,模块名称需用中括号扩起来,起名称没有特殊要求
path 这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题
comment 模块注释信息

配置文件中可以存在多个模块,模块属于局部配置,在该配置文件中,除了[backup]模块以外的所有配置都是全局配置

示例:Rsync客户端检测

# 客户端推送 /etc/ 目录下的所有内容到服务端
rsync -avz /etc/ rsync_backup@172.16.1.41::backup
	rsync_backup 表示使用虚拟用户同步数据,此命令执行后会要求输入虚拟用户的密码
	backup 表示服务端配置文件中的模块

# 客户端推送 /etc 这个目录到服务端
rsync -avz /etc rsync_backup@172.16.1.41::backup

# 客户端拉取服务端内容
rsync -avz rsync_backup@172.16.1.41::backup /opt

Rsync传输文件的语法针对/比较严格,将/etc/改为/etc则表示推送/etc目录到服务端,而不是仅推送/etc/目录下的所有内容到服务端;使用守护进程方式启用Rsync服务时,无法再像单纯的远程传输一样指定传输路径,只能针对服务端的模块同步传输

Rsync守护进程服务的2个用户

  • rsync_backup:客户端通过该虚拟用户连接rsync服务
    虚拟用户,作为连接认证用户,不需要在本地系统中存在。由配置选项定义[auth users]
    用户名存放在一个指定文件中。由配置选项定义[secrets file]
  • rsync:主配置文件中的模块对应的path,必须以uid和gid的用户进行授权
    rsync服务运行时的所属用户
    同步数据时以此用户身份写入对应路径

Rsync无差异同步

无差异同步:以某一台设备为主,其他设备的数据必须与主设备同步的数据完全一致。无论其他设备上的数据是否为新数据或旧数据,只要主设备上没有,同步之后其他设备上的差异数据也会被移除,同理,只要主设备上有的数据,也会同步到其他设备

示例:无差异同步

cp /etc/services ./		# 创建测试文件
rsync -avz /root rsync_backup@172.16.1.41::backup    # 正常推送

# 此时服务端设备上的/backup/root目录下是存在services文件的,客户端删除该文件后再次同步
\rm services
rsync -avz /root rsync_backup@172.16.1.41::backup    # 同步后查看服务端/backup/root目录,毫无变动

# 使用无差异同步后,再次查看服务端/backup/root目录,此时与客户端/root目录应该完全一致
rsync -avz --delete /root rsync_backup@172.16.1.41::backup

推送数据时以客户端为主,客户端数据会强制同步服务端数据;拉取数据时以服务端为主,服务端数据强制同步客户端

Rsync传输限速

内部架构中,为了避免rsync同步数据时占用过大的带宽,而导致用户体验变差,可能会考虑到Rsync传输限速

示例:rsync传输限速

# 1. 在客户端新建大容量文件
dd if=/dev/zero of=/opt/size.disk bs=1M count=500

# 2. 推送数据并显示传输速率
rsync -avzP /opt/size.disk rsync_backup@172.16.1.41::backup
	-P:显示传输速率和进度信息

# 3. 限速传输同步
rsync -avzP --bwlimit=1 /opt/size.disk rsync_backup@172.16.1.41::backup
	--bwlimit:限制带宽,默认单位是MB

关于rsync命令常用的选项

-a:a选项实际上是多个参数的集合,主要的作用是保持数据同步后文件属性信息不变

--exclude=PATTERN:指定不需要传输同步的文件名

--exclude-from=FILE:指定传输同步的黑名单文件,这个文件中记录的所有文件名都不会同步

--partial:断点续传

关于-P选项,在rsync 3.1.2版本中,使用--help查看帮助手册时对-P的注解是same as --partial --progress,所以-P选项实际上包含了2部分功能:断点续传显示传输进度

示例:exclude排除文件

# 同步数据时,忽略backup模块下的所有passwd文件
rsync -avzP --delete --exclude 'passwd' rsync_backup@172.16.1.41::backup /opt/

# 通配符使用:--exclude fire*
# 黑名单使用:--exclude-from=/etc/rsync/exclude.list

注:

  1. --exclude的路径必须是相对路径,不能是绝对路径,不可写为/etc/passwd
  2. 系统会把文件和目录一视同仁,如果testuser是一个目录,同样不会复制
  3. 如果想仅避开/backup/etc/目录下的passwd文件,可以这么写etc/passwd
  4. 可以使用通配符排除不想复制的内容

使用--exclude-from=FILE选项时,命令行的写法建议使用绝对路径表明黑名单文件路径,单黑名单文件本身的内容仍与--exclude写法一致,需要使用相对路径

Rsync取消交互输入密码

取消交互输入密码的步骤,是仅需要客户端做的配置,服务端不需要此配置

# 方式1:将虚拟用户的密码写入密码文件
echo "Huawei@123.com" > /etc/rsync.pass
chmod 600 /etc/rsync.pass

# 非交互式执行同步
rsync -avzP --password-file=/etc/rsync.pass /opt/size.disk rsync_backup@172.16.1.41::backup

# 方式2:设置Rsync密码的环境变量
export RSYNC_PASSWORD="Huawei@123.com"
rsync -avzP /opt/size.disk rsync_backup@172.16.1.41::backup    # 不再需要输入密码

Rsync备份案例

实现此案例需要3个角色

角色 外网(NAT) 内网(LAN) 主机名
WEB eth0:10.0.0.7 eth1:172.16.1.7 web01
NFS eth0:10.0.0.31 eth1:172.16.1.31 nfs
Rsync eth0:10.0.0.41 eth1:172.16.1.41 backup

客户端要求

  1. 客户端提前准备存放备份数据的目录,目录规则如下:/backup/nfs_172.16.1.31_2022-08-03
  2. 客户端在本地打包备份数据(系统配置文件、应用配置等)拷贝至/backup/nfs_172.16.1.31_2022-08-03
  3. 客户端最后将备份的数据进行推送至backup服务器
  4. 客户端每天凌晨1点定时执行该脚本
  5. 客户端服务器本地保留最近7天数据,避免浪费磁盘空间

服务端要求

  1. 服务端安装rsync,用于接收客户端推送的备份数据
  2. 服务端需要每天校验客户端推送的数据是否完整
  3. 服务端需要每天校验的结果通知给管理员
  4. 服务端仅保留6个月的备份数据,其余的全部删除

NFS客户端操作步骤

# 1. 创建对应备份目录
mkdir -p /server/script	# 用于存放定时任务执行的脚本文件

# 2. 编辑脚本文件
vim /server/script/client_push_date.sh
#!/bin/bash
# filename: client_push_data.sh
# drscription: 用于数据上传

# 1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Src=/backup
Host=$(hostname)
Addr=$(ifconfig eth1 | awk 'NR==2 {print $2}')
Date=$(date +%F)
Dest=${Host}_${Addr}_${Date}

# 2.创建目录
[ -d $Src/$Dest ] || mkdir -p $Src/$Dest	# 判断目录是否已存在,不存在时执行创建操作

# 3.备份文件
# 进入根目录并将所有要打包的绝对路径的根符号删除,是为了避免执行tar命令时提示去除根目录的信息
cd / && \
[ -f $Src/$Dest/system_file.tar.gz ] || tar -czf $Src/$Dest/system_file.tar.gz etc/fstab etc/passwd && \
[ -f $Src/$Dest/other_file.tar.gz ] || tar -czf $Src/$Dest/other_file.tar.gz var/spool/cron/ server/script/
# 每一次重新打包都会重新生成MD5校验码,所以执行文件判断

# 4.生成MD5校验码
# 如果不执行文件判断,每执行一次脚本都会再执行生成校验码操作,但只要压缩包文件属性未改变,生成的校验码也不会变
[ -f $Src/$Dest/md5_flag_${Date} ] || md5sum $Src/$Dest/*.tar.gz > $Src/$Dest/md5_flag_${Date}

# 5.本地推送到服务器
export RSYNC_PASSWORD=Huawei@123.com
rsync -avz $Src/$Dest rsync_backup@backup::backup

# 6.保留本地7天数据
find $Src/ -mtime +7 -type d  | xargs rm -rf

删除脚本中判断语句时,对脚本整体没有太大的影响,但反复执行脚本会出现一些系统提示,这对脚本实现的功能并没有影响,因为该脚本本身就是每天只执行一次。关于脚本的最后一个步骤,保留7天文件备份,可以通过修改日期的方式进行验证:

示例:手动验证日志文件是否正常保留

# 1.使用循环生成一个月的数据
for i in {1..30}; do date -s "2018/12/$i"; sh /server/script/client_push_data.sh; done

# 2.筛选出最近7天的数据
find /backup/ -mtime +7 -type d  | xargs rm -rf
# 反选7天以前所有的数据删除,注意,当前系统时间应该是2018/12/30,当天以及7天前的数据会被保留

最后,通过定时任务循环执行此脚本,注:定时任务设定成每分钟执行一次是为了测试定时任务是否能够正常执行。至此,客户端操作通过脚本已经全部实现

crontab -e
#crond02: rsync客户端推送
*/1 * * * *     /usr/bin/sh /server/script/client_push_data.sh

BACKUP服务端操作

# 1. 创建对应备份目录
mkdir /server/scripts -p

# 2. 编辑脚本文件
vim /server/scripts/check_client_data.sh
#!/bin/bash
# filename: check_client_data.sh
# drscription: 用于检查客户端备份数据

# 1.定义变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
Src=/backup
Date=$(date +%F)

# 2.使用MD5进行校验,并保存校验的结果
md5sum -c $Src/*_${Date}/md5_flag_${Date} > $Src/result_${Date}

# 3. 将保存的MD5校验结果发送给管理员
mail -s "Rsync MD5校验结果 ${Date}" 1234567890@qq.com < $Src/result_${Date}

# 4. 保留最近180天的数据
find $Src/ -mtime +180 -type d  | xargs rm -rf

示例:设置服务端定时任务

#crond01: Rsync数据同步校验
*/2 * * * *     /usr/bin/sh /server/scripts/check_client_data.sh

在使用邮箱发送邮件之前,需要先对邮箱进行配置:

yum install -y mailx
set from=1234567890@qq.com	# 填写发件人QQ邮箱
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=1234567890@qq.com
set smtp-auth-password=授权码	# 获取邮箱生成的客户端授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/

mail -s "QQ邮箱测试发送自己" 1015792427@qq.com < /backup/result_2022-11-24	# 测试能否手动发送邮件

最后进行整体测试:
1. 删除客户端/backup/目录下的所有数据
2. 删除服务端/backup/目录下的所有数据
3. 通过修改时间测试定时任务是否正常执行
4. 查看邮件和定时任务日志查看定时任务是否执行成功

小结:

  1. 通过邮箱测试必须准备一个在线邮箱,还需要对邮箱进行开启SMTP功能获取授权码
  2. 编写的脚本即便手动执行能够成功,但定时任务还是会因为环境变量的不同导致找不到命令,可以通过两种方式解决:脚本文件中所有命令都是用绝对路径 或 在脚本开头重新声明一下PATH
  3. 脚本中大部分的条件判断语句都是可以删除的,不影响脚本执行的结果,但会出现很多不必要的系统提示,即便不删除这些判断语句,也会在邮箱中产生一些系统提示

新增WEB客户端操作

新增WEB01客户端,模拟多台客户端同时向备份服务器推送备份数据

# 1. 初始化环境
yum install -y vim bash-completion rsync net-tools
vim /etc/hosts
172.16.1.7	web01
172.16.1.31	nfs
172.16.1.41	backup

rsync -avz root@nfs:/server /

# 2. 手动执行脚本测试
sh /server/script/client_push_data.sh
# 查看backup服务器是否已经存在多个客户端的MD5校验

Rsync备份思路

  1. 定位需要备份的文件或目录
  2. 规划用于保存备份数据的结构目录
  3. 对备份数据进行打包压缩便于统一管理,并添加标记信息
  4. 通过虚拟用户传输到备份服务器
  5. 服务端对所有客户端的备份数据进行规划管理和数据验证
  6. 服务端对备份数据的验证结果定时发送给管理员

Rsync小结

Rsync能够实现远程备份,但Rsync与备份之间并没有必然的关系,Rsync只是用于备份的某一个工具

再者,关于虚拟用户rsync_backup与进程用户rsync的区别,rsync_bakcup用户仅用于给客户端提供远程连接,rsync才能够决定是否往服务器中写入客户端推送的数据

Rsync服务故障解决思路

  1. 测试备份服务器地址是否能够正常通信
  2. 测试服务端的Rsync服务的端口是否正常
  3. 检查客户端虚拟用户账号密码是否正确,以及密码文件的权限是否600
  4. 检查服务端的数据存放目录属性、权限,以及该目录是否存在
posted @ 2023-06-19 09:16  hebo  阅读(27)  评论(0)    收藏  举报