一、备份服务

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/hostnameroot@192.168.10.31:/tmp
拉取:rsyncroot@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服务端backup192.168.10.41、172.16.1.41
rsync客户端nfs01192.168.10.31、172.16.1.31
rsync客户端web01192.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,一般使用网段。

选项参数

参数说明
roread only,只读
rwread 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