Linux基础27 NFS总结, Rsync+NFS实战, 解决NFS单点问题, inotify, sersync实时同步

发布时间 2023-07-19 17:47:15作者: 战斗小人

NFS小结

1.NFS存储优点

1.NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
2.NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见

2.NFS局限性

1.存在单点故障,如果构建高可用维护麻烦web->nfs()->backup
2.NFS数据明文,并不对数据做任何校验
3.客户端挂载NFS服务没有密码验证,安全性一般(内网使用)

3.NFS应用建议

1.生产场景应将静态数据尽可能往前端推,减少后端存储压力
2.必须将存储里的静态资源通过CDN缓存jpg\png\mp4\avi\css\js
3.如果没有缓存或架构本身历史遗留问题太大,再多存储也无用

 

Rsync+NFS实战,解决NFS单点问题

环境装备

 

主机角色ip
web01 NFS客户端、RSYNC客户端 172.16.1.7
nfs NFS服务端、RSYNC客户端 172.16.1.31
backup NFS服务端、RSYNC服务端 172.16.1.41

 

2.搭建上传作业系统

1)安装http服务

[root@web01 ~]# yum install -y httpd php

2)配置httpd用户

[root@web01 ~]# vim /etc/httpd/conf/httpd.conf
User www    # 默认是apache,这里保持统一
Group www

3)创建用户

groupadd www -g 666
useradd www -u 666 -g 666 -s /sbin/nologin -M # 不需要登录,不需要家目录

4)上传代码

cd /var/www/html/
# 放入上传文件php代码,index.html, file.php
# 修改上传路径为/var/www/html/upload

5)授权

chown -R www.www /var/www/html

6)启动httpd

systemctl start httpd
[root@web01 html]# netstat -lntp |grep 80
tcp6       0      0 :::80                   :::*                    LISTEN      30217/httpd

7)访问测试

 

3.将站点目录挂载到nfs服务器

服务端

1)安装nfs

yum install -y nfs-utils rpcbind

2)配置nfs

[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

3)创建用户

[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

4)创建目录并授权

[root@nfs ~]# mkdir /data
[root@nfs /]# chown -R www.www /data/

5)启动NFS

[root@nfs /]# systemctl start rpcbind nfs-server

6)验证NFS配置

[root@nfs /]# cat /var/lib/nfs/etab 
/data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)

 

客户端(web01)

7)安装rpcbind和nfs

yum install -y nfs-utils rpcbind

8)查看挂载点

[root@web01 html]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

9)挂载

[root@web01 html]# mount -t nfs 172.16.1.31:/data /var/www/html/upload
[root@web01 html]# df -h

10)测试

4.把NFS挂载目录数据同步到backup服务器

rsync服务端(backup)

1)安装rsync

[root@backup ~]# yum install -y rsync
vim /etc/rsyncd.conf
------------------------------
uid = www
gid = www
port = 873
fake super = yes
use chroot = no
max connections = 200
timeout = 600
ignore errors
read only = false
list = false
auth users = rsync_backup
secrets file = /etc/rsync.passwd
log file = /var/log/rsyncd.log
############################
[data]
path = /data

3) 创建用户用户组

[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666 -s /sbin/nologin -M

4)创建密码文件并授权

echo "rsync_backup:123" > /etc/rsync.passwd
chmod 600 /etc/rsync.passwd

5)创建目录并授权

mkdir /data
chown -R www.www /data

6)启动rsyncd

systemctl start rsyncd

 

rsync客户端(NFS服务器)

7)将/data目录推送至backup服务器/data

# 方式一:手动输入密码
[root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data

# 方式二:配置环境变量
[root@nfs ~]# export RSYNC_PASSWORD=123
[root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data

# 方式三:指定密码文件
[root@backup ~]# echo "123" > /etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@nfs ~]# rsync -avz /data/ rsync_backup@172.16.1.41::data --password-file=/etc/rsync.password

5. 当NFS服务器出现问题,将web服务器挂载到backup服务器

backup服务器搭建NFS服务端

1)安装NFS

yum install -y rpcbind nfs-utils

2) 配置nfs

[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

3)创建目录并授权

mkdir /data
chown -R www.www /data/

4) 启动NFS

[root@backup /]# systemctl start nfs-server

5) 验证NFS

[root@backup /]# cat /var/lib/nfs/etab 
/data   172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)

 

6.当nfs服务器出现问题,切换挂载

[root@web01 ~]# umount -lf /var/www/html/
[root@web01 ~]# mount -t nfs 172.16.1.41:/data /var/www/html/upload

注: nfs没有集群,一般出问题了,都是人工去切换,挂载到另一台服务器上

 

7)实时同步inotify

1)安装inotify

[root@nfs ~]# yum install -y inotify-tools

2)inotify参数

-m    持续监控
-r    递归
-q    静默,仅打印时间信息
--timefmt    指定输出时间格式
--format    指定事件输出格式
    %Xe  事件
    %w   目录
    %f    文件
-e    指定监控的事件
    access  访问
    modify 内容修改
    attrib    属性修改
    close_write  修改正式文件内容
    open    打开
    create   创建
    delete   删除
    umount  卸载

3)测试命令

/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /data

4)编写实时同步脚本

[root@nfs ~]# vim inotify.sh
#!/bin/bash
dir=/data
export RSYNC_PASSWORD=123
/usr/bin/inotifywait -mrq --format '%w %f' -e create,delete,attrib,close_write $dir | while read line;do
cd $dir && rsync -az -R --delete . rsync_backup@172.16.1.41::data >/dev/null 2>&1
done &
[root@nfs ~]# sh inotify.sh

5)上传一个文件,web端查看,nfs挂载目录查看,backup服务器备份目录查看

 

sersync实时同步

什么是实时同步

1.什么是实时同步

实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器

2.为什么实时同步

保证数据的连续性,减少人力维护成本,解决nfs单点故障

3.实现同步的原理

实现同步需要借助inotify通知接口,用来监控目录的变化,如果监控的目录发生变更,则触发动作,这个动作可以是进行一次同步操作,或其他操作;

4.实时同步工具的选择

sersync+RSYNC(√)、inotify+rsync

Inotify是一个通知接口,用来监控文件系统的各种变化,如果文件存取,删除,移动。可以非常方便地实现文件异动告警,增量备份,并针对目录或文件的变化及时作出相应。rsync+inotify可以做到实时增量备份

sersync是国人基于rsync+inotify-tools开发的工具,不仅保留了优点同时还强化了实时监控,文件过滤,简化配置等功能,帮助用户提高运行效率,节省时间和网络资源。

 

sersync项目实战

1.环境准备

主机内网安装
web01 172.16.1.7 部署作业代码
nfs 172.16.1.31 rsync+inotify+sersync、NFS服务端
backup 172.16.1.41 rsync服务端

2.nfs服务器部署sersync

1)安装rsync和inotify
[root@nfs ~]# yum install -y rsync inotify-tools        # sersync需要rsync和inotify的命令作为基础
2) 下载sersync(二进制包)
[root@nfs ~]# wget http://down.whsir.com/downloads/sersync2.5.4_64bit_binary_stable_final.tar.gz
3)安装sersync
[root@nfs ~]# tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz    # 二进制包解压就能用

源码包:解压,生成,编译,安装

4)移动并改名
[root@nfs ~]# mv GNU-Linux-x86 /usr/local/sersync
5) 配置sersync
[root@nfs sersync]# vim confxml.xml
------------------------------------------------
# 修改下方内容
# <filter> 过滤
# <inotify> 监控
<inotify>
    # 监控的动作,true就推送,false就不推送
    <delete start="true"/>
    <createFolder start="true"/>
    <createFile start="true"/>    # 创建文件,要改成true
    <closeWrite start="true"/>
    <moveFrom start="true"/>    # 移动进去
    <moveTo start="true"/>        # 移动走
    <attrib start="true"/>        # 修改属性,要改成true
    <modify start="true"/>        # 文件被写入, 要改成true
<inotify>
<sersync>
        <localpath watch="/data">    # 监控的目录
           # rsync服务端IP                # 模块名
            <remote ip="172.16.1.41" name="data"/>    # 传输的地址,模块名
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->    # 可以写多个
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            # rsync推送时的参数
            <commonParams params="-az"/>    # rsync命令的参数
            # rsync推送时认证    # 认证的虚拟用户            # 虚拟用户对应的密码文件
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
            # 如果rsync不适用默认的873端口,使用改参数指定
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->    # 超时时间,秒
            <ssh start="false"/>
        </rsync>
        <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->        # 错误日志保存路径
        # 定时任务,设置多久(每600分钟)进行一次全量备份
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">        # 定时备份排除文件
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>

 

6)创建密码文件
echo "123" > /etc/rsync.password
chmod 600 /etc/rsync.password
7) 查看sersync命令
[root@nfs sersync]# ./sersync2 -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参数,则默认执行同步程序
________________________________________________________________
8)启动sersync
# 注意执行目录
[root@nfs sersync]# ./sersync2 -dro confxml.xml
[root@nfs sersync]# /usr/local/sersync/sersync2 -dro /usr/local/sersync/confxml.xml
9)验证文件实时同步