• 操作系统学习笔记:分布式文件系统


    分布式文件系统是一个经典分时文件系统的分布式实现,该系统中有多个用户共享文件和存储资源。分布式文件系统的目的是为了支持当文件被物理分散在一个分布式系统中时与经典模型相同的共享。

    一、背景
    分布式文件系统(DFS)的客户机、服务器和存储设备都分散在分布式系统中的机器上。因此服务活动必须在网络上进行,系统有多个独立的存储设备。但对于客户机而言,DFS最好能表现得如同一个传统的集中式文件系统。

    衡量DFS最重要的性能指标是满足服务请求所需的时间。

    DFS的关键特征是管理一系列分散的存储设备。DFS管理的所有存储空间由不同的、远程的、小的存储空间组成。一个部件单元是能存储在单个机器上的最小文件集。

    二、命名和透明性
    1、命名结构
    命名是在逻辑对象和物理对象之间建立映射。比如,用文件名来关联文件。而在DFS中,命名有两个属性:
    位置透明性:文件名不揭示任何有关物理存储位置的线索
    位置独立性:文件的物理存储位置改变时,不需要改变文件名

    2、命名方案
    1)结合主机名和本地名
    2)NFS,将远程目录加到本地目录
    3)所有文件使用全局名字

    3、实现技术
    将文件集集中到部件单元,并在一个部件单元基础上提供映射。

    三、远程文件访问
    DFS中的远程服务方法和传统文件系统中的磁盘访问很类似,使用远程服务方法类似于对每个访问请求完成一次磁盘访问。

    1、基本的缓存设计
    如果数据尚未缓存,数据副本从服务器传到客户机,然后访问在缓存的副本上完成。采用某种替换策略来解决缓存大小限制。文件仍然用存储在服务器上的一个主副本来标识,而副本则分散到不同的缓存中。当一个副本被更改,需要反映到主副本上,以保持一致性。

    DFS中缓存的粒度可以从文件的若干块到整个文件。通常,对单个访问,缓存的数据多于所需,可以使较多的访问通过缓存来完成,类似磁盘先读。块的大小和整个缓存的大小对块缓存设计非常重要。增大存储单元就增加命中率,但也增加了失效代价。

    2、缓存位置
    数据缓存在哪里呢?内存还是磁盘?大部分是内存。

    3、缓存更新策略
    将更改的数据块写回服务器的主副本的策略,对系统的性能和可靠性具有关键影响。

    直写策略:一旦更改,即写到服务器上。可靠,但性能差。

    延迟写策略(回写缓存):更新写到缓存,稍后才被写回服务器。性能好,但数据有丢失的嫌疑。

    4、一致性
    客户机需要判断本地缓存副本与主副本是否一致,然后才能使用。验证方法:

    1)客户机发起一次性有效检查,与服务器联系,检查是否一致。频率可以是每次访问都检查,也可以是第一次访问进行检查(主要用于文件打开的情况)。

    2)服务器发起
    服务器记录每个客户机的缓存情况。当服务器检测到潜在的不一致性,就有所反应。比如,服务器将缓存记录置为失效。

    5、高速缓存和远程服务的比较
    缓存适合读取多于写入的情况。
    因此,缓存技术应在有本地磁盘或大主存的机器上实现。在无盘、小容量存储器的机器上的远程访问应通过远程服务方法进行。

    四、有状态服务和无状态服务

    有状态服务:服务器在其主存上保存了客户机的活动信息。

    无状态服务:每个请求都是独立的,服务器不需要在主存上维护客户机的活动信息。

    有状态的优点在于增强了性能,但消耗大,崩溃恢复机制复杂。

    而无状态服务性能较差,但受服务器故障和恢复影响很小,处理简单。

    五、文件复制
    在不同机器上的复制文件对提高有效性而言是有用的冗余。多机器复制也有益于提高性能:选择邻近的一个复制品来服务一个访问请求将使服务时间更短。

    复制设计的基本条件是同一文件的不同副本应驻留在彼此故障独立的机器上,即一个副本的有效性不受其余副本有效性的影响。

    副本的存在对高层是不可见的。而在低层,副本必须用不同的更低层名字区分开来。

    与复制相关的主要问题是更新。从用户角度看,对任何副本的更新应影响到所有其他的副本,也就是必须保持一致性。也可能在某些灾难性错误的情况下,为保证系统的继续运行而牺牲一致性。

  • 相关阅读:
    beego 注解路由无效问题分析
    sync.Map实现分析
    由浅入深聊聊Golang的sync.Map
    Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型
    golang 的 channel 实现 生产者/消费者 模型
    Golang sync.NewCond条件锁的用法
    golang channel多生产者和多消费者实例
    Go语言的那些坑
    go语言标准库sync/atomic中的原子操作
    理解 Go 标准库中的 atomic.Value 类型
  • 原文地址:https://www.cnblogs.com/leftfist/p/6808745.html
Copyright © 2020-2023  润新知