目录
一、分布式系统基本概念
1.网络通信协议
2.通信方式
3.分布式系统类型
4.故障类型
5.CAP
二、分布式文件系统
1.NFS
2.AFS
三、google File System \HDFS
(本文为陈世敏老师的课程笔记)
------------------------------------------
一、分布式系统基本概念
1.网络通信协议
1.1 OSI模型
1.2 IP/TCP/UDP
+IP (Internet Protocol)
IPv4地址:例如210.76.211.7,唯一标识一台联网的机器
Connectionless (无连接), unordered(无序), best-effort (不保证可靠)
+ TCP (Transmission Control Protocol)
在IP基础上实现
Port端口号:不同的进程/socket
Reliable (可靠的), ordered (有顺序), connection-oriented (有连接),error checked (数据校验)
+ UDP (User Datagram Protocol)
在IP基础上实现
Port端口号:不同的进程
进行数据校验,其它与IP相同,不需建立连接,速度快,但是应用程序要自己检查数据是否收到、顺序等
2.通信方式
2.1 process/thread
+Process (进程)
创建:fork
私有的虚存空间,私有的打开文件 (files, sockets, devices, pipes …)
+Thread (线程)
创建:pthread_createclone
共享的虚存空间,共享的打开文件,一个进程中可以有多个线程
2.2应用程序通信方式
+shared memory共享内存
访问同一物理空间地址,一方修改另外一方可以看到,需要并发控制
+Message passing消息传递
多进程之间或者多机,socket、pipe等
3.分布式系统类型
+client/server
客户端请求,服务器响应
+P2P
节点功能相似,没有中心节点
+Master/workers
一个节点进行调控
4.故障类型
+fail to stop
故障,进程停止
+fail slow
故障,运行变慢
+Byzantine failure
包含恶意攻击
5.CAP定理
数据一致性(consistency)\容忍网络断开(partition tolerance)\可用性(Availability)三者不可兼
二、分布式文件系统
1.NFS
1.1目的1:
从不同终端可以访问同一个目录,多用户共享,集中管理
为了服务器出现故障时候,可以简单快速恢复-fail-stop模型,这需要:
+stateless
server不保存任何状态
+idempotent
Read 读多次结果一样
write 在同样的位置写同样的数据结果一样
以上两条加起来使得NFS有一个简单的Crash Recovery策略:Server只需要重启,因为stateless;client接收不到响应不断重试,因为 idempotent.
1.2目的2
远程文件访问性能高->client cache里面缓存数据->但是会有cache一致性问题->解决flush-on-close 在文件关闭时候,必须将缓存数据 写回server,而client每次在使用缓存数据前必须验证是否过时,用GETATTR请求去poll获得最新的文件属性,比较文件修改时间,但是使 用polling性能差->AFS
2.AFS
目标:scalability 尽可能支持多的客户端,解决polling问题
Invalidation:
client获得一个文件时候在server上登记->当server发现文件修改,向登记client发送callback->client收到callback,删除缓存的文件。
3.NFS和AFS比较
NFS | AFS |
数据页为单位 | 缓存整个文件 |
缓存在内存 | 缓存在本地硬盘 |
可以mount到任何地方 | 统一命名空间,详细权限 |
三、google File System \HDFS
1.posix和应用文件系统比较
2.GFS设计目标
大块顺序读+并行追加 !不支持文件修改
3.系统架构
Name Node:存放元数据
Data Node:存储数据块,默认64MB大小数据块,默认存储三份Rack-aware(本机、本机架、不同机架)
4.文件操作
open:与Name Node通信一次
read:open拿到了元数据,所以之后的操作绕过了Name Node,可以从多个副本选择最佳的Data Node读取,可以支持很多并发读请求
write:向Name Node请求写,拿到要写入的Data Node信息->写到主节点,主节点给副节点,副节点再给另外一个节点,pipeline传递,最大 限度利用带宽,返回是否收到。此时发送的数据块还在各个机器的内存中缓存!->client发出写命令到主节点,主节点直接发送到两个副 节 点,真正执行写到文件系统中操作,返回是否成功,主节点汇总给client.
5.并发写问题
如果允许写,跨越两个数据块并发可能出现覆盖,所以只允许append.