NFS – 文件服务器(共享存储)
定义
NFS是Network File System的缩写及网络文件系统。
NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS
为何使用 NFS
### NFS使用
1.实现多台服务器之间数据共享
2.实现多台服务器之间数据一致
###NFS应用
1.没有NFS时
1.A用户上传图片经过负载均衡,负载均衡将上传请求调度至WEB1服务器上。
2.B用户访问A用户上传的图片,此时B用户被负载均衡调度至WEB2上,因为WEB2上没有这张图片,所以B用户无法看到A用户传的图片。
如果有NFS
1.A用户上传图片无论被负载均衡调度至WEB1还是WEB2, 最终数据都被写入至共享存储
2.B用户访问A用户上传图片时,无论调度至WEB1还是WEB2,最终都会上共享存储访问对应的文件,这样就可以访问到资源了
vim /etc/exports -- #配置文件
/data 172.16.1.0/24(rw,sync,all_squash)
1.用户访问NFS客户端,将请求转化为函数
2.NFS通过TCP/IP连接服务端
3.NFS服务端接收请求,会先调用portmap进程进行端口映射 (111端口)
4.Rpc.nfsd进程用于判断NFS客户端能否连接服务端;
5.Rpc.mount进程用于判断客户端对服务端的操作权限
6.如果通过权限验证,可以对服务端进行操作,修改或读取
NFS服务
##1.使用NFS解决了什么
1.为了实现文件共享
2.为了多台服务器之间数据一致
NFS原理
NFS实践
环境准备
主机 IP 主机角色 安装软件 条件
web01 10.0.0.7 rsync客户端 NFS和rpcbind 关闭防火墙和selinux
nfs 10.0.0.3 rsync服务端 NFS和rpcbind 关闭防火墙和selinux
# 注:服务端安装 ( NFS和rpcbind)
[root@nfs ~]# yum install -y nfs-utils rpcbind
#注意:
Centos6 需要安装rpcbind
Centos7 默认已经安装好了rpcbind,并且默认是开机自启动
服务端配置NFS
#NFS默认的配置文件是
[root@nfs ~]# ll /etc/exports
-rw-r--r--. 1 root root 0 Jun 7 2013 /etc/exports
#配置NFS
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
语法 /data 172.16.1.0/24 (rw,sync,all_squash)
含义 NFS服务端共享的目录 NFS允许连接的客户端IP 允许操作的权限
服务端创建共享目录
[root@nfs ~]# mkdir /data
服务端启动服务
#Centos7启动
[root@nfs ~]# systemctl start rpcbind nfs
#Centos6启动,一定要先启动rpcbind在启动nfs
[root@nfs ~]# /etc/init.d/rpcbind start
[root@nfs ~]# /etc/init.d/nfs start
##或者
[root@nfs ~]# service rpcbind start
[root@nfs ~]# service nfs start
#验证启动
[root@nfs ~]# netstat -lntp | grep rpc
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5824/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 10187/rpc.mountd
tcp 0 0 0.0.0.0:49150 0.0.0.0:* LISTEN 10149/rpc.statd
tcp6 0 0 :::111 :::* LISTEN
服务端验证NFS配置
# 验证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=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
# 注:只有有一行内容就正确
客户端操作
1)关闭防火墙和selinux
2)安装服务
[root@web01 ~]# yum install -y rpcbind nfs-utils
挂载 – 临时挂载(mount )
#查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
#挂载
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup/
#验证挂载
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 18G 1.6G 17G 9% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 18G 1.6G 17G 9% /backup
挂载完测试
##写入数据进行测试
#第一次写入测试
[root@web01 ~]# cd /backup/
[root@web01 backup]# touch a.txt
touch: cannot touch ‘a.txt’: Permission denied #没有权限
服务端授权 --- 切记 默认用户 nfsnobody
#授权目录
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data/
###第二次写入测试 ---客户端操作 --切记
[root@web01 backup]# touch a.txt 或者 echo "123" >a.txt
[root@web01 backup]# touch ab.txt
[root@web01 backup]# ll
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 13:38 ab.txt
-rw-r--r-- 1 nfsnobody nfsnobody 4 Mar 27 13:34 a.txt
#服务端查看
[root@nfs ~]# ll /data/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Nov 20 09:26 123.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 13:38 ab.txt
客户端NFS挂载与卸载
NFS客户端的配置步骤也十分简单。先使用showmount命令,查询NFS服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址(权限)”。
NFS挂载:客户端的目录仅仅是服务端共享目录的一个入口,可以简单理解为软连接,真正的数据全都是存储在服务端的目录,客户端写入的数据也是在服务端存储的
#.注意事项
1.挂载目录后,原来文件下的内容不会丢失,仅仅是被遮盖住,取消挂载后仍然存在
2.取消挂载时不要在挂载的目录下面操作,否则会提示忙碌,切换到其他目录再进行卸载
3.挂载是如果在挂载的目录下,还是可以看到挂载前目录下的文件,需要重新进入目录才会显示挂载后目录的内容
客户端挂载与卸载–事项
# 客户端安装
1.rpcbind:
为了连接服务端的进程
2.nfs-utils
为了使用showmount命令
# 客户端查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
# 挂载命令
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup
mount #挂载命令
-t #指定挂载的文件类型
nfs #nfs文件类型
172.16.1.31 #服务端的IP地址
:/data #服务端提供的可挂载目录
/backup #本地要挂载到服务端的目录
#挂在后查看挂载
[root@web01 ~]# df -h | grep /backup
172.16.1.31:/data 18G 1.6G 17G 9% /backup
# 卸载
#卸载的两种方式
[root@web01 ~]# umount /backup
[root@web01 ~]# umount 172.16.1.31:/data
#强制取消挂载
[root@web01 ~]# umount -lf /backup
永久挂载
## 1.开机挂载
#编辑fstab文件
[root@web01 ~]# vim /etc/fstab
172.16.1.31:/data /backup nfs defaults 0 0
#验证fstab是否写正确
[root@web01 ~]# mount -a
了解后2个挂载
# 2.自动挂载
开机自动执行:/etc/rc.local
chmod +x /etc/ec.local
# 3.查询设备UUID
服务端NFS配置详解
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
#nfs共享参数 参数作用
rw 读写权限 (常用)
ro 只读权限 (不常用)
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 (不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 (不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 (常用)
no_all_squash 无论NFS客户端使用什么账户访问,都不进行压缩 (不常用)
sync 同时将数据写入到内存与硬盘中,保证不丢失数据 (常用)
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 (不常用)
anonuid 配置all_squash使用,指定NFS的用户UID,必须存在系统 (常用)
anongid 配置all_squash使用,指定NFS的用户UID,必须存在系统 (常用)
NFS案例
环境准备
主机 IP 主机角色 安装软件 条件
web01 10.0.0.7 rsync客户端 httpd 和php 关闭防火墙和selinux
web02 10.0.0.8 rsync客户端 httpd 和php 关闭防火墙和selinux
nfs 172.16.1.31 rsync服务端 - 关闭防火墙和selinux
#注意:web端安装http和php
客户端外网 -- 服务端内网
[root@web01 ~]# yum install -y httpd php
[root@web02 ~]# yum install -y httpd php
# 上传代码
[root@web01 ~]# rz (rz -E)
[root@web01 ~]# ll
-rw-r--r-- 1 root root 26995 Aug 23 10:35 kaoshi.zip
# 解压代码
#找到httpd服务的站点目录
[root@web01 ~]# rpm -ql httpd | grep html
/var/www/html
#解压代码至站点目录
[root@web01 ~]# unzip kaoshi.zip -d /var/www/html/
5.启动httpd
[root@web01 ~]# systemctl start httpd
#查看启动
[root@web01 ~]# netstat -lntp | grep 80
tcp6 0 0 :::80 :::* LISTEN 7530/httpd
[root@web01 ~]# ps -ef | grep httpd
root 7530 1 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 7531 7530 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 7532 7530 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 7533 7530 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 7534 7530 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 7535 7530 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 7543 7262 0 10:40 pts/0 00:00:00 grep --color=auto httpd
### 访问页面测试
http://10.0.0.7/ #---启动httpd systemctl start httpd
http://10.0.0.8/ #---启动httpd systemctl start httpd
#必须把文件放在两台客服端/var/www/html下
[root@web02 html]# ll
total 4
-rw-r--r-- 1 root root 890 Mar 27 15:18 a.sh
上传文件失败
#显示上传文件成功,但是服务器上没有文件
[root@web01 html]# ll /var/www/html/upload
ls: cannot access /var/www/html/upload: No such file or directory
#为什么找这个文件,因为代码里写的上传文件地址就是这个目录
#原因:代码不严谨,没有判断目录权限,目录权限不足,导致上传失败
#授权
[root@web01 html]# chown -R apache.apache /var/www/html/
#重新上传成功
测试(没有挂载)
在10.0.0.7服务器上传 1.png
在10.0.0.8服务器上传 2.png
#访问
http://10.10.0.7/png/1.png 访问成功
http://10.10.0.8/png/1.png 访问失败
http://10.10.0.8/png/2.png 访问成功
http://10.10.0.7/png/2.png 访问失败
#在没有挂载的情况下,文件无法实现共享,在哪台机器上传就只能在哪台机器访问
挂载
http://10.10.0.7/png/1.png 访问成功
http://10.10.0.8/png/1.png 访问失败
http://10.10.0.8/png/2.png 访问成功
http://10.10.0.7/png/2.png 访问失败# web端挂载目录
1.先同步多台web的文件
[root@web01 html]# rsync -avz png/ 172.16.1.31:/data
[root@web02 html]# rsync -avz png/ 172.16.1.31:/data
2.找到需要挂载的目录
/var/www/html/upload #根据apache属猪属组来生成,需网页上传一个图片文件来自动生成,即客户端访问的地址10.0.0.7或10.0.0.8 ~~考试文件上传的页面来进行上传,上传成功即可生成此目录
3.挂载
[root@web01 html]# mount -t nfs 172.16.1.31:/data /var/www/html/png
[root@web02 html]# mount -t nfs 172.16.1.31:/data /var/www/html/png
#再次访问测试(挂载后)
#访问
http://10.10.0.7/png/1.png 访问成功
http://10.10.0.8/png/1.png 访问成功
http://10.10.0.8/png/2.png 访问成功
http://10.10.0.7/png/2.png 访问成功8.
附精简版:NFS+Rsync+Inotify(四台虚拟机数据实时同步备份)
统一用户
工具/发送键输入到所有会话
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666
然后4台机器输入同样的内容
1.服务器创建统一用户
[root@web01 ~]# groupadd www -g 666
[root@web01 ~]# useradd www -u 666 -g 666
[root@web02 ~]# groupadd www -g 666
[root@web02 ~]# useradd www -u 666 -g 666
[root@nfs ~]# groupadd www -g 666
[root@nfs ~]# useradd www -u 666 -g 666
[root@backup ~]# groupadd www -g 666
[root@backup ~]# useradd www -u 666 -g 666
2.需要修改用户的服务
httpd
nfs
rsync
3.修改httpd的用户 web01 与web02都需要修改并重启httpd
#找到配置文件
[root@web01 ~]# rpm -qc httpd
/etc/httpd/conf/httpd.conf
#修改配置文件
[root@web01 ~]# vim /etc/httpd/conf/httpd.conf
### /apache搜索
User www
Group www
#重启服务
[root@web01 ~]# systemctl restart httpd
#确认启动用户
[root@web01 ~]# ps -ef | grep httpd
root 7768 1 1 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7769 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7770 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7771 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7772 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
www 7773 7768 0 11:49 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
4.修改nfs服务的用户 yum -y install inotify-tools(软件包)
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
#授权/data目录
[root@nfs ~]# chown -R www.www /data/
#重启服务
[root@nfs ~]# systemctl restart 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)
5.修改rsync用户
#修改配置
[root@backup ~]# vim /etc/rsyncd.conf
uid = www
gid = www
#重启服务
[root@backup ~]# systemctl restart rsyncd
#目录重新授权
[root@backup ~]# chown -R www.www /backup/
NFS小结
##.NFS存储优点
1.NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求
2.NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见
### .NFS存储缺点
1.存在单点故障, 如果构建高可用维护麻烦 web -> nfs -> backup
2.NFS数据明文, 并不对数据做任何校验
3.客户端挂载NFS服务没有密码验证, 安全性一般(内网使用)
### .NFS应用建议
1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力
2.必须将存储里的静态资源通过CDN缓存 jpg\png\mp4\avi\css\js
3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
作业
题目要求
题目:两台web服务器:web01和web02
一台nfs服务器挂载web服务器的文件目录
一台backup服务器实时同步nfs挂载目录下的内容
细部作业
1、web01与web02客户端操作
web01与web02各自执行:
关闭防火墙和selinux
[root@web01 ~] yum install -y nfs-utils rpcbind httpd php
[root@web01 ~] groupadd www -g 666 [root@web01 ~]# useradd www -u 666 -g 666
[root@web01 ~] systemctl start httpd #启动httpd服务
[root@web01 ~] netstat -lntp |grep 80 #查看服务端口号
tcp6 0 0 :::80 :::* LISTEN 1164/httpd
上传考试压缩包,并解压:
[root@web01 ~] unzip kaoshi.zip -d /var/www/html
[root@web01 ~] chown -R apache.apache /var/www/html#修改/var/www/heml属主属组为apache
在浏览器上传文件,会自动生成upload文件夹
[root@web01 html] chown -R www.www /var/www/html 修改/var/www/heml属主属组为www
[root@web01 html] mount -t nfs 172.16.1.31:/data /var/www/html/upload
#挂载,前提nfs服务端的共项目录也要修改权限为www
[root@web01 html] df -h 文件系统
容量 已用 可用 已用% 挂载点 /dev/sda3 18G 1.4G 17G 8% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 1014M 119M 896M 12% /boot tmpfs 98M 0 98M 0% /run/user/0 172.16.1.31:/data 18G 1.3G 17G 8% /var/www/html/upload
此时在浏览器在上传文件就实现了web02和web02的/var/www/html/upload内容和nfs/data同步
2、nfs服务端操作:
关闭防火墙和selinux
[root@nfs ~] yum install -y nfs-utils rpcbind httpd php
[root@nfs ~] vim /etc/exports /data #修改服务配置文件172.16.1.0/24(rw,sunc,all_squash,anonuid=666,anongid=666)
[root@nfs ~] groupadd www -g 666
[root@nfs ~] useradd www -u 666 -g 666 #创建用户www指定uid666,gid666:
[root@nfs ~] mkdir /data #创建共享目录
[root@nfs ~] systemctl restart rpcbind nfs 启动服务,验证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)
[root@nfs ~] chown -R www.www /data #修改/data属主属组
3、nfs作为客户端操作:
[root@nfs ~] yum install inotify-tools rsync -y
[root@nfs ~] vim rsync_inotify.sh #编写实时备份脚本
#!/bin/bash
export RSYNC_PASSWORD=123456 #指定密码环境变量
dir=/backup
/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::backup >/dev/null 2>&1
done &
[root@nfs ~] echo "123456" > /etc/rsync.passwd #写密码文件,修改600权限
[root@nfs ~] chmod 600 /etc/rsync.passwd #启动rsync服务,运行脚本
[root@nfs ~] systemctl start rsyncd
4、backup服务端操作:
[root@backup ~] yum install rsync -y
[root@backup ~] 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
#####################################
[backup]
comment = welcome to oldboyedu backup!
path = /backup
[root@backup ~] groupadd www -g 666
[root@backup ~] useradd www -u 666 -g 666 #创建用户
[root@backup ~] echo "123456" > /etc/rsync.passwd #写密码文件
[root@backup ~] chmod 600 /etc/rsync.passwd #修改权限600
[root@backup ~] mkdir /backup #创建/backup,修改权限www
[root@backup ~] chown -R www.www /backup
[root@backup ~] systemctl start rsyncd