03.NFS服务

NFS服务

1、什么是NFS

共享存储,文件服务器
共享网络文件存储服务器

基本概述

NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

2、为什么使用NFS

1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致

3.NFS原理

1.用户访问NFS客户端,将请求转化为函数
2.NFS通过TCP/IP连接服务端
3.NFS服务端接收请求,会先调用portmap进程进行端口映射
4.Rpc.nfsd进程用于判断NFS客户端能否连接服务端;
5.Rpc.mount进程用于判断客户端对服务端的操作权限
6.如果通过权限验证,可以对服务端进行操作,修改或读取

4、部署NFS服务

1.关闭防火墙和selinux

sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config 


systemctl stop firewalld
systemctl disable --now firewalld

2.安装nfs服务

yum install nfs-utils rpcbind -y  

rpcbind是为nfs提供网络

3.创建一个目录,用于存放文件的仓库

[root@nfs ~]# mkdir /data

4、创建一个系统用户,用于权限验证(权限验证时真正验证的时UID)

[root@nfs ~]# useradd www -r -M -s /sbin/nologin -u 996

5、修改NFS的配置文件(作用:指定NFS的仓库及权限)

NFS的配置文件:/etc/exports

[仓库地址] 可以访问的IP段

[root@nfs ~]# vi /etc/exports
/data   172.16.1.0/20(rw,all_squash,sync)
控制NFS读写权限
rw			读写权限 (常用)
ro			只读权限 (不常用)



控制访问NFS时,NFS基于的权限
root_squash		当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 (不常用)
no_root_squash	当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 (不常用)
all_squash		无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 (常用)
no_all_squash	无论NFS客户端使用什么账户访问,都不进行压缩 (不常用)



控制NFS同步方式
sync	同时将数据写入到内存与硬盘中,保证不丢失数据 (常用),但是会产生延时
async	优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 (不常用)



控制默认的用户(非必须)
anonuid	配置all_squash使用,指定NFS的用户UID,必须存在系统 (常用)
anongid	配置all_squash使用,指定NFS的用户UID,必须存在系统 (常用)

6.启动NFS服务

systemctl start nfs-server rpcbind

7、查看NFS的挂载点是否设置成功

# 查看指定服务器的挂载点
[root@nfs data]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/20



# 查看本机的挂载点
[root@nfs data]# showmount -e 
Export list for nfs:
/data 172.16.1.0/20

8、给服务端设置权限

[root@nfs data]# chown nfsnobody.nfsnobody /data/

9、挂载使用(客户端)

必须安装nfs-utils

[root@web01 ~]# yum install nfs-utils -y
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /opt

挂载不上:

1、selinux没关闭

2、防火墙没有关闭

3、nfs客户端未安装
[root@web01 ~]# yum install nfs-utils -y

没权限:

nfs服务端是root权限
[root@nfs data]# chown nfsnobody.nfsnobody /data/

5.上传案例

案例1

1、安装web服务软件

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

2、上传代码

[root@web01 html]# vi index.php
<?php
phpinfo();

3、开启web服务

[root@web01 html]# systemctl start httpd

案例2

将nfs中的图片,共享到web01上来访问

1、将图片上传至NFS服务器

2、将NFS挂载到web网站对应目录

mount -t nfs 172.16.1.31:/data /var/www/html/img/

3、上传代码

vim index.html 
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<img src="./img/123.png" alt="">
</body>
</html>

4、浏览器访问

案例3

1、安装web服务软件

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

2、上传代码

3、将代码复制到网站根目录(/var/www/html)

4、开启web服务

systemctl start httpd

5、统一用户

1.创建用户
useradd www -r -M -s /sbin/nologin -u 996
2、修改httpd的启动用户
[root@web02 ~]# vi /etc/httpd/conf/httpd.conf
User www
Group www
3、重启WEB服务软件
systemctl restart httpd
4、修改站点目录的用户
[root@web02 ~]# chown -R www.www /var/www/html
5.安装nfs服务
yum install nfs-utils -y 
6.挂载使用
mount -t nfs 172.16.1.31:/data /var/www/html/upload

NFS的故障切换

NFS实时同步到Rsync中

inotify + rsync 实现实时同步,但是无法使用守护进程方式运行

sersync = inotify + rsync + 守护进程

软件包路径

https://gitee.com/zhang-sanfeng-01/images/raw/master/img/sersync2.5.4_64bit_binary_stable_final.tar.gz

1、上传软件包

2、解压

[root@rsync ~]# tar -xf sersync2.5.4_64bit_binary_stable_final.tar.gz
[root@rsync ~]# mv GNU-Linux-x86 /usr/local/

3.配置文件

vim /usr/local/sersync/confxml.xml
[root@nfs ~]# confxml.xml confxml.bak                   #备份配置文件
[root@nfs ~]# vim /usr/local/sersync/confxml.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
    <host hostip="localhost" port="8008"></host>        #本机ip地址和端口
    <debug start="false"/>                            #是否打开调试模式
    <fileSystem xfs="false"/>                         #是否支持xfs文件系统
    <filter start="false">                            #是否过滤,是否排除名称中含有制定字符串的文件的同步
    <exclude expression="(.*)\.svn"></exclude>
    <exclude expression="(.*)\.gz"></exclude>
    <exclude expression="^info/*"></exclude>
    <exclude expression="^static/*"></exclude>
    </filter>
    <inotify>
        #inotify 监控的动作
        <delete start="true"/>                        #删除动作
        <createFolder start="true"/>                   #创建文件夹动作
        <createFile start="true"/>                    #创建文件动作
        <closeWrite start="true"/>                    #写入完成动作
        <moveFrom start="true"/>                      #移动来自动作
        <moveTo start="true"/>                        #移动到动作
        <attrib start="true"/>                        #属性被更改
        <modify start="true"/>                        #修改动作
    </inotify>
 
    <sersync>
        <localpath watch="/data">                       #监控的目录
            <remote ip="172.16.1.41" name="web_data"/>            #远端rsync服务器的地址和模块
        </localpath>
        <rsync>
            <commonParams params="-az"/>                #rsync的参数
            <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.passwd"/>
            #开启认证               #虚拟用户                   #指定虚拟用户的密码文件
            #如果远端rsync服务不是873端口,则开启并修改
            <userDefinedPort start="false" port="874"/><!-- port=874             #如果远端rsync服务不是873端口,则开启并修改
            <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分钟默认全备一次
        #定时任务,开启后,600分钟默认全备一次
        <crontab start="false" schedule="600"><!--600mins-->        #定时任务,开启后,600分钟默认全备一次
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>
  <plugin name="command">  #扩展插件功能的配置举例
    <param prefix="/bin/sh" suffix="" ignoreError="true"/>  <!--prefix /opt/tongbu/mmm.sh suffix-->
    <filter start="false">
        <include expression="(.*)\.php"/>
        <include expression="(.*)\.sh"/>
    </filter>
    </plugin>
 
    <plugin name="socket">      #扩展插件功能的配置举例
    <localpath watch="/opt/tongbu">
        <deshost ip="192.168.138.20" port="8009"/>
    </localpath>
    </plugin>
    <plugin name="refreshCDN">              #扩展插件功能的配置举例
    <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
        <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
        <sendurl base="http://pic.xoyo.com/cms"/>
        <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
    </localpath>
    </plugin>
</head>

4.开始实时同步(监控那一台服务器上目录就部署到那一台服务器上)

1、需要监控的目录/data

2、开启监控

[root@nfs GNU-Linux-x86]# /usr/local/GNU-Linux-x86/sersync2 -dro /usr/local/GNU-Linux-x86/confxml.xml

3.启动rsyncd服务

[root@rsync sersync]# systemctl start rsyncd

4、自动故障切换

1、判断是否故障
showmount -e 
2、切换
[root@web02 ~]# cat nfs-test.sh 
#!/bin/bash
showmount -e 172.16.1.31
if [ $? -ne 0 ];then
# umount /var/www/html/upload
mount -t nfs 172.16.1.41:/sersync /var/www/html/upload
fi
3、加入定时任务
posted @ 2021-11-03 20:07  OVO_3V3  阅读(228)  评论(0)    收藏  举报