2021-03-11

17 篇文章 1 订阅
2 篇文章 0 订阅

2.2 线程模型

由上图可以看出,整个系统中有3类线程:

  1. 主线程:在启动所有服务后开始循环等待
  2. HealthMonitor线程:定期检查NN服务状态和健康状况,并在服务状态和健康状态发生变化时与ActiveStandbyElector交互完成HA过程
  3. zk客户端线程:监控zookeeper上结点的状态,发生变化时,回调ZKFailoverController的回调函数,通知ZKFailoverController,做出相应的变化

2.3 RPC代理对象

从上图可以看出,有3类RPC代理对象:

  1. proxy1:ZKFC对本节点NN健康检查

    超时时间:“ha.health-monitor.rpc-timeout.ms” 默认45s

    最大重试次数:“ipc.client.connect.max.retries”,在代码中被set为1,即失败后会重连一次

    重连间隔:“ipc.client.connect.retry.interval” 默认1s,在我们集群中设置为10s。

    和NN RPC通信地址:根据"dfs.namenode.lifeline.rpc-address.nsId.nnId"。如果没有指定该配置项,则和下面2、3的地址相同。

    *注:该配置项用于配置HM健康检查和Datanode上报心跳的地址,由另外的RPC handler而非main RPC handler处理,可应对负载过高,main RPC handler耗尽的场景。

  2. proxy2:ZKFC对另一个节点的NN fence

    超时时间:“ha.failover-controller.graceful-fence.rpc-timeout.ms” 默认5s

    最大重试次数:“ipc.client.connect.max.retries” 在代码中被set为1,即失败后会重连一次

    重连间隔:“ipc.client.connect.retry.interval” 默认1s,在我们集群中设置为10s。

    和NN RPC通信地址:先根据"dfs.namenode.servicerpc-address.nsId.nnId",没有再根据"dfs.namenode.rpc-address.nsId.nnId",若这些配置项中没有指定端口,则默认端口为8020。在我们的配置中已指定端口为9000。

  3. proxy3:ZKFC对本节点的NN转换状态(becomeActive/Standby)

    超时时间:“ha.failover-controller.new-active.rpc-timeout.ms” 默认60s

    最大重试次数:“ipc.client.connect.max.retries” 在代码中被set为1,即失败后会重连一次

    重连间隔:“ipc.client.connect.retry.interval” 默认1s,在我们集群中设置为10s。

    和NN RPC通信地址:先根据"dfs.namenode.servicerpc-address.nsId.nnId",没有再根据"dfs.namenode.rpc-address.nsId.nnId",若这些配置项中没有指定端口,则默认端口为8020。在我们的配置中已指定端口为9000。

2.4 正常HA切换流程

下面结合上图梳理启动时的状态切换流程:

  1. 启动后,两个NN都会进入Standby状态

  2. 两个ZKFC的HealthMonitor都检测到Namenod健康状态为SERVICE_HEALTHY,健康状态从INITIALIZING变为SERVICE_HEALTHY,状态改变,执行joinElection()方法加入选举。

  3. 两个ZKFC都会尝试创建锁节点,假设ZKFC1创建成功,ZKFC2创建失败

  4. ZKFC2所在节点NN状态维持Standby,在锁节点上注册watcher,监控锁节点状态

  5. ZKFC1检测到ActiveBreadCrumb节点不存在,不需要fence另一个NN;创建ActiveBreadCrumb节点;通过proxy3转换本节点NN状态为Active;在锁节点上注册watcher,监控锁节点状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
embedcpp-2021-03是一个有关嵌入式C++编程的课程,于2021年3月举办。嵌入式C++编程是指在嵌入式系统中使用C++编程语言进行开发的一种方法。 在嵌入式系统中,资源通常是有限的,例如处理器速度、内存容量和存储空间等。因此,使用C++编程语言可以提供更高的灵活性和效率,帮助开发人员充分利用有限的资源。C++在嵌入式系统中的应用范围广泛,例如物联网设备、汽车电子和工业自动化等领域。 embedcpp-2021-03课程旨在向学员介绍嵌入式C++编程的基础知识和技巧。课程内容通常包括以下方面: 1. C++语法和特性:介绍C++的基本语法、面向对象编程和泛型编程等概念,以及C++11、C++14和C++17的一些新特性。 2. 嵌入式系统概述:了解嵌入式系统的基本特点、硬件和软件组成,以及与传统桌面开发的区别。 3. 低级编程:学习如何与硬件交互,包括使用寄存器、配置外设和处理中断等。还可以介绍使用汇编语言优化性能的技巧。 4. 内存管理:探讨嵌入式系统中的内存管理技术,包括堆栈和堆的使用、动态内存分配和对象生命周期管理等。 5. 实时操作系统(RTOS):介绍嵌入式系统中常用的实时操作系统,如FreeRTOS和µC/OS等,学习如何使用RTOS进行任务调度和资源管理。 除了理论知识,embedcpp-2021-03课程通常还包括实际的项目练习,以帮助学员将所学知识应用于实际场景。通过该课程,学员可以了解嵌入式C++编程的基础概念和实践技巧,为嵌入式系统开发提供了一定的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值