[svc]NFS存储企业场景及nfs最佳实战探究
办公网络里人一般系统用共享,尤其是财务, 他们喜欢直接点开编辑. 而不喜欢ftp
nfs在网站架构中的用途
注: 如果pv量少,则放在一台机器上速度更快,如果几千万pv,则存储分布式部署.
网站架构中各个组件的角色理解
角色 | 比喻 |
---|---|
防火墙 | 保安 |
负载均衡 | 迎宾小姐 |
服务员 | nginx等 |
后厨 | nfs/mysql/memcache等 |
监控 | 大堂经理 |
nfs-server为何有2个服务? rpcbind(portmap)+nfs
1.先启动rpc,后启动nfs
2.nfs主动注册自己端口到nfs
3.客户端请求rpc,rpc告知客户端nfs的端口
4.客户端用nfs的端口去连nfs
安装部署
- 服务端配置(14.12)
yum install rpcbind nfs-utils -y
systemctl restart rpcbind
systemctl restart nfs
systemctl enable rpcbind
systemctl enable nfs
mkdir /data
echo "/data 192.168.14.0/24(rw,sync,no_root_squash)" >> /etc/exports
#注意: 这里一定要有ip限制,否则生产会有风险.
- 服务端内核优化
增大 接收 发送缓冲区的大小.
cat >> /etc/sysctl.conf<<EOF
net.core.wmem_default=8388608
net.core.rmem_default=8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
EOF
sysctl –p
- 客户度配置(14.11)
yum install rpcbind nfs-utils -y
systemctl start rpcbind
systemctl enable rpcbind
showmount -e 192.168.14.12
mount -t nfs 192.168.14.12:data /mnt
- 存档开机挂载
echo '/bin/mount -t nfs 192.168.14.12:data /mnt' >> /etc/rc.local
线上业务机nfs服务器想添加一个共享目录
- 添加目录
[root@n2 data]# cat /etc/exports
/data 192.168.14.0/24(rw,sync,no_root_squash)
/image 192.168.14.0/24(rw,sync,no_root_squash)
- 这里一定要注意: reload nfs即可
[root@n2 data]# systemctl reload nfs
- 客户端查看
[root@n1 mnt]# showmount -e 192.168.14.12
Export list for 192.168.14.12:
/image 192.168.14.0/24
/data 192.168.14.0/24
注: 这里有时候看不到,因为开了iptables, 手动挂一下试试
服务端状态查看
- 开启rpc后
[root@n2 ~]# systemctl start rpcbind
[root@n2 ~]# netstat -ntulp
...
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
...
udp 0 0 0.0.0.0:111 0.0.0.0:* 14643/rpcbind
udp 0 0 0.0.0.0:822 0.0.0.0:* 14643/rpcbind
- 开启nfs后
[root@n2 ~]# systemctl start nfs
[root@n2 ~]# netstat -ntulp
...
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
udp 0 0 127.0.0.1:1001 0.0.0.0:* 14815/rpc.statd
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
udp 0 0 0.0.0.0:20048 0.0.0.0:* 14848/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 14643/rpcbind
udp 0 0 0.0.0.0:58131 0.0.0.0:* -
udp 0 0 0.0.0.0:822 0.0.0.0:* 14643/rpcbind
udp 0 0 0.0.0.0:54613 0.0.0.0:* 14815/rpc.statd
- 查看nfs注册的端口+rpc自己监听的端口(房源)
[root@n2 ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper ## rpc默认端口号
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
- 查看挂载
[root@n1 mnt]# df -h
Filesystem Size Used Avail Use% Mounted on
...
192.168.14.12:/data 37G 1.5G 36G 4% /mnt
- 服务端查看挂载参数
mount -t nfs -o 参数 ip:/data /mnt
方法1:
mount命令 或 cat /proc/mounts
...
192.168.14.12:/data on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.14.11,local_lock=none,addr=192.168.14.12)
方法2: 服务端从文件查看
[root@n2 data]# cat /var/lib/nfs/etab
/image 192.168.14.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,no_root_squash,no_all_squash)
/data
nfs exports参数实践
参数 | 说明 |
---|---|
rw | 可读写的权限 |
ro | 只读的权限 |
no_root_squash | 登入NFS主机,使用该共享目录时相当于该目录的拥有者,如果是root的话,那么对于这个共享的目录来说,他就具有root的权限,这个参数『极不安全』 |
root_squash | 登入NFS主机,使用该共享目录时相当于该目录的拥有者。但是如果是以root身份使用这个共享目录的时候,那么这个使用者(root)的权限将被压缩成为匿名使用者,即通常他的UID与GID都会变成nobody那个身份 |
all_squash | 不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody |
anonuid | 可以自行设定这个UID的值,这个UID必需要存在于你的/etc/passwd当中 |
anongid | 同anonuid,但是变成groupID就是了 |
sync | 资料同步写入到内存与硬盘当中 |
async | 资料会先暂存于内存当中,而非直接写入硬盘 |
insecure | 允许从这台机器过来的非授权访问 |
nfs参数实践
(rw,sync) 读写+同步写盘
- 服务端创建/image
[root@n2 image]# mkdir /image
[root@n2 image]# cat /etc/exports
/image 192.168.14.0/24(rw,sync) #rw 读写; sync: 立即将数据刷入磁盘
- 服务端创建本地目录
[root@n2 image]# chown -R nfsnobody.nfsnobody /image/
[root@n2 image]# systemctl reload nfs
- 客户端创建挂载点/image,并挂载
[root@n1 mnt]# mkdir /image
[root@n1 mnt]# mount -t nfs 192.168.14.12:/image /image
- 客户端root touch是nfsnobody
[root@n1 image]# touch 1
[root@n1 image]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 16 15:55 1
- 客户端test touch是显示没权限
[root@n1 ~]# sudo su - test
Last login: Fri Mar 16 15:49:08 CST 2018 on pts/1
[test@n1 ~]$ cd /image/
[test@n1 image]$ touch 2
touch: cannot touch ‘2’: Permission denied
不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nfsnobody
(rw,sync,all_squash) 读写+同步写盘
[root@n2 data]# mkdir /data
[root@n2 data]# cat /etc/exports
/image 192.168.14.0/24(rw,sync,all_squash) #rw 读写; sync: 立即将数据刷入磁盘
[root@n2 data]# chown -R nfsnobody.nfsnobody /image/
[root@n2 data]# systemctl reload nfs
- 客户端创建/image,属主是root
[root@n1 mnt]# mkdir /image
[root@n1 ~]# ll -ld /image/
drwxr-xr-x 2 root root 6 Mar 16 15:30 /image/
- 客户端挂载: 发现/image的属主变成了nfsnobody
[root@n1 ~]# mount -t nfs 192.168.14.12:/image /image
[root@n1 ~]# ll -ld /image/
drwxr-xr-x 2 nfsnobody nfsnobody 24 Mar 16 15:50 /image/
- root创建文件: 属主是nfsnobody
[root@n1 image]# touch 1
[root@n1 image]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 16 15:50 1
- test用户创建文件: 属主是nfsnobody
[test@n1 image]$ touch 2
[test@n1 image]$ ll
total 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Mar 16 15:50 2
不论本地用户身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nfsnobody
no_all_squash,root_squash 参数实践
- root创建的额是nfsnobody
[root@n1 image]# touch 1
[root@n1 image]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 16 15:58 1
- test不允许创建
[test@n1 image]$ touch 2
touch: cannot touch ‘2’: Permission denied
no_all_squash: 是所有用户都不进行压缩,所以test用户对nfs的目录没有写入的权限(与nfs服务器的共享目录权限有关)。root用户进行压缩所以可以写入。
no_root_squash 参数实践(root用户不进行压缩映射)
- 服务端设置
[root@n2 ~]# ls -ld /data
drwxr-xr-x 2 root root 6 Mar 16 16:01 /data
[root@n2 ~]# cat /etc/exports
/data 192.168.14.0/24(rw,sync,no_root_squash)
- 客户端root可以创建
[root@n1 data]# touch 1
[root@n1 data]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 16 16:02 1
- 客户端test不允许创建
[test@n1 data]$ touch 2
touch: cannot touch ‘2’: Permission denied
由于对root用户没有进行压缩,所以到达nfs服务器后依旧是root身份,root用户默认对所有的文件都有权限,所以可以写入。(很危险)
nfs的核心-exports参数小结
一定要清楚,客户端是以哪个用户来操作挂载点(涉及到能否写的问题)
参数 | 说明 |
---|---|
root_squash,no_all_squash | 默认情况(服务端: cat /var/lib/nfs/etab) |
all_squash | 所有客户端都以nfsnobody身份操作挂载点 |
no_root_squash(no_all_squash默认) | 所有用户都以各自身份操作挂载点 |
all_squash,anonuid=3000,anongid=3000 | 所有用户都以id为3000的用户操作挂载点 |
nfs最佳实战
nfs最佳实战探究
- 服务端设置
[root@n2 ~]# mkdir /data
[root@n2 ~]# ls -ld /data
drwxr-xr-x 2 root root 6 Mar 16 16:13 /data
[root@n2 ~]# cat /etc/exports
/data 192.168.14.0/24(rw,sync)
[root@n2 ~]# systemctl reload nfs
- 客户端测试
[root@n1 ~]# mkdir /data
[root@n1 ~]# ls -ld /data
drwxr-xr-x 2 root root 6 Mar 16 16:15 /data
[root@n1 ~]# mount -t nfs 192.168.14.12:/data/ /data
[root@n1 ~]# ls -ld /data
drwxr-xr-x 2 root root 6 Mar 16 16:13 /data
- 客户端没权限写入. 为什么呢? 挂载后,查一下这个目录属于什么身份才可以写入
[root@n1 data]# touch 1
touch: cannot touch ‘1’: Permission denied
- 挂载后,查一下这个目录属于什么身份才可以写入
[root@n2 ~]# cat /var/lib/nfs/etab
/data 192.168.14.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,secure,root_squash,no_all_squash)
- 居然是nfsnobody
[root@n2 ~]# id 65534
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
- 服务端如何解决呢?
方法1: 权限搞大.任何人都可以写入
chmod 777 /data/
方法2: 权限约束为nfsnobody #鉴于这个用户系统都有,为了安全我们往往创建陌生的用户
chown -R nfsnobody.nfsnobody /data
最佳实战安全,客户端以nfsuser的身份操作nfs挂载点
- 服务端和客户端都创建用户
[root@n2 ~]# useradd -s /sbin/nologin -M -u 3000 nfsuser
- 服务端配置
[root@n2 ~]# id nfsuser
uid=3000(nfsuser) gid=3000(nfsuser) groups=3000(nfsuser)
[root@n2 ~]# cat /etc/exports
/data 192.168.14.0/24(rw,all_squash,anonuid=3000,anongid=3000)
[root@n2 ~]# systemctl reload nfs
- 客户端重新挂载
[root@n1 ~]# mount -t nfs 192.168.14.12:/data/ /data
[root@n1 ~]# cd /data/
[root@n1 data]# touch 1
touch: cannot touch ‘1’: Read-only file system
- 服务端授权目录权限给nfsuser解决
[root@n2 ~]# chown nfsuser.nfsuser /data/
[root@n2 ~]# ls -ld /data/
drwxr-xr-x 2 nfsuser nfsuser 6 Mar 16 16:13 /data/
- 客户端重新挂载
[root@n1 ~]# cd /data/
[root@n1 data]# touch 1
[root@n1 data]# ll
total 0
-rw-r--r-- 1 nfsuser nfsuser 0 Mar 16 16:23 1
自此,没有nfsuser的用户就没办法访问了.确保了安全.
nfs报错处理
Linux NFS:could not open connection for tcp6
- 启动时候报错
[root@/etc ~]#/etc/init.d/nfs start
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS services: [ OK ]
Shutting down RPC idmapd: [ OK ]
Starting NFS services: [ OK ]
Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
[ OK ]
Starting NFS daemon: rpc.nfsd: address family inet6 not supported by protocol TCP
[ OK ]
Starting RPC idmapd: [ OK ]
- 解决:注释后重启
vim /etc/netconfig
#udp6 tpi_clts v inet6 udp - -
#tcp6 tpi_cots_ord v inet6 tcp - -
Stale file handle无法卸载
umount -lf /data #强制卸载
nfs客户端报错解决Stale file handle
[svc]NFS存储企业场景及nfs最佳实战探究的更多相关文章
- Storm流计算从入门到精通之技术篇(高并发策略、批处理事务、Trident精解、运维监控、企业场景)
1.Storm全面.系统.深入讲解,采用最新的稳定版本Storm 0.9.0.1 : 2.注重实践,对较抽象难懂的技术点如Grouping策略.并发度及线程安全.批处理事务.DRPC.Storm ...
- NFS存储服务部署
第1章 NFS介绍 1.1 NFS服务内容的概述 □ RPC服务知识概念介绍说明,以及RPC服务存在价值(必须理解掌握) □ NFS服务工作原理讲解(必须理解掌握) □ NFS共享文件系统使用原理讲解 ...
- 三.NFS存储服务
01. 课程回顾 备份服务概念介绍(rsync备份服务利用相应算法,实现增量数据同步) 备份服务工作方式说明: 1. 本地数据备份同步方式(类似cp命令) 2. 远程数据备份同步方式(类似scp命令) ...
- Linux NFS存储服务部署
什么是NFS 中文意思是网络文件系统,主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录 NFS属于本地文件存储服务 缺点1: 1 2 3 4 5 6 7 windows上无法使用 ...
- NFS存储服务及部署
1 NFS简介 1.1 什么是NFS NFS=Network File System=网络文件系统.主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用服 ...
- nfs 存储服务
今日内容: NFS 1.什么是nfs? network file system 网络文件系统 nfs共享存储 2.nfs能干什么? nfs 能为 不同主机系统之间 实现 文件的共享 3.为什么要使用n ...
- 烂泥:NFS存储与VSphere配合使用
本文首发于烂泥行天下. 公司服务器的虚拟化使用的是VM ESXi 5.0,为了更有效的利用服务器的硬盘空间.就把所有的镜像文件存放到另外一台linux服务器上,这样在使用vsphere安装虚拟机时可以 ...
- docker volume创建、备份、nfs存储
docker存储volume #环境 centos7.4 , Docker version 17.12.0-ce docker volume创建.备份.nfs存储 #docker volume 数据存 ...
- NFS存储服务
NFS存储服务笔记======================================================================NFS共享存储是什么: 英文名-Netwo ...
随机推荐
- .NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Ruby/Shell/Agile/CSS/HTML/HTTP/Unix/Linux大量PDF书籍/电子书籍下载, Effective Java 下载
223本电子书籍,囊括了.NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Shell/A ...
- 【麦子学院】Linux cmd命令大全
pwd :print working directory. 打印工作文件夹即当前文件夹. cd :change directory.切换文件夹. /是linux的根文件夹.eg. cd/home ls ...
- python之获取微信access_token
# -*- coding: cp936 -*- #python 27 #xiaodeng #获取微信access_token #办法一:将该url直接填写到浏览器地址中可以获得access_token ...
- WIN10-修改网卡MAC
在注册表位置: 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002 ...
- Redis-Redi事务注意事项
当客户端处于非事务状态下时, 所有发送给服务器端的命令都会立即被服务器执行.但是, 当客户端进入事务状态之后, 服务器在收到来自客户端的命令时, 不会立即执行命令, 而是将这些命令全部放进一个事务队列 ...
- open()系统调用的实现
open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode.在内核中,sys_open实际调用do_sy ...
- SQL之group by
转自:理解group by 先来看下表1,表名为test: 表1 执行如下SQL语句: 1 2 SELECT name FROM test GROUP BY name 你应该很容易知道运行的结果,没错 ...
- 观文章《Linux系统管理员修炼三层次》有感
层次,都不陌生,通俗讲,就是和档次挂钩的,初入江湖时,都想自己几年后,武艺精深,深藏百技,忙时带领团队打BOSS,闲时喝酒论道,博古纵今,想想都令人精神满满,干劲十足!!! 至今已入江湖几载,回首来 ...
- Spring使用内存数据库二
在上篇<Spring 使用内存数据库>中我们使用Hibernate作为ORM的框架,直接调用Hibernate的API进行相关的持久化操作,但在实际项目中,可能会由于公司规定等原因要求统一 ...
- 用STS和Maven的方式创建一个JavaWeb项目
一.创建项目 1.Eclipse中用Maven创建项目,选maven-archetype-webapp,如下图: 创建好项目后,目录如下: 至此,项目已经创建完毕,下边是配置.关键所在!!! 二.项目 ...