第一章 大数据计算系统概述
1 大数据计算框架概述
计算框架: 一种抽象,在其中提供相应的通用功能供用户编写代码以实现具体功能,从而形成面向应用的软件。
大数据计算框架:面向大数据的计算框架。
Hadoop
Hadoop的运行过程
Hadoop的详细运行过程
① MapReduce程序
=>创建新的JobClient实例
=>向JobTasker请求获得一个新的JobId,并资源放入HDFS、计算分片数量和map任务数量
=>向JobTasker提交作业,并获得作业的状态对象句柄
=>作业提交请求放入队列等待调度
=>从HDFS中取出作业分片信息,创建对应数量的TaskInProgress调度和监控Map任务
② 从HDFS提取相关资源(Jar包、数据)
=>创建TaskRunner运行Map任务
=>在单独的JVM中启用MapTask执行map函数
=>中间结果数据定期存入缓存
=>缓存写入磁盘
=>定期报告进度
③ 分配Reduce任务
=>创建TaskRunner运行Reduce任务
=>在单独的JVM中启动ReduceTask执行reduce函数
=>从Map节点下载中间结果数据
=>输出结果临时文件
=>定期报告进度
④ JobClient轮询获知任务完成
=>通知用户
Job 和 Task的区别
作业(Job):一个作业在执行过程中可以被拆分为若干Map和Reduce任务完成
任务(Task):进行并行计算的基本事务单元
MapReduce调度器
(FIFO)先进先出调度器(默认):被执行的作业顺序:先按优先级高低、再按作业到达时间,不支持抢占
(Fair)公平调度器:用户之间公平分享资源,资源在用户上传的多个任务中公平分享,支持资源抢占
(Capacity)能力调度器:计算每个队列中正在运行的任务数与其应该分得的计算资源之间的比值,计算一个比值最小的队列,然后按FIFO从队列中选择一个作业执行
Map后的2次排序
文件内部快速排序(Sort):map函数处理完输入数据之后,会将中间数据存在本机的一个或者几个文件当中,并且针对这些文件内部的记录进行一次快速排序
多个文件归并排序(Merge):Map任务执行完成后会对这些排好序的文件做一次归并排序,并将排好序的结果输出到一个大的文件中
MapReduce任务处理过程
待处理的大数据 => 划分 => 提交给主节点 => 传送给map节点,做一些数据整理工作(combining) => 传送给Reduce节点
失效结点处理
主节点中会周期性地设置检查点(checkpoint),检查整个计算作业的执行情况
主节点失效:一旦某个任务失效,可以从最近有效的检查点开始重新执行,避免从头开始计算的时间浪费。
工作节点失效:如果主节点检测工作节点没有得到回应,则认为该工作节点失效。主节点将把失效的任务重新调度到其它工作节点上执行。
MapReduce 1.0缺点
- JobTracker 是 Map-reduce 的集中处理点,存在单点故障。
- JobTracker 完成了太多的任务,造成了过多的资源消耗,当map-reduce job 非常多的时候,会造成很大的内存开销。
- 以 map/reduce task 的数目作为资源的表示过于简单,没有考虑到 cpu/ 内存的占用情况。
YARN
2 大数据批处理计算框架
Spark
RDD概念
- 弹性分布式数据集
- 每个RDD可分成多个分区,一个RDD的不同分区可以在集群中的不同节点上进行并行计算
- RDD是只读的记录分区的集合,不能直接修改。只能基于稳定的物理存储中的数据集创建RDD,或者通过在其他RDD上执行确定的转换操作
- 不同RDD之间的转换操作形成依赖关系,可以实现数据流水处理,避免中间数据存储
RDD的操作
-
分为“动作”(Action)和“转换”(Transformation)两种类型
-
RDD提供的转换接口都非常简单,都是类似map、filter、groupBy、join等粗粒度的数据转换操作
-
Transformations Actions Persistence • 从现有的数据集中创建新的数据集.
• 惰性计算。它们仅在action执行时才执行• 返回一个数据到驱动程序或者计算之后向一个存储系统输出数据 • 为后续操作在内存中缓存数据集
• 可选存在磁盘上或者RAM上,或混合存储Map(func)
Filter(func)
Distinct()Count()
Reduce(funct)
Collect
Take()Persist()
Cache()
RDD的执行过程
- 创建:读入外部数据源
- RDD经过一系列的“转换”(Transformation)操作,每一次都会产生不同的RDD,供给下一个转换操作使用
- 最后一个RDD经过“动作”(Action)操作进行转换,并输出到外部数据源
- 优点:惰性调用、管道化、避免同步等待、不需要保存中间结果、每次操作变得简单
RDD高效的原因
- 容错性:数据复制或者记录日志、RDD的特性
- 中间结果持久化到内存,数据在内存中的多个RDD操作之间进行传递,避免了不必要的读写磁盘开销
- 存放的数据可以是Java对象,避免了不必要的对象序列化和反序列化
基本概念
- DAG:Directed Acyclic Graph(有向无环图)
- Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task
架构设计
Shuffle操作
阶段的划分
-
阶段划分的依据是窄依赖和宽依赖:窄依赖对于作业的优化很有利,宽依赖无法优化
-
每个RDD 操作都是一个fork/join
-
划分Stage:在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就合并
RDD运行过程
RDD容错机制
Spark中的存储机制
-
RDD缓存:包括基于内存和磁盘的缓存
内存缓存=哈希表+存取策略
-
Shuffle数据的持久化:必须是在磁盘上进行缓存的
第二章 大数据管理系统
数据库的定义:数据库是长期储存在计算机内、有组织的、可共享的数据集合。
DBMS
- 数据库管理系统(Database Management System)是位于用户与操作系统之间的一层数据管理软件。
- DBMS的主要功能
- 数据定义功能:提供数据定义语言(DDL),用于定义数据库中的数据对象。
- 数据操纵功能:提供数据操纵语言(DML), 用于操纵数据实现对数据库的基本操作(查询、插入、删除和修改)。
- 数据库的运行管理
- 数据库的建立和维护功能
DBS
- 数据库系统(Database System,简称DBS)是指在计算机系统中引入数据库后的系统构成。
- 由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员和用户构成。
数据库存储结构
- 磁盘冗余阵列(RAID):是数据库服务器最常用的外存储介质,由若干同样的磁盘组成的阵列,从RAID0-RAID8有多种组合方式。
- 数据库数据以文件形式在外存中存储。
- 文件内记录的组织方式
- 堆文件组织:记录可以放在文件的任何位置,以输入顺序为序。删除、插入操作不需移动数据。
- 顺序文件组织:记录按查找键值的升序或降序的顺序逻辑存储的。一般使用指针链结构。
- 散列文件组织:某个属性值通过哈希函数求得的值作为记录的存储地址。
- 聚类文件组织:一个文件可存储多个有联系的关系,有联系的记录存储在同一块内,以提高I/O速度。
索引技术
-
索引:是独立于主文件记录的一个只含索引属性的小的文件,且按索引值排序,查找速度可以很快。
-
索引分类
-
有序索引:根据记录中某种排序顺序建立的索引。
-
主索引(聚类索引):索引的查找键值的顺序与主文件顺序一致。这种文件称作索引顺序文件,只有一个。
索引记录:查找键值 和 指向具有该值的主文件中第一个记录的指针- 稠密索引:对于主文件中的每一个查找键值建立一个索引记录(索引项)
- 稀疏索引:在主文件中,若干个查找键值才建立一个索引记录索引记
- 多级索引:可能建成的稀疏索引还是很大,以致于查询效率不高。所以对主索引再建立一级索引
-
非聚类索引:索引的查找键值的顺序与主文件顺序不一致。
-
-
散列索引:根据记录中某个属性值,通过散列函数得到值作为存储空间的桶号。
-
-
索引的更新
- 删除:
① 删除主文件记录
② 如果符合索引键值的记录有多个,索引不用修改。
否则:对稠密索引,删除相应的索引项;
对稀疏索引,如果被删记录的索引值在索引块中出现,则用主文件被删记录的下一个记录的查找键A替 换。若A已出现在索引块,则删除被删记录的对应索引键。 - 插入:
①用插入记录的查找键找到插入位置,执行主文件插入。
②对稠密索引且查找键未在索引块出现,在索引中插入。
③对稀疏索引:若数据块有空闲放得下新数据,不用修改索引;
否则加入新数据块,在索引块中插入一个新索引项
- 删除:
事务
- 定义:事务是DBMS中一个逻辑工作单元,通常由一组数据库的操作组成
- 事务的ACID性质
- 原子性(Atomic):构成事务的所有操作要么全部执行;要么全部不执行,不对数据库中的数据造成影响。
- 一致性(Consistency):事务的操作使数据库从一个一致状态转变为另一个一致状态。
- 隔离性(Isolation):在多用户环境下,事务的执行不受同时执行的其它事务的影响。
- 持久性(Durability):一个事务如果成功执行,其对数据库的影响是持久的,不因故障而失效。
I/O并行
-
通过将关系划分到多个磁盘来减少从磁盘检索关系所需的时间
-
水平划分:关系的元组在多个磁盘间划分,每个元组只存储在一个磁盘上
-
划分技术 定义(磁盘数 = n) 优点 缺点 循环划分 将关系中的第 i 条元组送到第(i mod n)号磁盘 • 最适合顺序扫描整个关系的查询
• 所有磁盘具有几乎相等的元组数,因此各磁盘上的查询工作量是平衡的• 难以处理范围查询
• 没有聚簇(clustering) :元组分散在所有磁盘散列划分 1.选择一个或多个属性作为划分属性
2.选择值域为0…n-1的散列函数 h
3.令 i 表示将散列函数 h 作用于元组的划分属性值得到的结果,则该元组送往磁盘 i• 适合于顺序存取
• 适合于划分属性上的点查询,可只检查单一磁盘, 使其他磁盘可用于其他查询无聚簇, 因此难以回答范围查询 范围划分 1. 选择一个属性作为划分属性选择一个划分向量 [ v 0 , v 1 , . . . , v n − 2 ] [v_0, v_1, ..., v_{n-2}] [v0,v1,...,vn−2]
2. 设一元组的划分属性值为v
使 v i < = v < = v i + 1 v_i <= v <= v_{i+1} vi<=v<=vi+1 的元组分到磁盘i + 1
使 v < v 0 v < v_0 v<v0 的元组分到磁盘 0
使 v > = v n − 2 v >= v_{n-2} v>=vn−2 的元组分到磁盘 n-1• 提供基于划分属性值的数据聚簇.
• 适合于顺序存取
• 适合于划分属性上的点查询: 只需存取一个磁盘.
• 对划分属性上的范围查询, 可能只需存取一个或少数几个磁盘
偏斜的处理
-
偏斜的种类
- 属性值偏斜(范围划分和散列划分中可能发生)
- 某些值在许多元组的划分属性上出现,所有在划分属性上值相同的元组被分配在同一分区中
- 划分偏斜
- 范围划分:一个坏的划分向量可能将过多元组分配到一个分区以及过少元组分配到其他分区
- 散列划分:只要选择好的散列函数就不太可能发生
- 属性值偏斜(范围划分和散列划分中可能发生)
-
处理偏斜
-
范围划分中处理偏斜:生成平衡的划分向量的方法
- 按序扫描关系并构造划分向量:每读出关系的1/n,下一条元组的划分属性值就加入划分向量
- 如果划分属性有重复值则可导致重复项或不平衡
- 实际中还使用基于直方图的其他技术
-
利用直方图处理偏斜
- 从直方图可以相对直接地构造出平衡的划分向量
- 直方图可通过扫描关系或者对关系元组抽样来构造
-
利用虚拟处理器来处理偏斜
-
范围划分中的偏斜可以用虚拟处理器很好地处理:
创建大量虚拟处理器(比如是实际处理器数目的10 到20倍)
用任何划分技术将关系元组分配到虚拟处理器
以循环方式将每个虚拟处理器映射到到实际处理器 -
基本思想:
如果正常划分会导致偏斜, 则偏斜很可能被分散到若干个虚拟分区
偏斜的虚拟分区被分散到若干实际处理器上,于是分配变得平均了
-
-
查询间并行
- 查询/事务相互并行执行
- 增加事务吞吐量,主要用于扩展事务处理系统以支持更大的每秒事务数
- 在共享磁盘或无共享体系结构上的实现更复杂
- 必须在处理器之间传送消息来协调封锁和日志登记
- 本地缓冲区中的数据可能已被另一处理器更新
- 缓存一致性(cache-coherency)得到保持——对缓冲区数据的读写必须找到数据的最近版本
缓存一致性协议
- 共享磁盘系统的缓存一致性协议例:
• 读/写一页之前, 该页必须以共享/排他方式加锁
• 对页加锁时, 该页必须从磁盘读出
• 释放页锁之前, 该页如果更新过则必须写到磁盘
查询内并行
-
单个查询在多个处理器/磁盘上并行执行:对加速耗时查询很重要
-
查询内并行的两种互相补充的形式:
操作内并行 —— 查询内每个操作并行执行
操作间并行 —— 查询内不同操作并行执行
-
第一种形式在增加并行度时的伸缩性好, 因为每个操作处理的元组数通常都多于查询内的操作数目
第三章 大数据实时计算框架
Storm
Storm是个实时的、分布式以及具备高容错的计算系统。
- 分布式
• 水平扩展:通过加机器、提高并发数就提高处理能力
• 自动容错:自动处理进程、机器、网络异常 - 实时:数据不写磁盘,延迟低(毫秒级)
- 流式:不断有数据流入、处理、流出
Storm的典型应用场景
-
请求应答(同步):实时图片处理、实时网页分析
-
流式处理(异步):逐条处理、分析统计
-
数据流处理:可用来实时处理新数据和更新数据库,兼具容错性和可扩展性。
-
连续计算:可进行连续查询并把结果即时反馈给客户端。
-
分布式远程程序调用
Storm的特点
- 可靠的消息处理:Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。
- 快速:系统的设计保证了消息能得到快速的处理
- 本地模式:可以在处理过程中完全模拟Storm集群,可以快速进行开发和单元测试。
- 容错性:Storm会管理工作进程和节点的故障。
- 水平扩展:计算是在多个线程、进程和服务器之间并行进行的。
技术架构
Worker、Executor和Task的关系
Storm的工作流程
Storm容错
-
任务级失败
-
Bolt任务crash引起的消息未被应答:acker中所有与此Bolt任务关联的消息都会因为超时而失败
=> Spout的fail方法将被调用。 -
acker任务失败:在失败之前持有的所有消息都将超时而失败
=> Spout的fail方法将被调用。 -
Spout任务失败
=> 与Spout任务对接的外部设备(如MQ)负责消息的完整性。
-
-
任务槽故障务级失败+集群节点(机器)故障
-
Nimbus节点故障
如果失去了Nimbus节点,Worker也会继续执行,如果worker死亡,Supervisor也会继续重启他们。
但是,没有Nimbus,Worker不会在必要时被安排到其他主机,客户端也无法提交任务。
Storm开发API
-
Spout
nextTuple():回调函数,循环触发
ack(id):回调函数,消息成功处理时触发
fail(id):回调函数,消息超时时触发 -
Bolt
execute(Tuple input):回调函数,数据触发
collector.emit(tuple):通过collector向下游发送tuple
collector.ack(tuple):通过collector确认已经成处理输入tuple -
public class MD5Topology { public static class MD5Bolt extends BaseBasicBolt { @Override public void execute(Tuple tuple, BasicOutputCollector collector) { String input = tuple.getString(0); // 获取来自DRPCSpout的实际输入数据 String output = MD5Util.getMD5Str(input); // 往下游ReturnBolt emit数据 // 第一个字段是计算的结果,这里是md5串 // 第二个字段是来自DRPCSpout的return-info,是一个json串,包括drpc request id,server host、port collector.emit(new Values(output, tuple.getString(1))); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("result", "return-info")); // 声明输出两个字段,和emit是对应的 } } public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); builder.setSpout("DRPCSpout", new DRPCSpout(args[0]), 2); builder.setBolt("MD5Bolt", new MD5Bolt(), 4) // 参数依次是spout/bolt id,spout/bolt对象,并发度 .shuffleGrouping("DRPCSpout"); // 指定上游以及grouping方式 builder.setBolt("ReturnBolt", new ReturnResults(), 2) .shuffleGrouping("MD5Bolt"); Config conf = new Config(); conf.setNumWorkers(4); // 设置worker个数 StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } }
Spark Streaming
Spark Streaming的核心概念
-
DStream:表示数据流的RDDs序列
-
Transformations —— 从一个Dstream修改数据以创建另一个DStream
标准的RDD操作:map, countByValue, reduce, insert……
有状态操作:window, countByValueAndWindow…… -
输出操作:向外部实体传送数据
saveAsHadoopFiles:保存到HDFS
foreach:对每一批结果进行处理
DStream的输入源
- 基础来源:在 StreamingContext API 中直接可用的来源。
- 高级来源:如 Kafka、Flume、Kinesis、Twitter 等,可以通过额外的实用工具类创建。
Spark Streaming架构
Spark容错
- RDDs可以记住从原始的容错输入创建它的操作序列
- 批量输入数据被复制到多个工作节点的内存中,因此是容错的
一些对比
Spark Streaming与Storm对比
Spark Streaming | Storm |
---|---|
无法实现毫秒级的流计算 | 可以实现毫秒级响应 |
低延迟执行引擎可以用于实时计算 | |
相比于Storm,RDD数据集更容易做高效的容错处理 |
Storm和Hadoop架构组件功能对应关系
Hadoop | Storm | |
---|---|---|
应用名称 | Job | Topology |
系统角色 | JobTracker | Nimbus |
TaskTracker | Supervisor | |
组件接口 | Map/Reduce | Spout/Bolt |
第四章 大图计算框架
计算模型
Superstep: 并行结点计算
-
对于每个结点
▪ 接受上一个superstep发出的消息
▪ 执行相同的用户定义函数
▪ 修改它的值或者其输出边的值
▪ 将消息送到其他点(由下一个superstep接受)
▪ 改变图的拓扑结构
▪ 没有额外工作要做时结束迭代 -
终止条件
▪ 所有顶点同时变为非活跃状态
▪ 没有信息传递
与MapReduce的不同之处
- 图算法可以被写成一系列的MapReduce调用
- Pregel
在执行计算的机器上保持顶点和边
用网状结构传输信息 - MapReduce
每一阶段都利用整个图的全部状态
需要整合MapReduce链
// 图操作(Scala语言)
class Graph [ V, E ] {
def Graph(vertices: Table[ (Id, V) ],
edges: Table[ (Id, Id, E) ])
// Table Views -----------------
def vertices: Table[ (Id, V) ]
def edges: Table[ (Id, Id, E) ]
def triplets: Table [ ((Id, V), (Id, V), E) ]
// Transformations ------------------------------
def reverse: Graph[V, E]
def subgraph(pV: (Id, V) => Boolean,
pE: Edge[V,E] => Boolean): Graph[V,E]
def mapV(m: (Id, V) => T ): Graph[T,E]
def mapE(m: Edge[V,E] => T ): Graph[V,T]
// Joins ----------------------------------------
def joinV(tbl: Table [(Id, T)]): Graph[(V, T), E ]
def joinE(tbl: Table [(Id, Id, T)]): Graph[V, (E, T)]
// Computation ----------------------------------
}
Pregel
系统架构
Pregel系统也使用主/从模型
- 主节点:调度从节点、修复从节点的错误
- 从节点:处理自己的任务、与其他从节点通信
聚合
聚合器
Pregel执行
GraphX
使用路由表连接站点选择
迭代mrTriplets的缓存
迭代mrTriplets的聚合
容错
- 检查点:主节点定期指示从节点将分区的状态保存到持久化存储中
- 错误检测:定时使用“ping”信息
- 恢复
主节点将图形分区重新分配给当前可用的从节点
所有工作人员都从最近可用的检查点重新加载分区状态 - 局部恢复:记录传出的信息、只涉及恢复分区
第五章 大数据存储
在大规模下小概率事件将成为常态
磁盘机器损坏
RAID卡故障
网络故障
电源故障
数据错误
系统异常
热点
软件缺陷
误操作
HDFS
相关术语
HDFS | GFS | MooseFS | 说明 |
---|---|---|---|
NameNode | Master | Master | 整个文件系统的大脑 提供整个文件系统的目录信息,各个文件的分块信息,数据块的位置信息 管理各个数据服务器。 |
DataNode | Chunk Server | Chunk Server | 分布式文件系统中的每一个文件,都被切分成若干个数据块,每一个数据块都被存储在不同的服务器上 |
Block | Chunk | Chunk | 每个文件都会被切分成若干个块(默认64MB),每一块都有连续的一段文件内容,是存储的基本单位。 |
Packet | 无 | 无 | 客户端写文件的时候,不是一个字节一个字节写入文件系统的,而是累计到一定数量后,往文件系统中写入一次,每发送一次的数据,都称为一个数据包。 |
Chunk | 无 | Block(64KB) | 在每一个数据包中,都会将数据切成更小的块(512字节),每一个块配上一个奇偶校验码(CRC),这样的块就是传输块。 |
Secondary NameNode | 无 | Metalogger | 备用的主控服务器,在身后默默地拉取着主控服务器的日志,等待主控服务器牺牲后被扶正。 |
核心功能
功能 | 说明 |
---|---|
Namespace | HDFS支持传统的层次型文件组织,与大多数其他文件系统类似,用户可以创建目录,并在其间创建、删除、移动和重命名文件。 |
Shell命令 | Hadoop包括一系列的类shell的命令,可直接和HDFS以及其他Hadoop支持的文件系统进行交互。 |
数据复制 | 每个文件的block大小和replication因子都是可配置的。Replication因子可以在文件创建的时候配置,以后也可以改变。HDFS中的文件是write-one,并且 严格要求在任何时候只有一个writer。 |
机架感知 | 在大多数情况下,replication因子是3,HDFS的存放策略是将一个副本存放在本地机架上的节点,一个副本放在同一机架上的另一个节点,最后一个副本放在不同机架上的一个节点。机架的错误远远比节点的错误少,这个策 |
Editlog | FSEditLog类是整个日志体系的核心,提供了一大堆方便的日志写入API,以及日志的恢复存储等功能。 |
集群均衡 | 如果某个DataNode节点上的空闲空间低于特定的临界点,那么就会启动一个计划自动地将数据从一个DataNode搬移到空闲的DataNode。 |
空间的回收 | 删除文件并没有立刻从HDFS中删除,HDFS将这个文件重命名,并转移到/trash目录,用于恢复,/trash可设置保存时间。 |
HDFS结构
读取文件流程
写入文件流程
数据写入流程总结
数据写入 | 概述 | 优点 | 不足 |
---|---|---|---|
链式写入 | Client -> Replica A -> Replica B -> Replica C | 每个节点负载和流量比较均衡 | 链条过长,出现异常时诊断和修复过程比较复杂 |
主从写入 | Client -> Replica A -> Replica B -> Repllica C | 总路径较短,管理逻辑由主节点负责 | 主节点有可能成为负载和流量瓶颈 |
异常处理方式 | 概述 | 优点 | 不足 |
---|---|---|---|
重新修复 | 剔除异常节点,提升 replica 版本 , 重新组织当前写入的repilca group | 最大程度保留之前写入的数据 | |
Seal and New | 1、Seal所有当前正在写的chunk replica,不再允许写入,以当前最短 replica 作为chunk标准长度 2、申请新的chunk,在新 chunk replica继续写入数据 | 简单快速,可以绕过异常节点 | Chunk长度不固定,需要更多的meta管理 |
读流程总结
- 可以选取任意一个有效副本读取
- 如果出现异常,尝试其它副本
- Backup read可以有效减少读取延迟
- 根据局部性原理选取当前最优的副本访问
数据校验
IO全路径Checksum检查
- <buffer, len, crc>
- 存储和网络传输中验证
- Checksum和数据持久存储
- 定期后台扫描磁盘数据进行checksum检查
数据备份
当机器/磁盘出现异常,通过其它副本快速恢复
数据平衡
当新的机器/磁盘上线,迁移数据保证负载均衡
垃圾回收
异步完成,系统稳定平滑
读流程总结
- 可以选取任意一个有效副本读取
- 如果出现异常,尝试其它副本
- Backup read可以有效减少读取延迟
- 根据局部性原理选取当前最优的副本访问
数据校验
IO全路径Checksum检查
- <buffer, len, crc>
- 存储和网络传输中验证
- Checksum和数据持久存储
- 定期后台扫描磁盘数据进行checksum检查
数据备份
当机器/磁盘出现异常,通过其它副本快速恢复
数据平衡
当新的机器/磁盘上线,迁移数据保证负载均衡
垃圾回收
异步完成,系统稳定平滑
当前最短 replica 作为chunk标准长度
2、申请新的chunk,在新 chunk replica继续写入数据 | 简单快速,可以绕过异常节点 | Chunk长度不固定,需要更多的meta管理 |
读流程总结
- 可以选取任意一个有效副本读取
- 如果出现异常,尝试其它副本
- Backup read可以有效减少读取延迟
- 根据局部性原理选取当前最优的副本访问
数据校验
IO全路径Checksum检查
- <buffer, len, crc>
- 存储和网络传输中验证
- Checksum和数据持久存储
- 定期后台扫描磁盘数据进行checksum检查
数据备份
当机器/磁盘出现异常,通过其它副本快速恢复
数据平衡
当新的机器/磁盘上线,迁移数据保证负载均衡
垃圾回收
异步完成,系统稳定平滑
读流程总结
- 可以选取任意一个有效副本读取
- 如果出现异常,尝试其它副本
- Backup read可以有效减少读取延迟
- 根据局部性原理选取当前最优的副本访问
数据校验
IO全路径Checksum检查
- <buffer, len, crc>
- 存储和网络传输中验证
- Checksum和数据持久存储
- 定期后台扫描磁盘数据进行checksum检查
数据备份
当机器/磁盘出现异常,通过其它副本快速恢复
数据平衡
当新的机器/磁盘上线,迁移数据保证负载均衡
垃圾回收
异步完成,系统稳定平滑