另一个安全措施是,当 Master 通知客户端哪个块服务器持有这个块的租约时 , 或者在进行克隆操作期间它通知一个块服务器从另一个块服务器上读取数据时,请求中包含块版本号 。客户端或块服务器在执行操作时会验证这个版本号,以保证总是可访问的最新的数据 。
5. 容错和诊断在设计系统时,最大的挑战之一就是如何处理频繁的组件故障 。组件的数量和质量让这些问题变得非常普遍 。我们不能完全的信任机器,也不能完全的信任磁盘 。组件故障可能会造成系统不可用,甚至损坏数据 。我们将讨论如何面对这些挑战,以及当组件不可用时系统内部用于诊断问题的工具 。
5.1 高可用性在 GFS 集群的数百台服务器中,必定有一些机器在给定的一段时间内是不可用的 。我们通过两个简单但有效的策略来保证整个系统的高可用性:快速恢复和复制 。
5.1.1 快速恢复Master 和块服务器都被设计为无论如何终止,它们都能够在几秒内恢复自己的状态并重新启动 。实际上,我们并不区分正常的和不正常的终止;可以通过 kill 掉进程来关闭服务 。由于它们的请求超时而没有完成 , 客户端或其他服务器可能经历小的颠簸 , 但它们会重新连接服务器并重试 。6.2.2 节记录了实际实验中观察得到的重启时间 。
5.1.2 块复制如之前讨论过的,每个块被复制到不同机架上的多个块服务器上 。用户能够为文件命名空间的不同部分指定不同的复制级别,默认有三个 。当有块服务器掉线或通过校验和(5.2节)检测出损坏的副本时,Master 克隆已存在的副本来保证每个块有足够的副本 。
尽管复制策略非常有效,但我们也在探索其他的跨服务器的冗余解决方案,如奇偶校验,或者纠删码(erasure code),来应对我们日益增长的只读存储需求 。在我们高度低耦合的系统中,这些复杂的冗余方案是具有挑战的,但并不是不可实现的,因为我们的操作主要是追加和读取,而不是小规模的随机写 。
5.1.3 Master复制为了可靠性,Master 的状态也被复制 。它的操作日志和检查点被复制到多个机器上 。一个修改操作只有在它的日志被刷新到本地磁盘和所有的 Master 副本后才认为被提交完成 。简单的说 , 一个Master 负责所有的操作,包括后台的行为,如垃圾回收等改变系统内部状态的行为 。当它失效时,能够瞬间重启 。如果它的机器或磁盘发送故障,GFS 的外部监控会在其它有副本操作日志的机器上启动一个新的 Master 。客户端视角下只使用主节点的名字(如,gfs-test),它是一个 DNS 的别名,可以更改这个名字来访问被重新放置到其它机器上的 Master 。
此外,当 Primary Master 宕机时,“影子”Master可以为文件系统提供一个只读的访问接口 。它们是影子,而不是镜像 , 它们内部的数据会稍微的落后于 Primary Master,通常不到1秒 。因此,它们对于那些不经常修改的文件的读取 , 或是不太在意得到的是稍微过期的数据的应用来说是有效的 。实际中,因为文件内容是从块服务器读取的,所以应用察觉不到过期的文件内容 。在短暂的时间窗口内,过期的可能是文件的元数据,如目录内容,或访问控制信息 。
为了保持最新的状态,影子 Master 读取一个正在增长的操作日志副本 , 并执行与 Primary Master相同的操作序列来改变自己的数据结构 。像 Primary 那样,它在启动后轮询块服务器(之后很少)来定位块副本,并通过频繁的交换握手信息来监控它们的状态 。当 Primary Master 决定创建或删除副本造成位置信息更新时,影子 Master 才会通过 Primary Master 更新状态 。
5.2 数据完整性每个块服务器使用校验和来探测存储的数据是否被损坏 。考虑到一个 GFS 集群经常由数百个机器上的数千块磁盘组成 , 由于磁盘的损坏而造成的读和写路径上的数据损坏或丢失是很常见的 。(其中的一个原因见7.1节)我们能够使用块的其它副本来进行恢复,但是无法通过不同块服务器上的副本的比较来探测出数据块是否损坏 。此外,不同的副本之前有分歧可能是合理的:GFS 修改操作的语法,特别是之前讨论过的原子追加操作,本身就不能保证所有副本都相同 。因此,每个块服务器必须独立的通过校验和验证它所拥有的拷贝是否合法 。
推荐阅读
- JAVA的File对象
- Codeforces 1670 E. Hemose on the Tree
- 二 沁恒CH32V003: Ubuntu20.04 MRS和Makefile开发环境配置
- 驱动开发:内核监控FileObject文件回调
- 齐博X1-栏目的调用2
- Blazor组件自做十一 : File System Access 文件系统访问 组件
- How to get the return value of the setTimeout inner function in js All In One
- System.IO.FileSystemWatcher的坑
- Docker | dockerfile构建centos镜像,以及CMD和ENTRYPOINT的区别
- prometheus监控实战