一个块被分割成 64KB 大小的 block,每个 block 都有一个对应的 32bit 校验和 。像其它元数据一样,校验和保存在内存中,并通过日志永久存储,与用户数据分开 。
对于读操作 , 在把数据返回给请求者之前,块服务器要验证读范围内所有数据 block 的校验和 , 因此,块服务器不会将损坏的数据传播到其它机器上 。如果一个 block 与记录的校验和不匹配 , 块服务器会返回给请求者一个错误,并向 Master 报告这个错误 。在响应中,请求者将从其它的副本读取数据,同时 , Master 将从其它副本上克隆这个块 。在一个新的可用的副本复制完毕后,Master 会通知报告错误的块服务器删除出错的副本 。
校验和对读操作几乎没有影响 , 原因有几个:
- 因为大多数的读操作至少需要读取几个块,我们只需要读取一小部分额外的数据用于验证验证和 。
- GFS 客户端代码通过试图将读操作对齐到校验和的 block 边界上,大大减小了验证的开销 。
- 此外,块服务器上的校验和查询和对比不需要任何 I/O 就能完成,校验和的计算可以和 I/O 操作同时进行 。
相反的,如果写操作覆盖块中已经存在的一部分,我们必须读取并验证要被覆盖的这个范围内的第一个和最后一个 block,然后执行写操作,最后计算并记录新的校验和 。如果我们在覆盖它们之前不进行这一对验证,新的校验和可能会隐藏没有被覆盖区域的错误 。
在空闲的时候,块服务器能浏览和验证不活跃的块 , 这允许我们探测很少被读取的块的数据损坏 。一旦损坏被探测到 , Master 就能创建一个新的没有损坏的副本 , 并删除已损坏的副本 。这能够防止不活跃的、已损坏的块欺骗 Master , 使 Master 认为它是块的一个可用的副本 。
5.3 诊断工具在问题隔离、调试和性能分析方面,详尽的、细节的诊断日志给我们很大的帮助 。如果没有日志 , 我们很难理解短暂的、不重复的机器间的消息交互 。GFS 服务器生成诊断日志用于记录许多关键的事件(如块服务器启动和关闭) , 以及所有的远程调用(RPC)的请求和响应 。这些诊断日志能够被自由的删除,不会给系统带来任何影响 。然而 , 在空间允许的情况下,我们会尽量保存这些日志 。
远程调用(RPC)日志包括网络上所有的请求和响应,除了文件数据被读取或写入 。通过匹配请求和响应,以及核对其它机器上的 RPC 记录,我们能重建这个交互历史用于诊断错误 。这些日志也能用于跟踪负载测试和性能分析 。
记录日志所造成的性能影响很?。ㄔ缎∮谒吹暮么Γ?因为这些日志异步的、顺序的被写入 。最近的事件也会保存在内存中,可用于持续的在线监控 。
6. 度量在这章中 , 我们介绍几个微基准测试来描述 GFS 架构和实现中固有的瓶颈,还有一些来自于 Google 正在使用的集群中 。
6.1 微基准测试我们在一个由1个主节点,2个主节点副本,16个块服务器和16个客户端组成的GFS系统上进行性能测试 。注意 , 这个配置是为了方便测试,一般的集群包含数百个块服务器和数百个客户端 。
所有的机器都配置为两个1.4GHz的PIII处理器,2GB的内存 , 两个5400rpm的80GB的磁盘,以及一个100Mpbs全双工以太网连接到一个HP2524的交换机上 。两个交换机之间只用1Gpbs的链路连接 。
6.1.1 读操作N个客户端同时从文件系统读取数据 。每个客户端从320GB的数据中,随机的选取4MB区间进行读取 。这个读操作会重复256次 , 使客户端最终读取到1GB的数据 。块服务器总共只有32GB的内存 , ,所以我们期望最多有10%的缓存命中率 。我们的结果应该与没有缓存的情况下相近 。

文章插图
图3:总吞吐量 。顶上的曲线显示了理论情况下的由我们的网络拓扑引入的限制 。下面的曲线显示了测试的吞吐量 。它们显示了置信区间为95%的误差,在一些情况下,由于测量的方差小而不太明显 。
推荐阅读
- 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监控实战