分布式文件系统-NFS

NFS

1. NFS工作原理

Linux中的网络文件系统NFS (Network File System)是一种分布式文件系统协议,它允许用户在网络上远程访问和操作文件,就好像这些文件存储在本地计算机上一样。NFS最初由Sun Microsystems在1980年代开发,现在已成为UNIX和Linux操作系统中普遍支持的标准组件。以下是NFS工作原理的基本概述:

1. NFS架构

NFS遵循客户端-服务器模型,其中:

  • 服务器:存储实际文件的系统,并通过NFS服务向网络上的其他计算机提供这些文件的访问权限。
  • 客户端:想要访问服务器上文件的系统。客户端通过网络使用NFS协议将远程文件系统挂载为本地文件系统,从而实现对文件的操作。

2. NFS协议

NFS使用远程过程调用(RPC)来通信。RPC允许程序调用另一台计算机上的程序,就像调用本地程序一样。NFS主要使用两个RPC程序:一个用于挂载请求,另一个用于实际的文件系统操作(如打开、读取、写入、关闭文件等)。

3. 工作流程

  1. 启动NFS服务:首先,NFS服务器需要配置并启动NFS服务,包括设置哪些文件系统可以被NFS客户端访问,以及定义访问控制(如哪些客户端有权访问,可执行的操作等)。

  2. 挂载过程:NFS客户端通过向NFS服务器发送挂载请求来开始通信。如果客户端被授权访问,服务器响应此请求并允许客户端将服务器上的文件系统挂载为本地文件系统。

  3. 文件操作:一旦挂载成功,客户端上的应用程序和用户就可以像操作本地文件一样操作远程文件。所有操作请求(如读取、写入文件)都通过NFS协议发送给服务器,由服务器执行实际操作后返回结果。

4. NFS版本

NFS有几个版本,包括NFSv2、NFSv3、NFSv4,每个版本都增加了新的特性和性能改进。NFSv4是最新的广泛采用版本,引入了如状态持久性、更强的安全性和改进的性能等新特性。

5. 安全性

NFS的早期版本(特别是NFSv2和NFSv3)在设计时没有将安全性作为重点,主要依赖网络安全和主机控制。NFSv4增加了更强的安全措施,如Kerberos认证和加密传输。

结论

NFS通过其简单的客户端-服务器模型和协议,有效地实现了分布式环境中的文件共享和访问。随着新版本的发布,NFS不断增强其特性和安全性,以满足现代网络环境的需求。

2. RPC工作原理

远程过程调用(RPC)是一种通信机制,允许一台计算机(客户端)请求另一台计算机(服务器)上的程序或服务执行一个过程(函数或方法),就如同该过程是在本地执行一样。RPC抽象了底层的通信细节,使开发人员能够专注于业务逻辑,而不是网络交互的复杂性。这种方式简化了不同计算机之间的功能调用,是分布式系统设计中的一个关键概念。以下是对RPC的进一步理解和组成部分的描述:

核心概念

  • 透明性:RPC的设计目的之一是让远程服务调用看起来尽可能像是本地调用。这种透明性意味着开发人员可以像调用本地函数那样调用远程函数,而不需要关心网络通信的复杂性。
  • 接口定义:在RPC系统中,服务提供方需要定义一个接口(通常是一组可远程调用的函数或方法),客户端根据这个接口进行编程,发起远程调用。这个接口定义了可以远程调用的方法、它们的参数和返回类型。

工作流程

  1. 客户端发起调用:当客户端需要执行远程过程时,它会在本地生成一个对该远程过程的调用。
  2. 请求序列化:客户端的RPC框架将调用请求(包括函数名、参数等)序列化成一种格式(例如,JSON、XML、二进制等),这样可以通过网络发送。
  3. 发送请求:序列化后的请求通过网络发送给服务器。
  4. 服务器处理请求:服务器接收到请求后,RPC框架反序列化请求,获取函数名和参数,然后像调用本地函数一样调用相应的过程。
  5. 返回结果:服务器执行完毕后,将结果序列化并发送回客户端。
  6. 客户端接收结果:客户端的RPC框架接收到结果,反序列化它,然后返回给调用者。

通信协议

RPC可以使用多种底层网络协议来传输数据,包括TCP/IP、UDP等。选择哪种协议取决于应用的需求,比如对性能、可靠性或数据完整性的不同要求。

应用和优势

RPC广泛用于构建分布式系统和微服务架构,因为它能够:

  • 简化开发:开发人员可以专注于业务逻辑,而不是底层的网络通信细节。
  • 提高抽象级别:通过使用高级的接口定义语言(IDL),可以在不同语言和平台之间进行通信,增强系统的互操作性。
  • 支持多种语言:RPC框架通常支持多种编程语言,使得不同语言编写的系统组件能够轻松通信。

RPC的这些特性使其成为现代软件架构中不可或缺的技术之一,尤其是在微服务架构的设计和实现中。

3. 注册中心

注册中心是分布式系统和微服务架构中的一个重要组成部分。注册中心在RPC系统中扮演着至关重要的角色,特别是在服务发现和服务治理方面。下面我会详细解释注册中心的作用和它如何与RPC结合使用。

注册中心的作用

在分布式系统或微服务架构中,注册中心负责存储服务的地址和元数据信息。它主要有以下几个作用:

  1. 服务注册:服务启动时,会将自己的网络地址(如IP和端口)以及提供的功能(服务)的相关信息注册到注册中心。这个过程称为服务注册。
  2. 服务发现:客户端在需要调用某个服务时,会向注册中心查询该服务的网络地址,然后直接与服务进行通信。这个过程称为服务发现。
  3. 负载均衡:注册中心可能会存储多个实例的地址信息,客户端可以根据某种策略(如轮询、随机等)从中选择一个进行调用,从而实现负载均衡。
  4. 健康检查:注册中心通常会周期性地检查服务实例的健康状态,不健康的实例会被暂时移除或标记,以确保系统的稳定性。

注册中心与RPC的结合

在RPC系统中,注册中心的使用解决了服务位置的硬编码问题,提高了系统的灵活性和可维护性。与RPC结合使用时,流程通常如下:

  1. 服务提供者(服务器)启动时,向注册中心注册自己提供的服务接口和地址信息。
  2. 服务消费者(客户端)在需要调用远程服务时,首先从注册中心查询该服务的地址。
  3. 注册中心返回服务地址信息给客户端,客户端根据这些信息,使用RPC机制调用远程服务。
  4. 客户端可以实现负载均衡,从注册中心获取的多个服务实例中选择一个进行调用。
  5. 服务提供者定期向注册中心发送心跳,以证明自己是活跃的。注册中心也可以通过健康检查机制监控服务实例的状态。

常见的注册中心

在实践中,有许多流行的注册中心解决方案,包括:

  • Eureka:Netflix开发的服务发现工具,是Spring Cloud体系中的一部分。
  • Consul:由HashiCorp开发,提供了服务发现、健康检查和键值存储等功能。
  • Zookeeper:Apache软件基金会的一个项目,常用于Kafka和Hadoop等分布式系统的协调服务。
  • Nacos:阿里巴巴开源的服务发现和配置管理工具,支持微服务架构。

注册中心不仅简化了服务之间的通信,还为服务的可扩展性、动态性和高可用性提供了基础设施支持。

4.安装配置NFS

# 安装nfs-utils包,nfs服务在centos7以前叫nfs,centos7以后叫nfs-server。并且在安装的过程会自动处理依赖关系,其中包括注册中心rpcbind
[root@Rocky9 ~]# yum install nfs-utils
Dependencies resolved.
============================================================================================================================================================================================
 Package                                          Architecture                             Version                                           Repository                                Size
============================================================================================================================================================================================
Installing:
 nfs-utils                                        x86_64                                   1:2.5.4-20.el9                                    baseos                                   425 k
Installing dependencies:
 gssproxy                                         x86_64                                   0.8.4-6.el9                                       baseos                                   108 k
 keyutils                                         x86_64                                   1.6.3-1.el9                                       baseos                                    72 k
 libev                                            x86_64                                   4.33-5.el9                                        baseos                                    52 k
 libnfsidmap                                      x86_64                                   1:2.5.4-20.el9                                    baseos                                    60 k
 libverto-libev                                   x86_64                                   0.3.2-3.el9                                       baseos                                    13 k
 rpcbind                                          x86_64                                   1.2.6-5.el9                                       baseos                                    56 k
 sssd-nfs-idmap                                   x86_64                                   2.9.1-4.el9_3.5                                   baseos                                    42 k

Transaction Summary
============================================================================================================================================================================================
Install  8 Packages

Total download size: 827 k
Installed size: 2.1 M
Is this ok [y/N]:


[root@Rocky9 ~]#systemctl enable --now nfs-server
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@Rocky9 ~]#systemctl status nfs-server
[root@Rocky9 data]# systemctl status nfs-server
● nfs-server.service - NFS server and services
     Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)
    Drop-In: /run/systemd/generator/nfs-server.service.d
             └─order-with-mounts.conf
     Active: active (exited) since Tue 2024-04-09 09:21:58 CST; 5h 41min ago
    Process: 831 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
    Process: 837 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
    Process: 1010 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
   Main PID: 1010 (code=exited, status=0/SUCCESS)
        CPU: 34ms

Apr 09 09:21:57 Rocky9.3 systemd[1]: Starting NFS server and services...
Apr 09 09:21:58 Rocky9.3 systemd[1]: Finished NFS server and services.
[root@Rocky9 data]#

配置文件

vi /etc/exports
vi /etc/exports.d/*.exports

基本格式:

共享目录 客户端(选项1, 选项2, ...)
  1. 共享目录: 这是您想要共享的本地文件系统路径。

  2. 客户端

    • 可以是单个客户端的 IP 地址或主机名。

    • 也可以是一个 IP 网段(例如:192.168.1.0/24)。

    • 使用 * 表示允许所有客户端访问。

    • 使用 @group 表示允许属于某个 NIS 组的所有客户端访问。

  3. 选项

    • rw: 允许读写访问(如果没有指定 rwro,默认是 ro)。
    • ro: 只读访问。
    • sync: 同步写操作,保证数据一致性。
    • async: 异步写操作,提高性能但可能牺牲数据一致性。
    • no_root_squash: 默认情况下,来自客户端的root用户会被映射到匿名用户(通常是nobody),这个选项禁用这种行为。
    • root_squash: 启用root用户映射到匿名用户,这是默认行为。
    • all_squash: 将所有远程用户映射到匿名用户。
    • no_subtree_check: 如果共享的不是整个文件系统,NFS会进行子树检查。这个选项禁用子树检查,可能提高性能但增加风险。
    • subtree_check: 启用子树检查,这是默认行为。
    • secure: 使用1024以下的TCP/IP端口进行通信,这是默认行为。
    • insecure: 允许使用1024以上的端口,某些客户端可能需要这个选项。
    • anonuidanongid: 指定匿名用户的UID和GID,通常与 all_squash 一起使用。

示例:

vim /etc/exports
/data/nfsdir1 *(rw,no_root_squash,all_squash,anonuid=88,anongid=88)

#或者
[root@Rocky9 data]# vim /etc/exports.d/test.exports
/data/nfsdir2 *(rw)
[root@Rocky9 data]# exportfs -r
[root@Rocky9 data]# exportfs -v
/data/nfsdir1   10.0.0.107(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/data/nfsdir1   <world>(sync,wdelay,hide,no_subtree_check,anonuid=88,anongid=88,sec=sys,ro,secure,no_root_squash,all_squash)
/data/nfsdir2   <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@Rocky9 data]#

#查看
[root@ubuntu2204 nfs]#showmount -e 10.0.0.137
Export list for 10.0.0.137:
/data/nfsdir2 *
/data/nfsdir1 (everyone)

修改完以后,生效:

[root@Rocky9 data]# exportfs -r
[root@Rocky9 data]#
[root@Rocky9 data]# exportfs -v
/data/nfsdir1   <world>(sync,wdelay,hide,no_subtree_check,anonuid=88,anongid=88,sec=sys,rw,secure,no_root_squash,all_squash)

客户端挂载

#centos/rocky上面客户端安装
[root@Rocky9 ~]# yum -y install nfs-utils
#Ubuntu客户端安装不叫这个,是nfs-common
[root@Ubuntu22 ~]#apt install -y nfs-common
[root@Rocky9 ~]# showmount -e 10.0.0.137
Export list for 10.0.0.137:
/data/nfsdir1 (everyone)
[root@Rocky9 ~]#
#临时挂载
[root@Rocky9 ~]# mount 10.0.0.137:/data/nfsdir1 /mnt/nfs 
#永久挂载
[root@Rocky9 ~]# vim /etc/fstab
10.0.0.137:/data/nfsdir1 /mnt/nfs               nfs     _netdev         0 0
[root@Rocky9 ~]# mount -a
mount: (hint) your fstab has been modified, but systemd still uses
       the old version; use 'systemctl daemon-reload' to reload.
#如果出现上面提示,执行下面命令即可
[root@Rocky9 ~]# systemctl daemon-reload
# _netdev:没有网络的时候不挂载
  • 15
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XingYuyu_Coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值