mysql nfs存储_NFS存储服务及部署

本文介绍了NFS(网络文件系统)的基本概念、功能和价值,阐述了其在数据共享和存储服务中的作用。同时,讨论了NFS的优缺点,如配置简单但缺乏认证功能,并不适合高并发场景。文章详细讲解了NFS的工作原理,包括RPC服务的角色,以及NFS的部署步骤,如服务端和客户端的配置与挂载。此外,还分析了NFS的权限配置选项,如all_squash、no_all_squash、root_squash和no_root_squash,并通过实践展示了它们的使用。最后,文章列举了NFS服务在实际使用中可能遇到的问题及解决办法,包括挂载问题、服务启动顺序、防火墙设置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 NFS简介

1.1 什么是NFS

NFS=Network File System=网络文件系统。

主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。

NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

分布式文件系统:Moosefs(mfs)、GlusterFS、FastDFS(推荐)

NFS属于本地文件存储服务。

NFS主要用于存储web服务器上用户上传的数据信息,图片 附件 头像 视频 音频。

1.2 NFS存储服务价值

(1)可以实现数据统一共享存储

(2)节省架构服务运营成本

1.3 NFS存储服务的优缺点

优点:配置 安装简单

缺点:没有认证功能        分布式存储/ftp/samba

无法支持高并发存储  日PV 2000万

无法实现高可用      分布式存储/keepalived

1.4 实现Windows与linux文件数据共享

(1)FTP服务部署

(2)samba服务部署(可以让Windows与linux同时访问)

1.5 NFS网络文件共享系统由来

32a1e03f70c678b3ac4135f6f14899a3.png

可以实现数据共享,数据统一一致,节省架构服务运营成本

1.6 NFS网络文件系统工作方式(存储原理)

(1)在nfs服务端创建共享目录

(2)通过mount 网络挂载,将NFS服务端共享目录挂载到NFS客户端本地目录上。

(3)NFS客户端挂载目录上创建、删除、查看数据操作,等价于在服务端进行创建、删除、查看数据操作。

859bdd8df1304037ead1dae0bdf8c430.png

1.7 NFS存储文件系统中两个重要服务

1 RPC服务    2 NFS服务

1.7.1 RPC服务工作原理

4505ed846d724713032c2ecb4f74d337.png

928889eb0edff26867ee50c2226314b4.png

因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端□。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。

1.7.2 NFS工作流程

1b788bdbc8c4eca7d3354bc2134ca315.png

1.7.3 NFS详细访问流程

b75d4c444d44a4b57eb9767108be9978.png

当访问程序通过NFS客户端向NFS服务器存取文件时,其请求数据流程大致如下:

(1)首先用户访间网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询间请求.

(2)NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务。l

(3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据

(4)NFS客户端把数据存取成功后,返回给前端访间程序,告知用户存取结果,作为网站用户,就完成了一次存取操作。

2 NFS存储服务部署

RPC 远程过程调用程序。先启动PRC服务,然后在启动NFS。

2.1 服务端部署

2.1.1 安装软件程序

yum install -y nfs-utils rpcbind

rpm -qa nfs-utils

rpm -qa rpcbind

2.1.2 编写配置文件

vim /etc/exports#进入配置文件

/data 172.16.1.0/24(rw,sync)#写入命令

# /data 可以进行共享存储目录

# 172.16.1.0/24(rw,sync)允许存储数据网段信息(存储目录权限配置 存储数据方式配置)

sync=同步方式存储数据:用户有数据存储  ----  存储服务器(磁盘中)           存储安全性高

async=异步方式存储数据:用户有数据存储  ----  内存 --- 存储服务器(磁盘中)  存储效率高

2.1.3 创建目录,对目录进行授权

mkdir /data

chown nfsnobody.nfsnobody /data

2.1.4 启动服务程序

systemctl start rpcbind

systemctl reload rpcbind#重启rpcbind平滑重启

systemctl enable rpcbind

systemctl start nfs

systemctl reload nfs#重启nfs

systemctl enable nfs

###restart:将所有连接会话都会直接断开

###reload: 只会将没有数据传输链接断开,重新建立连接,让用户访问感受更好

2.2 客户端部署

2.2.1 安装相关软件

yum install -y nfs-utils

2.2.2 进行存储目录挂载

mount -t nfs 172.16.1.31:/data /mnt

2.2.3 进行测试

客户端创建文件:

[root@web01 mnt]#ls

[root@web01 mnt]#touch test.txt

[root@web01 mnt]#ls

test.txt

服务端同步文件:

[root@nfs01 data]#ls

[root@nfs01 data]#ls

test.txt

服务端与客户端文件同步,则测试成功。

3 存储服务配置文件编写格式

3.1 配置文件exports参数

ro只读配置,使存储目录权限位只读,使开发人员只能看

rw

读写权限

sync

同步存储数据

async

异步存储数据

all_squash

不论什么用户包括root,都映射为指定nfsnobody用户

no_all_squash

对普通用户不做映射,无权限。root用户映射为nfsnobody

root_squash

将root用户映射为指定nfsnobody用户,普通用户无权限

no_root_squash

将root用户不做映射,普通用户无权限

anonuid

指定uid,指定映射成什么用户

anongid

指定gid,指定映射成什么用户

在企业中,一般选用no_all_squash,root_squash。

3.1.1 all_squash映射实践

第一步:服务端修改服务配置文件

vim /etc/exports

/data 172.16.1.0/24(rw,sync,all_squash)

systemctl reload nfs

第二步:客户端上传数据测试

[root@web01 mnt]#touch test.txt

[root@web01 mnt]#ll test.txt

-rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 20:57 test.txt

3.1.2 no_all_squash映射实践

第一步:服务端修改服务配置文件

vim /etc/exports

/data 172.16.1.0/24(rw,sync,no_all_squash)

systemctl reload nfs

第二步:客户端上传数据测试

[root@web01 mnt]# touch aaa.txt

[root@web01 mnt]# ll

-rw-rw-r-- 1 1017 1017 0 Jul 16 12:08 aaa.txt

### 用户传输数据身份没有变化,看用户uid信息

3.1.3 root_squash映射实践

第一步:服务端修改服务配置文件

vim /etc/exports

/data 172.16.1.0/24(rw,sync,root_squash)

systemctl reload nfs

第二步:客户端上传数据测试

[root@web01 mnt]# touch bbb.txt

[root@web01 mnt]# ll

-rw-r--r-- 1 nfsnobody nfsnobody 0 Jul 16 12:19 bbb.txt

### root用户会映射为指定的nfsnobody用户

3.1.4 no_root_squash映射实践

第一步:服务端修改服务配置文件

vim /etc/exports

/data 172.16.1.0/24(rw,sync,no_root_squash)

systemctl reload nfs

第二步:客户端上传数据测试

[root@web01 mnt]# touch ccc.txt

[root@web01 mnt]# ll

-rw-r--r-- 1 root root 0 Jul 16 12:22 ccc.txt

###将root用户不做映射

3.2 NFS客户端映射原理图

9848b26b90bdeba679e9232bc4b4880c.png

3.2.1 映射原理练习题

要求服务端:

/data/w   可读可写权限,所有用户都做映射,  采用同步传输数据

/data/r   只能读取数据,只有root用户组映射,采用异步传输数据

要求客户端:

backup   /data/w  --挂载点 /data/w   可以存储数据

web01    /data/r  --挂载点 /data/r   不能存储数据

解决服务端:

(1)编写配置文件

vi /etc/exports

/data/w 172.16.1.0/24(rw,sync,all_squash)

/data/r 172.16.1.0/24(ro,async,root_squash)

(2)创建共享存储目录

web01:

mkdir /data/r

chown nfsnobody.nfsnobody /data/r

backup:

mkdir /data/w

chown nfsnobody.nfsnobody /data/w

(3)重启存储服务

systemctl reload nfs

解决客户端:

(1)创建挂载点目录

web01:mkdir /data/r

backup:mkdir /data/w

(2)进行挂载

web01

mount -t nfs 172.16.1.31:/data/r /data/r

backup

mount -t nfs 172.16.1.31:/data/w /data/w

(3)验证成功

[root@web01 r]#touch hh.txt

touch: cannot touch ‘hh.txt’: Read-only file system### 只读权限,所以出现这种情况才是正常

[root@backup w]#touch kk.txt### 读写权限,所以能创建

[root@backup w]#ls

kk.txt

3.3 影响NFS服务存储权限原因

(1)服务端配置文件参数    exports文件里ro/rw参数

(2)服务端本身目录权限

(3)服务端共享目录权限存在继承关系    例如:/data,/data/r

PS:建议设置共享目录时,不要存在父级与子级关系

(4)客户端挂载参数是否为 ro

4 NFS挂载常见问题

4.1 异常问题一

ls: cannot open directory .: Stale file handle  (文件句柄错误)

出现原因: 当父级和子级目录同时进行挂载时,一旦父级目录取消共享,但是客户端还是处于挂载状态

问题解决: 将和父级目录有关的所有挂载点全部卸载,重新挂载

4.2 异常问题二

Cannot register service: RPC: Unable to receive;

出现原因: 服务启动顺序不正确

问题解决: 关闭所有服务,按顺序进行启动

4.3 异常问题三

出现挂载卡死情况

clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)

出现原因: 服务端开启防火墙,阻止客户端访问

问题解决: 关闭防火墙

4.4 异常问题四

服务端采用restart情况,会有一个90s延迟;造成客户端挂载好共享目录,90s内无法存储数据

出现原因:

cat /etc/sysconfig/nfs|grep 90

#NFSD_V4_GRACE=90

#NFSD_V4_LEASE=90

4.5 NFS存储排错原理

4.5.1 检查服务端服务是否启动

4.5.2 检查NFS服务是否向RPC服务注册

未注册情况

[root@nfs01 ~]# rpcinfo -p localhost

program vers proto port service

100000 4 tcp 111 portmapper

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@nfs01 ~]# rpcinfo -p localhost

program vers proto port service

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

100005 1 udp 20048 mountd

100005 1 tcp 20048 mountd

100005 2 udp 20048 mountd

100005 2 tcp 20048 mountd

100005 3 udp 20048 mountd

100005 3 tcp 20048 mountd

100003 3 tcp 2049 nfs

100003 4 tcp 2049 nfs

100227 3 tcp 2049 nfs_acl

100003 3 udp 2049 nfs

100003 4 udp 2049 nfs

100227 3 udp 2049 nfs_acl

服务关闭在开启,有些端口会发生改变

100021 1 udp 60318 nlockmgr

100021 3 udp 60318 nlockmgr

100021 4 udp 60318 nlockmgr

100021 1 tcp 32828 nlockmgr

100021 3 tcp 32828 nlockmgr

100021 4 tcp 32828 nlockmgr

4.5.3 检查NFS服务是否存在共享目录

命令:showmount -e  172.16.1.31    NFS没有安装,不能使用showmount

[root@nfs01 data]#showmount -e 172.16.1.31

Export list for 172.16.1.31:

/data/r 172.16.1.0/24

/data/w 172.16.1.0/24

4.6 NFS服务相关重要文件命令

/etc/exports#配置文件

/var/lib/nfs/etab#记录nfs服务默认配置参数信息

rpcinfo -p 172.16.1.31#检查nfs是否向rpc注册

showmount -e 172.16.1.31#检查nfs服务是否存在共享目录

/usr/sbin/exportfs#可以平滑重启nfs服务,可以临时设置共享存储目录

平滑重启服务:exportfs -rv

临时创建目录:exportfs -o rw,sync 192.168.232.0/24:/data01

4.7 NFS服务客户端挂载

4.7.1 如何进行挂载

mount -t nfs 172.16.1.31:/data /mnt

4.7.2 如何开机挂载

方法一:vi /etc/rc.local

mount -t nfs 172.16.1.31:/data /mnt

方法二:vi /etc/fstab文件

172.16.1.31:/data /mnt nfs defaults 0 0

centos6

启动系统 -- 加载fstab -- 启动network网络服务 -- netfs(在系统启动完毕之后,再次加载fstab)

centos7

启动系统 -- 加载fstab -- 启动network网络服务 -- remote-fs.target(在系统启动完毕之后,再次加载fstab)

4.7.3 启动nfs服务客户端很慢

出现原因:在客户端上配置自动nfs服务挂载   --- 耦合度太高

解决问题:

(1)取消自动挂载

(2)启动顺序 先开启后端服务(nfs mysql backup 缓存服务)  在开启前端服务(web服务 负载均衡服务)

4.7.4 挂载参数说明

rw让挂载点目录具有可读可写权限   相反ro

suid=setuid

让挂载点目录中的文件特殊权限位生效    相反nosuid  安全

dev

让挂载点目录存储设备文件保持属性不变

exec

让挂载点目录中的执行文件可以执行   相反noexec

auto(mount -a)

让挂载点目录实现快速自动挂载  相反noauto

nouser

让普通用户是否可以卸载和挂载目录   相反user

async

数据异步存储概念,相反sync同步存储

noatime

访问文件时不更新文件的inode时间戳,高并发环境下,推荐显示应用该选项,可以提高系统I/O性能。性能优化

nodiratime

不更新文件系统上的directory inode时间戳,高并发环境,推荐显式应用该选项,可以提高系统I/O性能。性能优化

remount

在不进行卸载挂载点时,直接重新挂载修改挂载参数

文件系统只读:mount -o remount,rw / 解决

rsize=262144

设置一个缓存区 262144字节  设置大小和内存有关

用户 (读取) --- web01 /data  2M --- nfs /data 10M 压力大

wsize=262144

设置一个缓冲区 262144字节

用户(存储)  --- web01 /data 10M --- nfs /data 10M 压力大

hard

当服务端处于关闭状态,客户端会处于一直挂载

soft

当服务端处于关闭状态,不会一直挂载

proto=tcp

挂载协议

客户端重要文件:/proc/mounts  --- 查看到mount挂载命令默认参数信息

强行进行卸载:umount -lf

4 补充:下载软件出现异常

(1)更新yum源

(2)利用rpm安装软件 获得rpcbind软件包

vim /etc/yum.conf

cachedir=/var/cache/yum/$basearch/$releasever --- 下载软件保存路径

keepcache=1 --- 下载软件保留下来,不要被删除

rpm -ivh rpcbind-0.2.0-47.el7.x86_64.rpm.rpm---安装rpcbind

以下是在Kubernetes集群部署Superset并连接MySQL数据库,并将其挂载到NFS存储上的步骤: 1. 创建MySQL数据库 首先,我们需要创建MySQL数据库。可以使用以下命令: ``` kubectl run mysql --image=mysql:5.7 --env="MYSQL_ROOT_PASSWORD=password" --env="MYSQL_DATABASE=superset" --env="MYSQL_USER=superset" --env="MYSQL_PASSWORD=password" --port=3306 ``` 这将创建一个名为mysqlMySQL容器,并设置root密码为password,创建名为superset的数据库,并为其创建superset用户。 2. 创建NFS存储 接下来,我们需要创建NFS存储。这可以通过以下方式完成: - 安装NFS服务器并创建共享目录 - 部署NFS客户端并将其挂载到Kubernetes节点上 具体步骤取决于您的环境和需求。 3. 创建Superset部署文件 接下来,我们需要创建Superset的部署文件。以下是一个示例: ``` apiVersion: apps/v1 kind: Deployment metadata: name: superset labels: app: superset spec: replicas: 1 selector: matchLabels: app: superset template: metadata: labels: app: superset spec: containers: - name: superset image: amancevice/superset ports: - containerPort: 8088 env: - name: SUPERSET_CONFIG value: | SQLALCHEMY_DATABASE_URI = "mysql://superset:password@mysql:3306/superset" volumeMounts: - name: nfs-volume mountPath: /app/superset volumes: - name: nfs-volume nfs: server: nfs-server path: /nfs-share ``` 在这个示例中,我们使用了amancevice/superset镜像,并将其暴露在8088端口。我们还设置了SQLALCHEMY_DATABASE_URI环境变量以连接MySQL数据库。我们还定义了名为nfs-volume的NFS存储卷,并将其挂载到容器的/app/superset目录中。 4. 创建Service文件 最后,我们需要创建一个Service文件来暴露Superset服务。以下是一个示例: ``` apiVersion: v1 kind: Service metadata: name: superset labels: app: superset spec: selector: app: superset ports: - name: http port: 8088 targetPort: 8088 type: LoadBalancer ``` 在这个示例中,我们将Superset服务暴露在8088端口,并将其类型设置为LoadBalancer,以便可以从外部访问它。 5. 部署Superset 现在,我们可以使用以下命令部署Superset: ``` kubectl apply -f mysql.yaml kubectl apply -f superset.yaml kubectl apply -f superset-service.yaml ``` 这将在Kubernetes集群部署Superset,并连接到MySQL数据库,并将其挂载到NFS存储上。现在,您可以通过访问LoadBalancer的IP地址来访问Superset服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值