portableDFS
——可便携的分布式文件系统
2
自我介绍
2002
2008
2009
2010
• 毕业于湘潭工学院(现湖南科技大学)
• 计算机科学与技术专业
• 创建技术博客()
• 创建Hadoop技术交流群
• 创建了Hadoop技术论坛()
• 发行《Hadoop开发者》杂志
• 发起开源项目飞月
(
2002 2002 2004 2007
长沙创智 珠海金山 深圳华为 深圳腾讯
易
剑(一见)
3
分享目的
通过具体的案例,展现活用CAP理论的魅力
1
如何充分利用场景特性,以简化系统架构设计
2
展现一个另类的分布式文件系统的实现
3
4
内容纲要
前言31
系统实现2
总结33
5
Consistency Availability
Partition
tolerance
RDBMS
(MySQL)
BigTable
HBase
Redis
MongoDB
Cassandra
Dynamo
CouchDB
portableDFS
CA
APCP
N/A
CAP原理
6
GFS HDFS
fastDFS mogileFS
mooseFS pNFSopenAFS
百花齐放
portableDFS有何不同?
7
portableDFS vs HDFS
portableDFS HDFS
CAP AP CP
磁盘级可靠性 是 否
安装部署 极简单 比较复杂
与SCP无缝对接 支持 不支持
随机读写 支持 不支持
文件分片存储 不支持 支持
开发语言 C++ Java
上手难度 非常低 有一定的门槛
管理工具 提供命令行和中文版Web管理工具 不提供
系统运维 几乎不需要投入专人维护 需要投入专人维护
8
互联网业务特点
9
portableDFS是什么?
牺牲强一致性获得超高可用性和可靠性的磁盘级可便携的分布式文件系统:
它具有极高的可用性
它具有极高的可靠性
它不保证强一致性
最轻量的分布式文件系统
10
portableDFS设计目标
文件自动容灾,对外透明
超高的可用性和可靠性,近完美的A和P
可容忍N个节点失效(N=总节点数-副本数)
兼容scp
最终的一致性
目标集群10~100节点
极简的部署
支持随机读写
11
内容纲要
前言31
系统实现2
总结33
12
文件是如何存储的?
裸文件
实现简单
兼容性高,可脱离DFS直接使用
易实现随机读写等高级功能
为实现其它高级特性留有余地
:文件原原本本存储在磁盘上
13
弱主架构
经典主从架构
14
portableDFS总体架构
DataNode DataNode DataNode DataNode DataNode
Client
Master
(主)
socket
心跳(RPC)
RPC
Master
(备)
15
DataNode
portableDFS-DataNode结构
元数据 Resource
thrift RPC
Agent
Client
Master
heartbeat
socket
去状态:支持重建元数据
16
Client
portableDFS-Client结构
广播
读
写
删
DataNode
socketcall
17
磁盘级可靠性(1/4)
为何要做磁盘级可靠性?
这和portableDFS定位有关:定位于中小规模集群
假设一个由10台机器组成的集群,每台10块磁盘:
如果不是磁盘级的,则1块磁盘故障影响整个节点
将失去1/10的服务能力
如果是磁盘级的,则磁盘间互不影响
则只失去1/100的服务能力
18
磁盘级可靠性(2/4)
磁盘
线程
Disk
磁盘
线程
Disk
磁盘
线程
Disk
磁盘
线程
Disk
队列 队列 队列 队列
网络线程
Client
socket
19
磁盘级可靠性(3/4)
磁盘&网络
线程
磁盘
磁盘&网络
线程
磁盘
磁盘&网络
线程
磁盘
磁盘&网络
线程
磁盘
Client
socket
如何保证网络数据由目标磁盘线程接收?
20
磁盘级可靠性(4/4)
Client
磁盘&网络线程(a)
socket = accept()
磁盘&网络线程(a)
read_head()
磁盘&网络线程(b)
read/write()
磁盘
切换
线程(a)
21
虚
拟
内
存
Google-hash
(SparseHash)
LXC
(Linux Container)
一
致
性
哈
希
虚拟化
作用
解决资源有限问题
提升资源利用效率
解决简化容灾实现
统一界面屏蔽差异
22
DataNode
DataNode
DataNode
DataNode
DataNode
DataNode Cluster
读
广播
文件读的实现
广播收集
切换线程广播结果
打开指定文件
读取文件
Client
23
DataNode
DataNode
DataNode
DataNode
DataNode
DataNode ClusterClient
广播
写线程1
写线程1
写线程1
写
DataNode
DataNode
读
文件写的实现
广播收集
广播结果
切换线程
切换线程
切换线程
如何提升写性能?
24
提升写的性能
Proxy DataNode
Cluster
上传1份副本
上传N份副本
portableDFS
Writer
28
Master
portableDFS-Master结构
thrift
Service
元数据
Monitor
DataNode
设计关键点: Master无状态化
29
Master无状态化
Master
DataNode
DataNode
DataNode
启动中
上报元数据
30
自动补齐副本数
Master DataNode
检查副本
通知复制副本
DataNode
下载副本
副本数增一
支持哪些副本补齐策略?
31
补齐副本策略
多策略驱动:
人工驱动(含命令行工具和Web操作界面)
定时驱动(分工作日和节假日两种)
空闲时段驱动(如晚上空闲时间)
机器负载驱动(如负载轻的时候)
实时补齐
原则:严格控制对正常访问的影响
DataNode独立补齐线程,排队工作
32
脏数据的处理
脏数据种类:
多余的副本
不一致的副本
写出错的数据
由Master通知DataNode删除
DataNode定时扫描删除
33
sshdscp
portableDFS-
Cluster
SCP兼容
做SCP兼容的目的是什么?
portableDFS-
Proxy
34
portableDFS编程接口
long open(const char *pathname, int flags, mode_t mode, int replication);
long open(const char *pathname, int flags, mode_t mode);
long open(const char *pathname, int flags);
int close(long fd);
ssize_t write(long fd, const void *buf, size_t count);
ssize_t read(long fd, void *buf, size_t count);
int remove(const char *pathname);
int upload(const char *local_pathname, const char *remote_pathname);
int download(const char *remote_pathname, const char *local_pathname);
35
极简部署(上)
百位架构师调查
36
极简部署(下)
配置:
只需要一个DataNode列表文本文件(每行一个IP)即可
安装:
直接复制即可:DataNode、Client和Master分别为一个独立的可执行程序文件
取名“可便携的”原因,能够随身携带的
37
运营效果
38
性能数据
副本数:2
硬件:千兆网卡,16核CPU,64G内存
39
内容纲要
前言31
系统实现2
总结33
40
portableDFS亮点
最大好处:不需要人去维护
超高的可用性和可靠性,近完美的A和P
磁盘级的容灾
与SCP无缝对接
极简单的安装部署
它是足够简单的
支持随机读写
41
portableDFS应用场景
需要文件容灾
能容忍不一致
不愿投入
专门的人力运维
文件大小
在10M~3G左右
42
高级特性
文件分片,超大(1TB)文件的支持
如何支持快速检索?
如何支持文件的压缩?
如何支持mount到本地?
是否能支持MapReduce?
思
考
如何支持上千节点的集群? portableDFS
分
片
检
索
大
集
群
43
如何支持上千节点的集群?
弱有状态
Proxy
portableDFS
Cluster
portableDFS
Cluster
portableDFS
Cluster
45
设计要点
广播:最简单的去中心化方法
去状态化设计:DataNode元数据可重建、Master无状态化
利用独立线程解耦合:磁盘级可靠性
充分利用了CAP原理:最大化地实现了A和P
跨线程处理SOCKET:DataNode的实现
Thanks!