在不久前的Hadoop峰会上,Facebook的工程师Andrew Ryan分享了他们如何使用Namenode和Avatarnode提升HDFS可靠性的方法。Ryan从2009年开始,就参与到了Facebook的 Hadoop开发中。在他的帮助下,Facebook的Hadoop和HDFS数据基础设施,从一个数据中心的单个600TB集群,发展到了多个数据中心 超过100多个HDFS集群。

Ryan首先分析了HDFS的Namenode机制。

图:Namenode,单点故障点

在HDFS中,客户端通过Namenode服务器完成文件系统的元数据操作,并与一个Datanode池通信,以发送和接受文件系统数据。数据在多个Datanode上都有复制,因此一个Datanode宕机不会出现数据丢失,对集群也不应是致命问题。

但是Namenode就不是这样,所有的元数据操作都要通过它完成。如果Namenode不可用,任何客户端就无法从HDFS完成读写操作,虽然客 户端仍可以从Datanode中读出单个数据块,但是整个HDFS就处于宕机状态,所有依赖于HDFS的用户和应用就无法正常工作。

因此,HDFS Namenode是一个单点故障点(SPOF)。

Ryan指出:在Facebook,他们希望知道这个问题的影响范围,并尝试找出解决这个问题的方法。

Data Warehouse是Facebook最大的HDFS部署之一,他们用其完成传统的HadoopMapReduce工作:有一些非常大的集群运行 MapReduce批处理。由于集群很大,Namenode的负载非常高,CPU、内存、磁盘和网络都常常处于很大的压力之下。他们的统计发现:在 Data Warehouse发生的问题中,41%是由HDFS造成的,这也是最大的问题肇因。

Ryan接下来指出:如果能有某种高可用的Namenode方案,也许能防止10%的Data Warehouse问题和突发的宕机时间,这仍然是一个巨大的胜利,因为这让他们可以执行计划好的软件与硬件维护操作。实际上,他们估计这可以减少他们 50%计划好的宕机时间,而之前在这些时间里集群都是不可用的。

下图是他们的高可用Namenode HDFS架构的简化版本。

图:高可用的Namenode

在这个架构中,客户端可以与Primary Namenode或是Standby Namenode通信,Datanode也可以向这两个服务器发送块报告,实现了高可用的Namenode——Avatarnode。

Ryan提到:Facebook在两年前就开始研究Avatarnode。现在,这已经是一个开源项目,提供高可用的Namenode,支持热切 换。目前,在Facebook中,Avatarnode已经进入生产环境,并运行在他们最大的Hadoop Data Warehouse集群中。

Avatarnode是一个双节点的、高可用的Namenode,需要手工完成故障切换。它将现有的Namenode代码包装在一个Zookeeper层中。Avatarnode的基本概念包括:

  • Primary Avatarnode和Standby Avatarnode角色可互换。
  • 当前的Primary Avatarnode主机名保存在Zookeeper中。
  • 修改后的Datanode的块报告要同时发送给Primary Avatarnode和Standby Avatarnode。
  • 修改后的HDFS客户端在开始每次事务前,要检查Zookeeper,如果以此事务失败,要再次检查Zookeeper。即使Avatarnode发生故障切换,一次写操作也可以得以完成。

图:客户端视角

图:Datanode视角

Ryan指出:接下来,他们要进一步提升Avatarnode,并将其整合在一个通用的高可用框架中,使之能够完成不需人工参与的、自动化的、安全的故障切换。

读者可以访问GitHub上Facebook发布的Hadoop版本,其中包括Avatarnode源代码。

除了Facebook之外,还有其他公司也致力于解决这个问题,包括:

  • Appistry,2010年就发布了一个完全分布式的文件系统
  • MapR的Hadoop版本也提供高可用的文件系统
  • Apache的Hadoop 2.0中,也包括了Cloudera的最新发布版本

InfoQ的读者,不知道您对如何解决Namenode高可用问题有何意见和看法?欢迎在评论中分享您的经验。

转载于:https://www.cnblogs.com/shihao/archive/2012/08/28/2660727.html

Facebook如何使用Avartarnode提升HDFS可靠性相关推荐

  1. 区块链分布式存储提升数据可靠性安全性

    区块链分布式存储提升数据可靠性安全性 目前,全球每天就产生超过500亿GB的数据,据区块链资深专家预测,到2025年这一数据将超过4000亿GB.寻找新的数据存储方式已经成为企业和个人的迫切需要. 传 ...

  2. 6大Facebook广告文案绝招提升你Shopify独立站的转化率

    自从开始做Shopify独立站,接触Facebook广告以来,我就一直有些疑问,究竟什么样的广告文案才能吸引用户读下去?写文案时该按照哪种思路来组织语言?受众范围这么广,泛泛写几句文案能带来效果吗?为 ...

  3. 提升网络可靠性的双网卡绑定7种模式

    服务器为了提供网络高可靠性,可以通过双网卡绑定来实现 linux下支持7中模式的双网卡绑定, 第一种:bond0:round robin(交换机端需要配置聚合) 特点:(1)所有链路处于负载均衡状态, ...

  4. 链接聚合是将一组物理接口_如何增加带宽,提升网络可靠性?

    根据聚合组中可以加入以太网接口的类型,可以将聚合组分为两类: 1) 二层聚合组:随着二层聚合接口的创建而自动生成,只能包含二层以太网接口: 2) 三层聚合组:随着三层聚合接口的创建而自动生成,只能包含 ...

  5. 计算机信息安全的可靠性,计算机网络可靠性的提升方案

    ] 前言 当今社会是一个高度信息化的时代.在人们的生活.学习与工作中,计算机已经成为了不可缺少的重要应用工具[1].人们主要依靠计算机网络进行信息传输,网络环境的安全与否直接关系到人们的经济利益以及社 ...

  6. 【云原生AI】Fluid + JindoFS 助力微博海量小文件模型训练速度提升 18 倍

    简介: 深度学习平台在微博社交业务扮演着重要的角色.计算存储分离架构下,微博深度学习平台在数据访问与调度方面存在性能低效的问题.本文将介绍微博内部设计实现的一套全新的基于 Fluid(内含 Jindo ...

  7. HDFS FastCopy

    一.背景 HDFS原始实现两个集群间数据复制使用的是DistCp的方式,主要通过提交Job的并行读取文件数据,写入到目标文件,这种方式需要使所有block数据经由源集群DN->client节点- ...

  8. 分布式之基石: 可靠性——What a tangled web we weave

    总结阅读DDIA和凤凰架构的感想和笔记. 可靠性 Oh what a tangled web we weave, When first we practice to deceive. --Walter ...

  9. Hadoop详解(二):HDFS存储系统设计原理

    1. 基本概念 1.1 NameNode HDFS采用Master/Slave架构.NameNode就是HDFS的Master架构.HDFS系统包括一个NameNode组件,主要负责HDFS文件系统的 ...

最新文章

  1. numpy list df tensor的相互转换
  2. python括号匹配算法_使用Python的栈实现括号匹配算法
  3. 零基础代码学python-零基础学Python 超详细教程
  4. 数据挖掘介绍以及模型参数详解
  5. FCN 学习: Semantic Segmentation
  6. mime类型是什么类型_使用多种MIME类型测试REST
  7. 苹果的消息是从服务器接收数据,iOS 消息推送原理及简单实现
  8. java归并排序代码_Java归并排序算法
  9. addressof表达式不能转换为long_C++入门到精通(七),数据类型的转换
  10. matlab分段函数怎么画图_从零开始的matlab学习笔记——(17)其它实用的绘图工具...
  11. 有indexPath获取到cell对象
  12. Python3.4下使用sqlalchemy
  13. 定制MyBatis的日志
  14. logstash+elasticsearch +kibana 日志管理系统
  15. 三维重建/SLAM笔记_最佳学习路线/攻略
  16. poj 3061 子序列
  17. java转sap hybris方向_SAP Hybris的Convertor, Populator, Facade和DTO这几个概念是如何协同工作的...
  18. 关于IDM下载器免费注册这件事
  19. Multisim小信号调谐放大器电路仿真
  20. SpringCloud 微服务工具集v1.1

热门文章

  1. swift java混合,如何在Swift中连接或合并数组?
  2. row number mysql_MySQL中的ROW_NUMBER()
  3. linux dd命令制作u盘启动_制做linux启动U盘
  4. python备份文件代码_python备份文件以及mysql数据库的脚本代码
  5. 【radar】毫米波雷达静态障碍物识别及其相关资料(仿真、生成、标定、运动估计、静态障碍物识别)(3)
  6. 【面向对象编程】(2) 类属性的定义及使用;__repr__()方法
  7. mysqlorderby数字字符串排序_Python中的元组排序和深度比较
  8. 增加一个dbe连接_pogo pin连接器是如何解决振动的问题?
  9. Angular使用@Input和@Output实现父子组件互相传参(类似Vue的props和this.emit)
  10. 在Ubuntu 16.04.3 TLS上玩转tls协议的简单demo