当前课程知识点:大数据系统基础 > 3.文件存储 > 授课视频 > Video
那么前面我们讨论了
Google文件系统里面的性能问题
和它的可靠性问题
那么我们再深入地了解一下
Google文件系统里面
其他的一些细节
那其中一个非常重要的概念
就是文件系统的一个一致性
那么文件系统的一致性
有什么含义呢
我们可以看到
在Google文件系统里面
我们知道一个数据块有三个副本
有三个副本
那么对这三个副本
有一个最低的要求
什么要求呢
这三个副本都应该长成一个样子
不能说有一个里面是A
另外一个数据块里面放的值是B
最后一个数据块放的值是C
那么这个时候
客户端在读取文件的时候
就会不知道该怎么办
因为这个数据完全不一样
它不知道哪一份数据是正确的
这是我们对数据
提出的一个最基本的要求
所以呢
我们就是为了保证可靠性
要是让三个副本
那拿到三个副本之后呢
我们又带来另外一个问题
就是一致性的问题
所以这个问题有可能
比那个可靠性问题更难解决
所以我们看一下
在Google里面
它是怎么去做到这一点的
在说这个事情之前呢
我们先看一下
传统文件系统里面
有没有一致性的问题
那实际上传统文件系统里面
在硬盘上只有一份数据
所以它就不会出现说
有三份数据不一样的情况
所以这种一致性的问题
它就不会出现了 对吧
那传统文件系统里面
它有一个最基本的要求
什么要求呢
我们看一下更改数据呢
它操作就是在文件系统里面
就一个操作 就写入数据
那写入数据
我们看一下写入数据
它的函数是怎么调用的
那么前面是fd
然后给一个()的一个()
然后再给一个size
然后在这个函数里面
还缺一个参数
这个参数是什么东西呢
这个参数其实是隐含的
就是说文件系统在哪一个位置
偏移进行写入
比如说这是我的一个文件
那么我需要在这里面
写入的你的数据
那么这是传统的文件系统
它的操作 对吧
那么这里一致性的体现
无非就是说我写进去的数据
如果没有人接着往这里面写的话
那么我读出来的数据
就应该是我写入的数据 对吧
那么有一些同学问
这不是很显然的事情吗
那么在单机文件系统里面
在本地文件系统里面
除非你写错了
否则你写正确的话
这是显然的事情
但是在分布式文件系统里面
因为我要维护三个副本的一致性
那么这个就很难去保证了
所以我们后面会举出例子来说
我们可能会达不到这样一个目标
并且为了性能考虑
我们是故意达不到这样的目标的
那么再说这些事情之前呢
我们看一下
在Google文件系统里面
如何实现一个写入的构成
以保证数据的一个一致
那么我们首先看一个问题
就是在这里面的一个基本问题
我们如何去保证
这三个数据块它的内容是一样的
那么我们的目标是
维持每一个数据块的三个副本
完全一致
那么方法是什么样的一个方法
这个方法也是在分布式系统里面
非常通用的一个方法
那么我们先让整个数据
因为一开始的时候
所有数块是一样的
因为它们所有的数块都是空的
没有数据
那么初始数据相同
那么之后呢
我们如果按照相同的操作顺序
去执行所有的客户端的操作的话
比如说我写入的写入操作
都按照相同的次序写入
而且写入的操作都一样的话
那么我就可以保证
那个最终的这个数据块
应该是一样的
是吧
所以我们就需要让整个
在这个数据块的读写的操作
都完全一样
那么怎么去保证这一点呢
那么无非就是说
我需要定义所有操作的顺序
op1 op2 op3 op4 对吧
那么一件事情
我要保证它的顺序
那如果有一个人说了算的话
会比较好办
因为1 2 3 4 5
这个人说的话就完了
其他的人就听这个人的就行了
如果两个人
那就需要商量了
那三个人的过程
就是一个非常复杂的一个过程
在分布式的算法里面
被称之为一致性协商的一个过程
但是我们在文件系统里面
我们不需要这样的分布式地协商
那么我们知道
在Google文件系统里面
有一个单个的一个master
那么是不是在这种情况下
一个master就去决定说
我所有写入的顺序
这样的话会好不好
那么这样的话
对于master来说
会造成很多负担
对不对
因为对于master来说
它还要负责原数据的工作
还要负责
所有原数据的写入的顺序
这样的话
它可能会
让这个master的负担过重
所以在Google文件系统里面
master会把这件任务
委派给其中三个的副本的一个人
那么这一个人
被称为叫做主要副本
剩下的两个人会被称为次要副本
所以master说OK
那么我会把这件事情
委派给一个主要副本
那么这个主要副本
应不应该是固定的
好 那主要副本主要是固定的话
就会出现问题
原因是因为
这个主要副本会()()
完了之后呢
这个人说话别人就听不到了
那么这个时候就不行
所以master呢
在委派一个主要副本的时候呢
它是给了一个()
那么给了一个租期
就是说我在T1到T2这段时间内
你是主要副本
那么之后呢
如果这个人死了
那么我可以
让另外一个服务器顶上
作为主要副本
那如果这个人一直是活着的话
他就可以跟master进行续约
说我一直要做主要副本
这样的话
我可以操作顺序
可以让主要副本来定
所以呢
我总体的这种操作
可以由两个顺序来定
一个顺序是master
给主要副本的一个租期
另外一个是主要副本
它本身里面的顺序的一个定义
那通过这种方式的话
我可以保证说三个块的数据块
它所有的操作的顺序是一样的
所以我们可以看一下
在Google文件系统里面
对于数据块写入的一个过程
首先Client
它会跟master说
我要传数据了
master会告诉说
你跟这三个服务器进行联系
那么Client这个时候
可以把数据按照流水线的方式
传送到这三个服务器当中去
并且传送完了之后呢
就可以联系这个主要副本
那主要副本实际上
在这个时候
它会有什么样一个信息呢
它会有一大堆的写入的信息
那么主要副本就自己去选择
写入的顺序
那写入的顺序选择完毕之后呢
它会告诉次要副本说
我的写入顺序是什么样子的
那么次要副本就
按照同样的写入顺序
写入到数据块当中去
这样的话
就可以保证所有的数据块
是一样的
好 那么这是整个数据块
修改的一个过程
包括客户端
和主服务器的一个交互
那么在这个过程当中
如果出现错误的话
那么主要服务器
它会再进行重释
或者是客户端进行重释
那最终如果实在没有办法的话
就会告诉应用程序说
这次写入失败
那样通过这种方式的话
就能够维持这三个副本的一致性
-授课视频
--什么是大数据
--大数据典型应用
--大数据的特点
--大数据技术体系
--大数据生态系统
--大数据技术挑战
--课程内容
-1. 绪论--Quiz 1
-授课视频
--2.2并行化理念
--2.9计算虚拟化
-2.云计算--Quiz 2
-授课视频
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-3.文件存储--Quiz3
-授课视频
--4.13类似框架
--4.14章节总结
-4. 处理框架--Quiz4
-授课视频
-5.内存计算--Quiz5
-授课视频
--数据副本及一致性
--节点本地数据存储
-6. NoSQL--Quiz6
-授课视屏
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
--Video
-7. 流计算--Quiz7