NFS
-
什么是NFS?
共享存储,⽂件服务器 -
NFS基本概述
NFS是Network File System的缩写,中文意思是网络文件共享系统
它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录存储服务的种类,只支持Linux与Linux之间数据传输。
NFS存储的优点与缺点
- 优点:
- NFS⽂件系统简单易⽤、⽅便部署、数据可靠、服务稳定、满⾜中⼩企业需求。
- NFS⽂件系统内存放的数据都在⽂件系统之上,所有数据都是能看得⻅。
- 缺点:
- 存在单点故障
- NFS数据是明⽂, 并不对数据做任何校验。
- 客户端挂载NFS服务没有密码验证, 安全性⼀般(内⽹使⽤)
常见的数据存储方式
- 网络存储:glusterfs、
ceph
、OSS - 分布式:将多台机器,组成像一台机器一样使用
分布式存储原理图
- 微服务:将一台机器,拆分成多台机器使用
NFS的作用
- 如果没有NFS会有什么影响?
- 存储服务器的作用
NFS工作流程图
RPC服务的作用
- 没有RPC服务会有什么影响?
- NFS服务启动会有产生多个进程,客户端访问服务端的时,不知道该访问哪一个进程
- NFS服务启动产生的进程,端口号是随机分配的,服务端一旦重启服务,那么客户端需要重新建立连接请求
- RPC服务的主要作用
- 会把客户端存储的请求,由RPC发送给相应的进程,最终实现数据的存储
nginx页面编辑
- 下载nginx
1. 准备两台机器
web1 192.168.15.7
web2 192.168.15.8
2. 两台机器分别添加nginx.repo网址: http://nginx.org/en/linux_packages.html#RHEL-CentOS
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
yum clean all 清空yum缓存
yum makecache 重新生成yum缓存
yum -y install nginx 下载nginx
systemctl start nginx 启动nginx服务
- 编辑nginx网页页面内容
cd /usr/share/nginx/html/ nginx网页页面显示指定的目录文件位置/usr/share/nginx/html/index.html
echo 111 > index.html
我们在网页输入web01的网址192.168.15.7,页面是可以显示我们输入的内容111的。
我们只有再次对web02服务器操作命令:echo 111 > /usr/share/nginx/html/index.html才可以实现两台服务器的数据同步。
NFS共享存储
- NFS服务端配置
1、关闭防火墙
systemctl disable --now firewalld
2、关闭seLinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
setenforce 0
3、安装nfs
yum install -y nfs-utils rpcbind
4、修改配置文件
vim /etc/exports
/mnt/data 172.16.1.0/16(rw,sync,all_squash)
# nfs存储目录 监听的IP(读写权限,内存数据同步到硬盘,压缩权限)
mkdir /mnt/data 创建共享目录
chown nfsnobody:nfsnobody -R /mnt/ 修改共享目录的属主和属组
5、启动NFS
systemctl start nfs-server
6、查看
showmount -e
# Export list for nfs:
# /mnt/data 172.16.1.0/16
cat /var/lib/nfs/etab
# /mnt/data 172.16.1.0/16(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
- 客户端配置
1、关闭防火墙
systemctl disable --now firewalld
2、关闭seLinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
setenforce 0
3、安装nfs
yum install -y nfs-utils rpcbind
4、将服务端的存储目录挂载到客户端
mount -t nfs 172.16.1.31:/mnt/data /usr/share/nginx/html/ # 将服务端的存储目录挂载到nginx网页编辑指定的目录下
5、查看服务端存储目录是否挂载成功
df -h
# 172.16.1.31:/mnt/data 19G 2.2G 17G 12% /usr/share/nginx/html
- 修改NFS权限,实现web01,web02数据同步
1. 验证
echo 111 > /mnt/data/index.html
我们在web01,web02里面都按照客户端的配置进行操作。
在浏览器中输入web01的IP和web02的IP地址,发现网站页面的内容都是NFS服务端存储目录(/mnt/data/index.html)的内容111。
但是我们对web01和web02的挂载点目录文件(/usr/share/nginx/html/index.html)进行编辑,发现是没有权限的。
这个时候,只有NFS的root用户对于共享目录有读写权限,我们需要修改NFS服务端共享目录的权限,使客户端也可以对共享目录进行编辑。
2. 修改NFS服务端存储目录权限
cat /var/lib/nfs/etab 查看NFS软件默认创建的用户anonuid=65534,anongid=65534
# /mnt/data 172.16.1.0/16(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
grep 65534 /etc/passwd 查看用户uid,gid所对应的用户名
# nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
chown nfsnobody:nfsnobody -R /mnt/data/ 将存储目录的属组属主修改成NFS软件默认创建的用户
systemctl restart nfs-server rpcbind 重启NFS和RPC
3. 对web01,web02文件内容进行修改,验证NFS可实现的数据同步,数据共享
在web01进行操作:
重新挂载:
umount /usr/share/nginx/html
mount -t nfs 172.16.1.31:/mnt/data /usr/share/nginx/html/
cd /usr/share/nginx/html/
echo lala biubiubiu > index.html
我们发现NFS服务器共享目录里面的数据实现了同步,web01和web02的数据也是可以实现同步的,
打开浏览器进行验证,我们发现输入web01和web02的IP后,页面显示的内容也是可以同步的。
NFS配置参数
- 常用的选项
rw:共享的⽬录权限为可读写
sync:数据写⼊内存时,同时将数据保存到磁盘(保证数据不会丢失)
all_squash:⽆论使⽤什么⽤户,都压缩权限,压缩成指定的⽤户
anonuid:指定的⽤户的uid
anongid:指定的⽤户的gid
- 不常用的选项
ro:⽂件权限为只读
async:先把数据保存到内存,再写⼊磁盘(效率高,但是可能会造成数据丢失)
no_all_squash:⽆论使⽤什么⽤户,都不压缩权限
root_squash:客户端使⽤root访问时,压缩权限
no_root_squash:客户端使⽤root访问时,不压缩权限
- 创建NFS服务端和WEB客户端的统一用户
1. NFS服务端
useradd www 创建新用户
tail -1 /etc/passwd 查看新创建用户的uid,gid
# www:x:1000:1000::/home/www:/bin/bash
vim /etc/exports 修改NFS服务端配置文件
/mnt/data 172.16.1.0/16(rw,sync,all_squash,anonuid=1000,anongid=1000)
systemctl restart nfs-server rpcbind 重启nfs,rpc服务
cat /var/lib/nfs/etab 查看nfs服务的基本信息
# /mnt/data 172.16.1.0/16(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
chown www:www -R /mnt/data 修改共享目录的属组和属主
cd /mnt/data/
ll 查看nfs目录文件的属组和属主
# total 4
# -rw-r--r-- 1 www www 15 Apr 22 15:55 index.html
2. web客户端
重新挂载:
umount /usr/share/nginx/html
mount -t nfs 172.16.1.31:/mnt/data /usr/share/nginx/html/
cd /usr/share/nginx/html/ 切换到挂载目录
ll 查看挂载目录下的属组和属主
# total 0
# drwxr-xr-x 2 1000 1000 24 Apr 22 15:42 html
useradd www -u1000 创建uid,gid为1000的用户
tail -1 /etc/passwd
# www:x:1000:1000::/home/www:/bin/bash
这个时候我们对于NFS共享目录的权限做了控制,客户端只有www用户才可以对NFS共享目录进行编辑
设置开机自动挂载
- 将挂载点写入开机自启脚本文件
方式1:
vim /etc/rc.local 局限性:挂载之后无法测定
mount -t nfs 172.16.1.31:/mnt/data /usr/share/nginx/html
方式2:
vim /etc/fstab 挂载之后可以测试挂载命令是否书写错误
172.16.1.31:/mnt/data /usr/share/nginx/html nfs defaults 0 0
mount -a 测试挂载是否成功
案例
案例需求:
- web服务器访问的页面能够实时的备份到backup服务器
- web服务器的数据是要共享
-
需求分析:
- web01服务器、web02服务器搭建nginx
- backup服务器,搭建rsync服务端
- web01服务器搭建rsync客户端
- web01服务器搭建inotify服务,实现实时监控功能
- nfs服务器搭建NFS,做数据共享存储
- web01服务器、web02服务器挂载使用NFS服务指定的共享目录
-
做数据监控脚本
vim inotify.sh
#!/bin/bash
RSYNC="rsync -az --delete /usr/share/nginx/html/ lala@192.168.15.41::nana"
export RSYNC_PASSWORD=123
/usr/bin/inotifywait -mrq --format '%Xe %w %f' -e create,modify,delete,attrib,close_write /usr/share/nginx/html/ | while read line; do $RSYNC ; done