高可用架构图

先上一张搜索来的图。

如上图,HDFS的高可用其实就是NameNode的高可用。

上一篇里,SecondaryNameNode是NameNode单节点部署才会有的角色,它只帮助NameNode完成日志合并的工作,在NameNode出现问题时不能顶上去。

在高可用里,不再有SecondaryNameNode这个角色,Hadoop2.x版本支持NameNode的一主一备,3.x版本支持一主多备,由备机完成日志合并任务。某个时点只有主NameNode对外提供服务。

总结一下,在一个高可用的HDFS集群里,至少需要这么几个角色:

  • DataNode,存数据的节点,没它就不能叫文件系统了
  • NameNode,有两个或多个,主节点状态是Active,备节点状态是Standby,备节点来同步、合并、推送主节点的FsImage
  • 共享存储,存放的是主节点的实时日志,备节点从共享存储里异步同步日志,官方有QJM和NFS两种实现

为了实现NameNode的自动切换,还需要这两个角色:

  • Zookeeper,分布式协调器,NameNode选主用的
  • ZKFS,Zookeeper客户端,监控NameNode状态,并与Zookeeper保持长连接,与NameNode在一台机器上部署

高可用原理

它的高可用步骤如下:

  1. 在配置文件中配置多个NameNode属于同一个cluster,启动hdfs后,NameNode通过zookeeper选主
  2. 客户端通过dfs.client.failover.proxy.provider.[clusterID]配置的策略去访问NameNode,通常是向所有的NameNode发送请求来判断哪个是主节点
  3. 客户端对主NameNode发起的操作会同步写入共享存储,这里不直接写入其他NameNode是为了避免由于NameNode故障引起响应超时
  4. DataNode把文件的Block信息发送给所有的NameNode
  5. 备NameNode按照时间间隔或者日志文件大小来合并主NameNode的FsImage
  6. 如果主节点的NameNode或者ZKFS挂了
    1. 如果主NameNode挂了,本机的ZKFS会将ZK集群的锁释放,并回调其他ZKFS的方法,通知它们来拿锁。拿到锁的ZKFS连接一下原来的主NameNode,发现确实挂了,再把本机的NameNode状态由Standby修改为Active。
    2. 如果ZKFS挂了,ZKFS与ZK的TCP连接会断掉。ZK集群将删除该ZKFS持有的锁,并回调其他ZKFS的方法,通知它们来拿锁。拿到锁的ZKFS连接一下原来的主NameNode,发现它还活着,ZKFS先把原来的主NameNode降级为Standby,再把本机的NameNode升为Active。

高可用环境搭建

Hadoop的官方文档讲的很详细,参考 《用QJM实现HDFS的高可用》

HDFS联邦

一个主NameNode里存放的元数据毕竟容量有限,在数据量大的时候,很可能无法满足需要。

HDFS联邦机制类似于HDFS的分片存储,把所有元数据分散在多个NameNode里,互相没有交集。

那么客户端怎么知道要访问的数据该连接哪一个NameNode呢?这涉及到在多个NameNode之上增加一个抽象层的问题,由抽象层来确定到底该访问哪一个NameNode。

最新文章

  1. [JavaScript]JavaScript处理iframe的动作
  2. Merge compare columns when null
  3. Android 使用Okhttp/Retrofit持久化cookie的简便方式
  4. 多线程并发流程控制之dispatch_group 有关函数
  5. sqlserver监控阻塞(死锁)具体情况
  6. Zookeeper集群和HBase集群
  7. hdu 3473 裸的划分树
  8. js函数与变量同名
  9. padding与margin的差别
  10. [LeetCode] Search a 2D Matrix [25]
  11. perl 为什么要用引用来做对象呢?
  12. CSS盒模型和margin重叠
  13. Win7配置IIS7
  14. Oracle表导入Mysql方法
  15. Docker:容器的四种网络类型 [十三]
  16. fpc软排线焊接
  17. Spring之InstantiationAwareBeanPostProcessor接口介绍
  18. TiKV 源码解析系列文章(三)Prometheus(上)
  19. codeforces-1111
  20. 阅读c#程序——回答问题

热门文章

  1. NOIP模拟测试24「star way to hevaen·lost my music」
  2. JAVA实现按列表中元素的时间字段排序
  3. 玩转STM32MP157- 使用 u8g2 驱动 OLED 12864(SSD1306)
  4. 全新安装Windows版 Atlassian Confluence 7.3.1 + MySQL 8.0,迁移数据,并设置服务自启
  5. Solon 1.5.11 发布,增加国际化插件
  6. AcWing 1277. 维护序列
  7. promise的基本使用
  8. CentOS-Docker安装phpMyAdmin(MySQL的web客户端)
  9. buu RSA
  10. 职场人都该了解<荷花定律>