一、备份服务
1、概述
备份服务:rsyncd服务,不同主机直接数据传输
rsync特点:
rsync是个服务,也是个命令
使用方便,有多种模式
传输数据的时候是增量传输
增量与全量:
全量:无论多少数据都全部推送走(scp)
增量:只把修改、新建了文件传输走(rsync)
例如:
把/etc/目录传输到另一台机器的/tmp/目录下
scp -r /etc/ root@192.168.10.31:/tmp/
rsync -avc /etc/ root@192.168.10.31:/tmp/
温馨提示:
Linux下/tmp与/tmp/一般来说是没有区别的
但是,在rsync中有区别:
/tmp:传输目录下的内容,包含目录本身
/tmp/:传输目录下的内容,但不包含目录本身
Windows下面安装git后,打git bash就可以使用scp命令
2、rsync应用场景
应用场景 | 建议 |
---|---|
rsync作为命令使用 | 临时拉取、推送数据,可以使用scp命令实现 |
定时备份:rsync服务+定时任务 | 定时备份(定时任务备份+通过rsync传输备份) |
实时同步:rsync服务+sersync/lsyncd实现实时同步 | 解决存储服务单点问题 |
rsync服务与异地容灾 | 找一个异地的服务存放备份 |
单点问题:同一个功能、服务只有1个节点
3、rsync使用模式
模式 | 应用场景 |
---|---|
本地模式 | 不推荐使用 |
远程模式 | 传输数据(临时使用可以使用scp命令代替) |
rsync守护进程模式(daemon),rsync服务 | 传输数据(免输密码),用于定时备份、定时同步 |
4、推与拉
本质:
在于你当前在哪台节点(node)
你要的东西在哪里
推送:
[root@backup ~]#rsync -avz anaconda-ks.cfg root@192.168.10.31:/tmp
拉取:
[root@backup ~]#rsync -avz root@192.168.10.31:/tmp/1.txt /tmp/
5、本地模式
本地模式(本机操作本机):
rsync -a /etc/ /tmp/
这可以使用cp命令代替
6、远程模式
1对1远程传输数据。
格式 | ||
---|---|---|
rsync -a | 源文件 | 目标 |
推送:rsync | /etc/hostname | root@192.168.10.31:/tmp |
拉取:rsync | root@192.168.10.31:/etc/hosts | /tmp/ |
例如:
#推送/etc/hostname文件到192.168.10.31的/tmp/目录
rsync -a /etc/hostname root@192.168.10.31:/tmp/
#推送/etc目录及目录内容到192.168.10.31的/tmp/目录
rasync -av /etc root@192.168.10.31:/tmp/
#使用scp推送
scp -r /etc/ root@192.168.10.31:/tmp/
7、守护进程模式
1、服务端配置
backup服务端(备份服务器)ip:192.168.10.41、172.16.1.41,主机名:backup
1.1)安装rsync
[root@backup ~]#yum install -y rsync
rsync软件安装完成后应该包含:
/etc/rsyncd.conf :配置文件(服务端配置文件,守护进程模式)
/usr/bin/rsync :rsync命令
/usr/lib/systemd/system/rsyncd.service :systemctl对应的配置文件
配置文件:/etc/rsyncd.conf
1.2)配置详解
[root@backup ~]#vim /etc/rsyncd.conf
#create by xzm 11:11 2023-6-10
#rsyncd.conf start ###
fake super = yes #如果不开启,从centso7开始的版本传输报错(伪装成root权限)
uid = rsync #设置rsync运行的用户,虚拟用户
gid = rsync
use chroot = no
max connections = 2000 #最大连接数
timeout = 600 #超时时间,单位:秒
pid file = /var/run/rsyncd.pid #存放服务的pid号
lock file = /var/run/rsync.lock #进程/服务的锁文件,防止重复运行
log file = /var/log/rsyncd.log #rsyncd服务日志
ignore errors #忽略错误
read only = false #设为false,可以进行读写
list = false #关闭rsync服务端列表功能
#hosts allow = 172.16.1.0/24 #配置可以访问的网段、ip,不配置,则表示全部都可以访问
#hosts deny = 0.0.0.0/32 #配置禁止访问的网段、ip
auth users = rsync_backup #访问rsync服务的用户,用户名为rsync_backup
secrets file = /etc/rsync.password #密码文件,存放rsync_backup用户的密码
##################################### #以上配置为全局配置
[data] #模块名称,用户访问服务端的时候指定
comment = www by xzm #注释说明
path = /data #模块对应的目录,也就是共享的目录
1.3)创建虚拟用户
创建rsync虚拟用户
[root@backup ~]#useradd -s /sbin/nologin -M rsync
1.4)创建目录
创建共享目录/data/,属主属组为rsync
[root@backup ~]#mkdir -p /data/
[root@backup ~]#chown -R rsync.rsync /data/
1.5)创建密码文件
创建/etc/rsync.password密码文件,权限:600
[root@backup ~]#echo "rsync_backup:12345" > /etc/rsync.password
[root@backup ~]#chmod 600 /etc/rsync.password
用户名:rsync_backup,密码:12345
文件内容格式:用户名:密码
1.6)启动服务
[root@backup ~]#systemctl start rsyncd
[root@backup ~]#systemctl enable rsyncd
rsync服务端口:873
2、客户端测试
客户端为:nfs服务器,ip:192.168.10.31、172.16.1.31,主机名:nfs01
1)安装rsync
[root@nfs01 ~]#yum install -y rsync
安装完成后,不需要启动rsyncd服务
2)推送数据测试
rsync命令格式:
rsync 参数(-avz) 文件或目录 访问rsync服务的用户名@rsync服务端ip或域名::模块名
把/etc/hostname文件推送到rsync服务端
[root@nfs01 ~]#rsync -avz /etc/hostname rsync_backup@192.168.10.41::data
Password:
sending incremental file list
hostname
sent 101 bytes received 43 bytes 32.00 bytes/sec
total size is 6 speedup is 0.04
[root@nfs01 ~]#
服务端查看:
[root@backup ~]#ls /data/
hostname
[root@backup ~]#
OK,推送成功。说明,配置正确。
8、免密访问rsync服务端
客户端创建一个保存访问rsync服务端密码的文件,比如:etc/rsync.client
前面设置中,访问rsync服务端的用户名为:rsync_backup,密码:12345
因此,把密码12345写入etc/rsync.client,文件权限:600
[root@nfs01 ~]#echo 12345 > /etc/rsync.client
[root@nfs01 ~]#chmod 600 /etc/rsync.client
使用–password-file参数指定密码文件,即可免密访问rsync服务端
[root@nfs01 ~]#rsync -avz /etc/hostname rsync_backup@192.168.10.41::data --password-file=/etc/rsync.client
sending incremental file list
sent 51 bytes received 20 bytes 142.00 bytes/sec
total size is 6 speedup is 0.08
[root@nfs01 ~]#
OK,传输成功。
9、rsync核心选项
选项
rsync选项 | 含义 |
---|---|
-a | 等于-rlptgoD |
-r | 递归复制 |
-l | 复制软连接 |
-p | 保持权限不变 |
-m | 保持修改时间不变 |
-o | 所有者不变 |
-g | 用户组不变 |
-D | –devices–specials设备与特殊文件 |
-v | 显示过程 |
-z | 传输数据的时候进行压缩 |
-P | 显示传输过程进度条,–partial –progress |
–bwlimit | 限速,注意不要与-z同时使用 |
–exclude、–exclude-from | 排除 |
–delete | 目标目录与源目录保持一致的传输(高度保持客户端与服务端一致,实时同步),一般不建议使用 |
例如:
显示传输
rsync -aP --belimit=500kb /tmp/1g 192.168.10.31:/tmp/
传输并排除
rsync -av . root@192.168.10.31:/tmp/ --exclude=04
rsync -av . root@192.168.10.31:/tmp/ --exclude={04,05}
保持源与目标数据一致
rsync -av --delete . root@192.168.10.31:/tmp/
10、关于用户的理解
uid、gid、auth user、secrets file
1、用户执行命令:rsync -avz /etc/hostname rsync_backup@192.168.10.41::data --password-file=/etc/rsync.client
2、服务端收到数据:判断rsync_backup用户,然后等待输入密码
3、把用户名和密码与配置文件里面对比auth user和secrets file
4、通过后,传输数据
5、数据到达服务器后,所有者被修改为uid和gid指定的(比如,为rsync)
6、数据写入data模块(/data)目录下面
11、备份项目案例
11.1、项目分析
目标:数据备份
分析:到底备份什么,定时备份还是实时备份
例如分析如下:
需要备份的内容 | 具体位置 | 备份方法 |
---|---|---|
1、配置文件 | /etc/ 、/var/spool/cron/ | 定时备份(每天) 思考:如何实现配置文件修改了才备份,没有修改则不备份 |
2、代码文件 | /app/code/ | 定时 |
3、数据 | 数据库(专门的备份工具),存储(实时同步) | 实时、定时 |
4、运维脚本 | /server/scripts/ | 定时备份 |
5、日志文件 | /var/log/目录下面的日志 |
11.2、项目实施步骤
备份实施步骤:
备份项目步骤 | 流程 |
---|---|
1、备份所有机器、定时备份,备份数据放在备份服务器 | |
2、先准备rsync服务端,测试rsync客户端 | |
3、rsync客户端书写备份脚本 | 1、打包备份/etc/、/var/spool/cron/这2个目录,文件名称包含:年-月-日_周几 2、存放在/backup/172.16.1.xxx/ 3、备份发送到rsync服务端 4、删除本地旧的备份7天之前的,写入定时任务 |
4、rsync服务端书写检查脚本 | 1、检查/backup/目录 + mail邮件发送 2、删除旧的备份180天之前的,但保留每周一的备份 |
11.3、项目详细实施
准备3台机器:
角色 | 主机名 | ip |
---|---|---|
rsync服务端 | backup | 192.168.10.41、172.16.1.41 |
rsync客户端 | nfs01 | 192.168.10.31、172.16.1.31 |
rsync客户端 | web01 | 192.168.10.7、172.16.1.7 |
1)rsync服务端配置
添加个backup模块,对应的目录为/backup/,目录属主属组为rsync
a)修改rsync配置文件
[root@backup ~]#vim /etc/rsyncd.conf
......#其他内容不变,添加一个backuo模块
[backup]
comment = www by xzm
path = /backup
#auth users = rsync_backup #可以单独为模块设置用户和密码
#secrets file = /etc/rsync.password
可以针对不同的模块,单独设置访问的用户名和密码,把全局配置中的用户名和密码文件配置删除,在每个模块里,再设置访问的用户名和密码
b)创建模块的目录
bakcup模块对应的目录为/backup/,属主属组为rsync
[root@backup ~]#mkdir -p /backup/
[root@backup ~]#chown -R rsync.rsync /backup/
c)启动rsyncd服务
[root@backup ~]#systemctl start rsyncd
2)客户端测试
在web01服务器中,把/etc/hostname文件推送到backup服务器的backup模块
[root@web01 ~]#rsync -avz /etc/hostname rsync_backup@192.168.10.41::backup
免密访问rsync服务端:
#创建/etc/rsync.client文件,权限:600,保存rsync_backup用户的密码:12345
[root@web01 ~]#echo 12345 > /etc/rsync.client
[root@web01 ~]#chmod 600 /etc/rsync.client
免密推送:
[root@web01 ~]#rsync -avz /etc/hostname rsync_backup@192.168.10.41::backup --password-file=/etc/rsync.client
3)客户端备份脚本
以web01客户端为例,脚本名称:bak-conf.sh,脚本放在 /server/script/目录中。
脚本实现的功能:
1、打包备份/etc/、/var/spool/cron/这2个目录,文件名称包含:年-月-日_周几
2、存放在/backup/172.16.1.xxx/
3、备份发送到rsync服务端
4、删除本地旧的备份7天之前的
具体脚本如下:
[root@web01 ~]#mkdir -p /server/script/
[root@web01 ~]#vim /server/script/bak-conf.sh
#!/bin/bash
#author:xzm
#desc:备份各种配置文件脚本
#1、vars
#年-月-日_周几:date +%F_%w
date=`date +%F_%w`
ip=`hostname -I | cut -d " " -f2` #客户端有两个ip,取第二个,即172开头的
bak_dir=/backup/$ip
bak_file=conf-$date.tar.gz
md5=bak.md5
#2、rsnync参数
rsync_server_user=rsync_backup
rsync_server_ip=172.16.1.41
rsync_server_module=backup
rsync_server_pass=/etc/rsync.client
#3、打包压缩
[ ! -d $bak_dir ] && mkdir -p $bak_dir #判断存放备份的目录是否存在,不存在则创建
tar czf $bak_dir/$bak_file /etc/ /var/spool/cron
#给备份文件创建校验码
md5sum $bak_dir/$bak_file > $bak_dir/$md5
#4、发送到rsync服务器
rsync -avz $bak_dir $rsync_server_user@$rsync_server_ip::$rsync_server_module --password-file=$rsync_server_pass
#5、删除旧的备份
find $bak_dir -type f -name "*.tar.gz" -mtime +7 -exec rm -f {} \;
执行脚本:
[root@web01 ~]#sh /server/script/bak-conf.sh
4)客户端定时任务
把执行备份脚本写入定时任务
[root@web01 ~]#crontab -e
00 00 * * * sh /server/script/bak-conf.sh &>/dev/null
sh -x 脚本:调试脚本
其他客户端按照上述流程配置即可。
5)服务端检查脚本
a)服务端脚本功能:
1、检查/backup/目录 + mail邮件发送
2、删除旧的备份180天之前的,但保留每周一的备份
b)详细脚本:
[root@backup ~]#mkdir -p /server/script/
[root@backup ~]#vim /server/script/backup_check.sh
#!/bin/bash
#desc:检查备份、清理旧的备份
date=`date +%F`
#1、删除旧的的备份
find /backup/ -type f -name "*.tar.gz" ! -name "*_1.tar.gz" -mtime +180 | xargs rm -f
#2、校验
find /backup/ -type f -name "bak.md5" | xargs md5sum -c &>/backup/bak_result.txt
#3、发送校验邮件
cat /backup/bak_result.txt | mail -s "$date 备份结果" 1282923129@qq.com
c)邮件服务配置:
Linux端配置/etc/mail.rc文件,配置发件人信息
#在该文件最末尾写入配置信息
[root@linux-87-01 ~]# vim /etc/mail.rc
set from=xzm_28@163.com #发件人
set smtp=smtp.163.com #配置使用163邮箱发生邮件
#如果邮件服务端口被营运商屏蔽了,则
#set smtp=smtps://smtp.163.com:465
#set ssl-verify=ignore
#set nss-config=/etc/pki
set smtp-auth-user=xzm_28@163.com #用户名:邮箱名字、真实的邮箱地址
set smtp-auth-password=1233544 #邮箱授权码,假设为1233544NXYKNJGAFALYWCTE
set smtp-auth=login #认证形式:login
配置好之后,就可以发邮件了。
d)测试
执行脚本文件
[root@backup ~]#sh /server/script/backup_check.sh
会收到邮件:

OK,服务端、客户端配置成功。
两台客户端设置成功执行备份脚本后,在服务端查看:
[root@backup ~]#tree -F /backup/
/backup/
├── 172.16.1.31/
│ ├── bak.md5
│ └── conf-2023-06-11_0.tar.gz
└── 172.16.1.7/
├── bak.md5
└── conf-2023-06-11_0.tar.gz
2 directories, 4 files
[root@backup ~]#
OK,两台客户端备份成功。
e)写入定时任务
[root@backup ~]#crontab -e
#2、check
00 01 * * * sh /server/script/backup_check.sh &>dev/null
12、md5校验
数据在网络传输中,可能会存在丢失的可能。怎么确保客户端和服务端的备份是一致的?
对备份后的数据包进行校验,把校验码和备份的数据一同发送给服务端,服务端收到备份的数据和校验码后,对数据进行校验比对。
常用的校验有md5、sha256等。
md5sum应用:用于对比文件是否变化,可以给命令使用,也可以给网站代码使用
md5校验:md5sum 文件|字符(串)
例如:对文件生成校验码(也叫指纹)
[root@web01 ~]#md5sum anaconda-ks.cfg
8bf705952c236d91efbb516a2b0b7833 anaconda-ks.cfg
[root@web01 ~]#
也可以对字符(串)生成校验码:
[root@web01 ~]#echo 123 | md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
[root@web01 ~]#
指纹对比方法:
1、肉眼对比,人工比对两个指纹信息是否一样
2、md5sum -c 指纹信息文件
选项说明:
-c:--check,根据指纹文件,找到对应的文件,一个一个文件重新创建指纹信息(新的)与指纹文件(旧的)进行对比,如果一致,表示文件内容没有变化;不一致,则表示文件内容以改变。
--quiet:只显示校验错误信息,正确的不显示
例如:
#创建1.txt文件
[root@web01 ~]#echo 123 > 1.txt
#md5生成指纹,并保存在1.txt.md5文件中
[root@web01 ~]#md5sum 1.txt > 1.txt.md5
#通过指纹文件比对,找到指纹对应的文件
[root@web01 ~]#md5sum -c 1.txt.md5
1.txt: OK
[root@web01 ~]#md5sum --quiet -c 1.txt.md5 #--quiet:只显示校验错误信息,正确的不显示
[root@web01 ~]#
[root@web01 ~]#echo 123 > 1.txt
[root@web01 ~]#md5sum --quiet -c 1.txt.md5
1.txt: FAILED
md5sum: WARNING: 1 computed checksum did NOT match
[root@web01 ~]#
批量保存与校验:
[root@web01 ~]#find /etc/ -type f -name '*.conf' | xargs md5sum > etc-conf-all.md5
sha256校验:
[root@web01 ~]#echo 123 | md5sum
ba1f2511fc30423bdbb183fe33f3dd0f -
[root@web01 ~]#echo 123 | sha256sum
181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b -
[root@web01 ~]#
显然,sha256比md5的校验信息长。
除了sha256,还有:sha1sum 、sha224sum、sha384sum、sha512sum
在前面的备份项目案例中,已经加入了md5校验。详情,回头看前面的脚本
二、存储服务
1、存储分类
存储的要求:空间大
分类 | 说明 |
---|---|
硬件存储 | 硬件存储,磁盘多,使用的时候挂载即可 |
开源软件 | 普通存储:NFS、Samba 分布式存储:GlusterFS、Ceph,…,FastDFS、MinIO |
云产品 | 阿里云OSS(对象存储)、七牛云存储、腾讯云COS、华为OSS |
2、NFS原理
NFS:Network File System,网络文件系统
NFS服务端由2个服务组成:NFS服务、rpcbind服务(portmap)
关于RPC说明:
RPC:远程过程调用,本质起到调度作用
rpc服务从CentOS6开始叫rpcbind,之前叫portmapper
3、NFS快速上手指南
3.1)环境说明
环境 | 主机 |
---|---|
nfs服务端 | 主机名:nfs01,ip:192.168.10.31、172.16.1.31 |
nfs客户端 | 主机名:web01,ip:192.168.10.7、172.16.1.7 通过挂载使用 |
3.2)服务端部署
1、安装nfs-utils、rpcbind
[root@nfs01 ~]#yum install -y rpcbind nfs-utils
#utils 工具集合
2、nfs配置
a)配置nfs
nfs配置文件为:/etc/exports
比如,共享目录为/data_video/,属主属组为:nfsnobody
为啥是nfsnobody?因为nfs服务默认的匿名用户就是nfsnobody
[root@nfs01 ~]#vim /etc/exports
#1、video web
/data_video/ 172.16.1.0/24(rw)
/etc/exports配置文件格式:
共享目录 网段/ip/域名(选项参数)
共享目录:指需要共享的目录,目录的属主属组为:nfsnobody
网段/ip:设置可以访问nfs服务的网段或ip或域名,如:192.168.10.0/24、192.168.10.10、web01,一般使用网段。
选项参数:
参数 | 说明 |
---|---|
ro | read only,只读 |
rw | read write,读写 |
root_squash | 当nfs客户端以root用户访问时,映射为nfs服务端的匿名用户(默认) |
no_all_squash | 当nfs客户端不是以root用户访问时,则不进行用户压缩(保持原始用户)(默认) |
all_squash | 无论nfs客户端以什么用户访问,均映射为nfs服务端的匿名用户 |
anonuid、anongid | 用于指定压缩的匿名用户(默认是nfsnobody用户),anonuid=65534,anongid=65534 |
sync | 同步,只要用户上传,就把数据写到磁盘上 |
aysnc | 异步,用户上传的数据,nfs先临时存放到内存中,过一段时间再写入磁盘,如果并发高,数据可能会丢失 |
同步:在网站架构中,指的是直接访问对应的资源
异步:在网站架构中,利用各种缓存达到用户优先访问缓存,如果缓存没有再访问对应服务
如果不在/etc/exports文件中配置root_squash、no_all_squash。则默认会加上root_squash、no_all_squash参数。
b)创建共享目录
创建属主属组为nfsnobody的目录data_video/
[root@nfs01 ~]#mkdir /data_video/
[root@nfs01 ~]#chown -R nfsnobody.nfsnobody /data_video/
3、启动服务
必须先启动rpcbind服务,再启动nfs服务,否则rpc无法监听到nfs服务
[root@nfs01 ~]#systemctl start rpcbind
[root@nfs01 ~]#systemctl start nfs
#设置开机启动
[root@nfs01 ~]#systemctl enable rpcbind
[root@nfs01 ~]#systemctl enable nfs
查看rpc:
[root@nfs01 ~]#rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
rpc、nfs服务已启动
rpcbind -p ip:检查nfs服务端的rpc信息,主要检查是否有nfs信息即可
showmount -e ip:检查nfs服务端共享信息(共享了哪些目录)
注意:rpcbind启动之后,就不需要重启了。否则,重启了rpcbind服务后,就必须重启nfs服务,否则rpcbind服务无法监控到nfs服务。
重启nfs服务的方法:
#方法1
[root@nfs01 ~]#systemctl restart nfs
#方法2
[root@nfs01 ~]#systemctl reload nfs
3.3)客户端挂载
web01客户端挂载nfs服务端的共享目录
查看nfs服务端有哪些共享目录
[root@web01 ~]#showmount -e 192.168.10.31
Export list for 192.168.10.31:
/data_video 172.16.1.0/24
[root@web01 ~]#
客户端要安装nfs,但不需要启动nfs服务。如果客户端不安装nfs,则无法挂载。
#客户端安装nfs
[root@web01 ~]#yum install -y nfs-utils
将客户端的/video_upload/目录挂载到nfs服务端的/data_video/目录
[root@web01 ~]#mkdir /video_upload/
[root@web01 ~]#mount -t nfs 172.16.1.31:/data_video/ /video_upload/
[root@web01 ~]#df -Th /video_upload/
Filesystem Type Size Used Avail Use% Mounted on
172.16.1.31:/data_video nfs4 47G 2.3G 45G 5% /video_upload
[root@web01 ~]#
OK,挂载成功。
看看可不可创建文件?
[root@web01 ~]#echo 123 > /video_upload/1.txt
到nfs服务端查看一下:
[root@nfs01 ~]#cat /data_video/1.txt
123
[root@nfs01 ~]#
OK,没问题,nfs服务配置成功。
永久挂载的方法:
1、把挂载命令写入/etc/rc.d/rc.local文件,然后给/etc/rc.d/rc.local文件添加可执行权限
2、在/etc/fstab文件中配置挂载,比如:
172.16.1.31:/data_video /video_upload/ nfs defauls 0 0
注意:如果客户端配置了永久挂载nfs,则必须先启动nfs服务端
如果其他客户端需要挂载,则参照上述流程配置即可。
强制卸载:umount -lf 目录
4、nfs相关文件
nfs服务端或客户端 | 说明 |
---|---|
nfs服务端配置 | /etc/exports(配置文件里面的)—> /var/lib/nfs/etab(当前使用的nfs服务端配置) |
nfs客户端配置 | 客户端:mount /etc/rc.local或/etc/fstab —> /proc/mounts(当前系统的挂载情况) |
1)为啥是/etc/exports?
[root@nfs01 ~]#systemctl cat nfs | grep export
ExecStartPre=-/usr/sbin/exportfs -r
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f
ExecReload=-/usr/sbin/exportfs -r
[root@nfs01 ~]#
/etc/exports:由nfs管理systemctl命令的背后是在调用exportfs命令
2)没有在/etc/exports配置的选项
/etc/exports文件中没有配置的选项参数,默认可以在 /var/lib/nfs/etab文件中查看
[root@nfs01 ~]#cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
/etc/exports文件配置的参数:
[root@nfs01 ~]#cat /etc/exports
/data/ 172.16.1.0/24(rw)
显然, /var/lib/nfs/etab文件的参数比/etc/exports文件中的多很多
anonuid=65534,anongid=65534这个就是默认的虚拟用户nfsnobody
3)客户端使用df -h没有看到挂载信息
如果客户端使用df -h没有看到挂载信息的时候,可以查看/proc/mounts文件,里面有全部的挂载信息
[root@web01 ~]#cat /proc/mounts
5、用户压缩
user mapping:用户压缩、用户映射
nfs客户端挂载nfs服务端后,创建的文件默认属于nfsnobody,这种操作就叫做用户压缩(映射)
用户压缩是通过nfs服务端的配置实现
用户压缩系列 | 说明 |
---|---|
root_squash | 当nfs客户端以root用户访问时,映射为nfs服务端的匿名用户(默认) |
no_all_squash | 当nfs客户端不是以root用户访问时,则不进行用户压缩(保持原始用户)(默认) |
all_squash | 所有用户都进行压缩 |
anonuid、anongid | 用于指定压缩的匿名用户(默认是nfsnobody用户),anonuid=65534,anongid=65534 |
用户压缩/用户映射:NFS客户端访问NFS服务端的共享目录的时候变成了什么用户
nfs客户端用户 nfs服务端用户
root -----> nfsnobody
6、用户压缩案例
默认的匿名用户是nfsnobody(uid、gid均为65534),那么如何自定义匿名用户呢?
自定义匿名用户为:www(uid、gid为1999),该用户为虚拟用户
服务端、客户端均创建www(uid、gid为1999)虚拟用户
1)用户创建
#客户端
[root@web01 ~]#groupadd -g 1999 www
[root@web01 ~]#useradd -u 1999 -g www -s /sbin/nologin -M www
#服务端
[root@nfs01 ~]#groupadd -g 1999 www
[root@nfs01 ~]#useradd -u 1999 -g www -s /sbin/nologin -M www
2)服务端配置
服务端(nfs01)共享目录:/nfsdata/,属主属组:www
[root@nfs01 ~]#mkdir /nfsdata
[root@nfs01 ~]#chown www.www /nfsdata
服务端配置文件修改:
指定自定义的虚拟用户
[root@nfs01 ~]#vim /etc/exports
#2、pic web
/nfsdata 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
重启nfs服务
[root@web01 ~]#systemctl restart nfs
3)客户端挂载
客户端(web01):将nfs服务端的/nfsdata/挂载到客户端的/upload-pic/目录中
[root@web01 ~]#mkdir /upload-pic/
[root@web01 ~]#mount -t nfs 172.16.1.31:/nfsdata/ /upload-pic/
[root@web01 ~]#df -Th /upload-pic/
Filesystem Type Size Used Avail Use% Mounted on
172.16.1.31:/nfsdata nfs4 47G 2.3G 45G 5% /upload-pic
[root@web01 ~]#
7、nfs优化
终极优化目标:尽可能让用户的请求在访问网站架构之前解决掉(尽可能把用户的请求往前推)
nfs优化:硬件(物理服务器+nfs服务)
nfs安全优化:客户端挂载,只能上传,无法执行
mount -o noexec,nosuid,nodev -t nfs 172.16.1.31:/nfsdata/ /upload-pic/
-o:指定挂载选项
noexec:挂载的nfs目录中如果有命令,无法运行
nosuid:带有suid命令,无法执行
nodev:带有特殊属性的文件
NFS有单点故障:
准备个nfs备用节点,故障的时候进行切换
选择其他存储:公有云OSS(阿里云)(对此昂存储在代码里面调用)
三、实时同步服务
实时同步sersync依赖rsync服务端
实时同步工具:
1、inotify:是个命令,监控指定目录是否发生变化(但有bug,需要写脚本,不推荐使用)
2、sersync:国产开源的,内置inotify+rsync命令
3、lsyncd:有部分公司在用
1、sersync原理
通过inotify监控目录,通过rsync把变化的文件推送到rsync服务端
2、sersync架构
简单架构:
实时监控存储服务器,文件有变化就通过rsync推送到备份服务器

3、快速上述指南
1)rsync服务配置(备份服务器)
rsync服务端:ip:192.168.10.41、172.16.1.41,主机名:backup
a)安装rsync
[root@backup ~]#yum install -y rsync
b)修改配置文件
添加一个nfsbackup模块,对应目录为/nfsbackup/,属主属组为:rsync
[root@backup ~]#vim /etc/rsyncd.conf
#create by xzm 11:11 2023-6-10
#rsyncd.conf start ###
fake super = yes #如果不开启,从centso7开始的版本传输报错(伪装成root权限)
uid = rsync #设置rsync运行的用户,虚拟用户
gid = rsync
use chroot = no
max connections = 2000 #最大连接数
timeout = 600 #超时时间,单位:秒
pid file = /var/run/rsyncd.pid #存放服务的pid号
lock file = /var/run/rsync.lock #进程/服务的锁文件,防止重复运行
log file = /var/log/rsyncd.log #rsyncd服务日志
ignore errors #忽略错误
read only = false #设为false,可以进行读写
list = false #关闭rsync服务端列表功能
#hosts allow = 172.16.1.0/24 #配置可以访问的网段、ip,不配置,则表示全部都可以访问
#hosts deny = 0.0.0.0/32 #配置禁止访问的网段、ip
auth users = rsync_backup #访问rsync服务的用户,用户名为rsync_backup
secrets file = /etc/rsync.password #密码文件,存放rsync_backup用户的密码,密码为12345
##################################### #以上配置为全局配置
[nfsbackup]
comment = backup nfs server
path = /nfsbackup/
创建rsync_backup用户的密码文件:
[root@backup ~]#echo "rsync_backup:12345" > /etc/rsync.password
[root@backup ~]#chmod 600 /etc/rsync.password
c)创建目录/nfsbackup/,属主属组为:rsync
[root@backup ~]#mkdir /nfsbackup/
[root@backup ~]#chown rsync.rsync /nfsbackup/
d)重启rsync服务
[root@backup ~]#systemctl restart rsyncd
e)测试
测试:在客户端推送文件到rsync服务端
[root@web01 ~]#rsync -avz /etc/hostname rsync_backup@172.16.1.41::nfsbackup
Password:
sending incremental file list
hostname
sent 101 bytes received 43 bytes 41.14 bytes/sec
total size is 6 speedup is 0.04
[root@web01 ~]#
根据提示信息,OK,rsync服务端配置成功。
2)部署sersync(nfs服务端)
nfs服务端部署sersync。
sersync无法通过yum安装
sersync下载地址:https://github.com/wsgzao/sersync
nfs服务端:ip:192.168.10.31、172.16.1.31,主机名:nfs01
需要监控的目录为:/data/,属主属组:nfsnobody
[root@nfs01 ~]#mkdir /data/
[root@nfs01 ~]#chown nfsnobody.nfsnobody /data/
目录规划:
/app/tools/sersync/
/app/tools/sersync/bin/
/app/tools/sersync/conf/
1、创建相关目录
[root@nfs01 ~]#mkdir -p /app/tools/sersync/{bin,conf}
2、解压sersync压缩包
[root@nfs01 ~]#tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz
解压后,得到GNU-Linux-x86目录:
[root@nfs01 ~]#tree GNU-Linux-x86/
GNU-Linux-x86/
├── confxml.xml #配置文件
└── sersync2 #sersync命令
0 directories, 2 files
[root@nfs01 ~]#
3、复制sersync文件
把GNU-Linux-x86/sersync2文件复制到/app/tools/sersync/bin/目录中,并重命名为sersync。
把GNU-Linux-x86/confxml.xml文件复制到/app/tools/sersync/conf/目录中
4、修改配置文件
sersync配置文件:/app/tools/sersync/conf/confxml.xml
修改前要备份,比如,备份为:confxml.xml.bak
配置文件为confxml.xml解释:
a)开头部分:
通过的时候,排查什么。默认是关闭false
xml文件的注释:<!– 注释的内容 –>
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/> <!-- 默认:false -->
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
b)inotify监控部分:
配置inotify监控规则通过事件
<inotify>
<delete start="true"/> <!--监控是否有删除,true表示监控删除,false表示不监控删除 -->
<createFolder start="true"/> <!--监控是否有创建目录-->
<createFile start="false"/> <!--监控是否创建文件-->
<closeWrite start="true"/> <!--是否有closewrite事件,修改后的退出(即文件被修改)-->
<moveFrom start="true"/> <!--移动、改名-->
<moveTo start="true"/> <!--移动、改名-->
<attrib start="false"/> <!--文件属性变化-->
<modify start="false"/> <!--文件内容修改-->
</inotify>
c)监控的目录变化配置
<sersync>
<localpath watch="/data"> <!--监控的目录,一般为存储的共享目录-->
<remote ip="172.16.1.41" name="nfsbackup"/> <!--rsync服务端ip地址和模块名称-->
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
d)配置rsync客户端命令:
<rsync>
<commonParams params="-az"/> <!--命令参数设置-->
<auth start="true" users="rsync_backup" passwordfile="/etc/rsync.client"/>
<!--auth start= "true"开启认证功能,users设置访问rsync服务的用户名(这里为rsync_backup用户-->)
<!--passwordfile设置保存访问rsync服务端的密码文件,这里是/etc/rsync.client文件-->
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
e)日志文件:
日志文件假设为:/var/log/sersync.sh.log
<failLog path="/var/log/sersync.sh.log" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
修改配置文件后,跟原备份文件对比一下,看看修改了哪些内容:
[root@nfs01 ~]#cd /app/tools/sersync/conf/
[root@nfs01 /app/tools/sersync/conf]#vimdiff confxml.xml confxml.xml.bak
如下:

通过对比发现,只修改了有颜色标注的5行
5、创建密码文件
客户端访问rsync服务的用户名是:rsync_backup,密码:12345
创建保存密码的文件:/etc/rsync.client,权限:600
[root@nfs01 ~]#echo 12345 > /etc/rsync.client
[root@nfs01 ~]#chmod 600 /etc/rsync.client
6、启动sersync服务
由于sersync不是通过yum安装的,所以,默认不能通过systemctl start 来启动服务。
直接运行sersync命令,使用-h参数查看命令使用帮助:
[root@nfs01 ~]#/app/tools/sersync/bin/sersync -h
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
_______________________________________________________
参数-d:启用守护进程模式
参数-r:在监控前,将监控目录与远程主机用rsync命令推送一遍
c参数-n: 指定开启守护线程的数量,默认为10个
参数-o:指定配置文件,默认使用confxml.xml文件
参数-m:单独启用其他模块,使用 -m refreshCDN 开启刷新CDN模块
参数-m:单独启用其他模块,使用 -m socket 开启socket模块
参数-m:单独启用其他模块,使用 -m http 开启http模块
不加-m参数,则默认执行同步程序
________________________________________________________________
[root@nfs01 ~]#
使用sersync命令的绝对路径形式。
为了避免使用绝对路径执行命令,可把该命令做个软连接到/bin/目录:
[root@nfs01 ~]#ln -s /app/tools/sersync/bin/sersync /bin/
也可以在/etc/profile文件中,把sersync命令的路径添加到PATH环境变量:
[root@nfs01 ~]#vim /etc/profile
export PATH=$PATH:/app/tools/sersync/bin/
[root@nfs01 ~]#source /etc/profile
1)启动sersync服务
启动sersync服务要指定其配置文件:
[root@nfs01 ~]#sersync -rdo /app/tools/sersync/conf/confxml.xml
execute command: cd /data && rsync -az -R --delete ./ rsync_backup@172.16.1.41::nfsbackup --password-file=/etc/rsync.client >/dev/null 2>&1
run the sersync:
watch path is: /data
[root@nfs01 ~]#
启动结果,有–delete选项,是因为,配置文件中的delete start设为true。
--delete:目标目录与源目录保持一致的传输(高度保持客户端与服务端一致,实时同步)
如果配置文件有多个,则执行多次命令,如:
[root@nfs01 ~]#sersync -rdo 配置文件1
[root@nfs01 ~]#sersync -rdo 配置文件2
2)关闭sersync服务
由于不能使用systemctl去启动、关闭。因此,要关闭sersync服务,就要使用kill命令关闭服务:
kill sersync服务的pid
或者:pkill 服务名
[root@nfs01 ~]#pkill sersync
查看sersync服务的pid:
[root@nfs01 ~]#ps -ef | grep sersync
root 1993 1 0 21:57 ? 00:00:00 sersync -rdo
3)开机启动
把启动sersync服务的命令写入/etc/rc.d/rc.local文件中,并给/etc/rc.d/rc.local文件添加可执行权限
[root@nfs01 ~]#vim /etc/rc.d/rc.local
sersync -rdo /app/tools/sersync/conf/confxml.xml
/app/tools/sersync/conf/confxml.xml
[root@nfs01 ~]#chmod +x /etc/rc.d/rc.local
7、测试
nfs服务端监控的目录是/data/,在/data/中创建文件,看看会不会同步到rsync服务端(备份服务器)
rsync服务端(备份服务器)共享的目录是:/nfsbackup
[root@backup ~]#watch ls -l /nfsbackup/

nfs服务端创建文件:
[root@nfs01 ~]#echo 123 > /data/1.txt
再看看rsync服务端:

OK,已经实时同步了。
8、web服务器挂载
web服务器的/upload/目录挂载到nfs存储服务器的/data/目录
[root@web01 ~]#mkdir /upload/
[root@web01 ~]#mount -t nfs 172.16.1.31:/data/ /upload/
[root@web01 ~]#df -Th /upload
Filesystem Type Size Used Avail Use% Mounted on
172.16.1.31:/data nfs4 47G 2.3G 45G 5% /upload
[root@web01 ~]#
OK,挂载成功。
如要永久挂载,则在/etc/fstab文件中配置:
[root@web01 ~]#vim /etc/fstab
172.16.1.31:/data/ /upload/ nfs defaults 0 0
在web服务端的/upload/目录中创建文件,会不会同步到备份服务器(rsync服务端)?
[root@web01 ~]#echo 123 > /upload/web.txt
备份服务器(rsync服务端)查看:
[root@backup ~]#ll /nfsbackup/
total 4
-rw-r--r-- 1 rsync rsync 4 Jun 12 22:23 web.txt
[root@backup ~]#
OK,实时同步成功。

4、小结
1)sersync依赖于rsync服务端
2)小项目:
用户上传文件到web服务,web服务器挂载nfs服务器,nfs实时同步到备份服务器。
rsync+nfs+sersync串联在一起
3)搭建流程:
1、rsync服务端与客户端配置
rsync服务端:配置文件(/etc/rsyncd.conf)、用户、共享目录(属主属组:rsync)及权限、密码文件、密码文件权限
rsync客户端:免密访问rsync服务端(--password-file)
2、nfs服务端与客户端挂载
nfs服务端:配置文件(/etc/exports)、共享目录(属主属组:nfsnobody)、共享目录权限
nfs客户端:挂载与永久挂载
3、sersync实时同步指定的目录
配置文件:confxml
在nfs服务端上监控指定目录:sersync -rdo xxxx配置文件.xml