SIGOPS 2010 Paper 分布式元数据论文阅读笔记整理
问题
Facebook生产环境中,在大量基础设施(数千个组件)上运行的分布式存储系统可能面临各种故障,因此,软件系统需要以一种将故障视为规范而非例外的方式进行构建,如何在这种情况下保证可靠性和可扩展性,同时保证不牺牲读性能下保证高写入吞吐量。
背景
在生产环境中运行的存储系统的体系结构非常复杂,除了实际的数据持久性组件外,该系统还需要具有以下特性;负载平衡、成员身份和故障检测、故障恢复、副本同步、过载处理、状态转移、并发和作业调度、请求编组、请求路由、系统监控和报警、配置管理的可扩展和稳健的解决方案。
本文重点关注Cassandra中使用的核心分布式系统技术:分区、复制、成员身份、故障处理和扩展。所有这些模块同步工作以处理读/写请求。通常,对密钥的读/写请求会被路由到Cassandra集群中的任何节点,节点确定该密钥的副本。对于写入,系统将请求路由到副本,并等待仲裁的副本来确认写入的完成。对于读取,基于客户端所需的一致性保证,系统将请求路由到最近的副本,或者将请求路由至所有副本,并等待仲裁响应。
本文方法
提出Cassandra,一种分布式存储系统,用于管理分布在许多商品服务器上的大量结构化数据,提供无单点故障的高可用性服务。
-
管理持久状态,提高了依赖该服务的软件系统的可靠性和可扩展性。
-
不支持完整的关系数据模型,为客户端提供了一个简单的数据模型,支持对数据布局和格式的动态控制。
划分
使用一致性哈希和环划分数据到不同节点。为了负载均衡,分析环上信息,并让轻负载节点在环上移动,以减轻重负载节点。
复制
每个数据都在N个主机上复制,包括多种复制策略:Rack Unaware、Rack Aware(在数据中心内)、datacenter Aware。
成员
成员基于Scuttletter[19],一种基于反熵Gossip的机制,具有非常高的CPU利用率和gossip频道利用率。
故障检测
通过故障检测,节点可以本地确认其他节点的接入和离开, 同时避免与无法访问的节点通信。通过节点的故障检测块发送值来判断,不发出值则节点处于接入或离开状态,发出的值表示节点的网络和负载状态。
自举
节点首次启动时会在环中选择随机位置,并获得令牌,随后令牌在集群中传播以通知其他节点。
集群缩放
新节点加入后会从旧节点分取部分数据,并通过内存复制技术传到新节点。
本地持久化
依赖本地文件系统实现数据持久性,利用顺序写入的提交日志实现。
查找时首先查询布隆过滤器,随后查询索引,最后查找磁盘上的文件。
实现细节
单机上主要包含以下进程:分区模块、成员身份和故障检测模块、存储引擎模块。系统控制消息利用UDP传输,用于复制和请求路由的应用程序消息利用TCP传输。
数据请求流程:(1)识别拥有数据的节点(2)将请求路由到节点并等待响应到达(3)如果响应没有在配置的超时值内到达,则使请求失败并返回到客户端(4)基于时间戳计算出最新响应(5)如果它们没有最新的数据,则在任何副本处安排数据修复。
清除提交日志项的机制:滚动提交日志,在旧的提交日志超过特定的、可配置的大小后,将滚动新的提交日志。默认用128MB。
基于主键对所有数据进行索引,磁盘上的数据文件分解为一系列块,每个块最多包含128个键,并且由块索引来划分。
总结
对Facebook中分布式存储系统Cassandra进行介绍,介绍各种实现的大概思路,包括:数据划分、复制、成员身份和故障检测、集群缩放、本地持久化、数据请求流程。