KAFKA节点故障的容错方案

KAFKA节点故障的容错方案

  • 1. broker启动加载逻辑
    • 1.1 日志组成和分析
    • 1.2 snapshot文件
    • 1.3 broker启动流程
    • 1.4 LogManager的初始化和启动过程
  • 2. controller高可用
    • 1.1 选主逻辑
    • 1.2 HA切换
    • 1.3 controller的职责
  • 3. partition高可用
    • 3.1 ISR列表
    • 3.1 选举Leader
  • 4. 疑问和思考
    • 4.1 如果一个broker宕机,运行在broker上的partiton数据丢失,是否会自动做均衡?
  • 5. 参考文档

本文主要探讨kafka集群的高可用容错方案和容错能力的探讨。在出现单机故障时相关的容错方案。

更多关于分布式系统的架构思考请参考文档关于常见分布式组件高可用设计原理的理解和思考


1. broker启动加载逻辑

在kafka中,只有broker JVM进程,其余的组件或者角色都是通过broker衍生出来,因此broker的高可用和数据加载流程有必要理解和分析。

1.1 日志组成和分析

可以参考文章KAFKA高可用架构涉及常用功能整理,本文不再赘述。

1.2 snapshot文件

目前,Kafka对三类位移做checkpointing:

  • Log Start Offset
  • Recovery Point Offset
  • Replication Offset

Log Start Offset: 每个topic partition log对象都有一个重要的位移字段:log start offset,标识分区消息对外部用户或应用可见的最早消息位移。在一些事件发生时Kafka会触发对该值的更新。Kafka对该offset进行checkpointing的初衷是更快地保存分区的元数据,这样下次再初始化Log对象时能够直接加载并初始化log start offset。

Recovery Point Offset: 第二个是recovery point offset,它保存的是第一条未flush到磁盘的消息。Kafka对它进行checkpointing能够显著加速日志段恢复(recover)的速度,因为直接从recovery point offset所在的日志段开始恢复即可,没必要从头恢复日志段。毕竟生产环境上,分区下的日志段文件可能是非常多的。

Replication Offset: 保存replication过程中副本的高水位(HW)位移值。通常的场景是当副本重启回来后创建Log对象时直接使用这个文件中的offset对高水位对象进行赋值,省去了读取日志段自行计算HW值的步骤。

总之,checkpointing大体的作用都是将Kafka Broker端重要的日志元数据保存下来,避免需要通过扫描segment日志,计算获取相关元数据,从而提升恢复速度。

1.3 broker启动流程

broker启动后,整体的启动流程如下。

  1. 修改当前broker的状态为Starting
  2. 启动kafka内部调度器KafkaScheduler
  3. 初始化Zookeeper上的kafka基础目录
  4. 创建并启动日志管理对象LogManager
  5. 启动通信服务SocketServer
  6. 创建ReplicaManager管理对象
  7. 创建offset管理线程OffsetManager
  8. 创建KafkaController
  9. 启动请求处理线程,并修改broker的状态为RunningAsBroker
  10. 启动replicaManager服务
  11. 启动KafkaController,进行Controller选举
  12. 创建并启动TopicConfigManager对象
  13. 创建并启动心跳服务KafkaHealthcheck
  14. 注册动态统计到JMX
  15. 启动完成

整体启动流程中,最耗时的是步骤4,创建和启动LogManager后,会扫描和加载本地的日志文件,读取相关的数据索引信息,因此整个加载过程比较耗时。整个过程是串行执行,只有日志加载完成后,才能进行下一步的启动工作。

1.4 LogManager的初始化和启动过程

  1. 初始化 LogManger 代码有两个主要方法:
  • createAndValidateLogDirs():创建指定的数据目录,并做相应的检查: 1.确保数据目录中没有重复的数据目录、2.数据目录不存在的话就创建相应的目录;3. 检查每个目录路径是否是可读的;
  • loadLogs():加载所有的日志分区(先加载snapshot,在加载日志文件),而每个日志也会调用 loadSegments() 方法加载该分区所有的 segment 文件,过程比较慢,所以 LogManager 使用线程池的方式,为每个日志的加载都会创建一个单独的线程。整体耗时较长。
    在这里插入图片描述
  1. 启动LogManger后,主要在后台启动四个定时线程:
  • cleanupLogs:定时清理过期的日志 segment,并维护日志的大小(默认5min);
    f- lushDirtyLogs:定时刷新将还没有写到磁盘上日志刷新到磁盘(默认 无限大);
  • checkpointRecoveryPointOffsets:定时将所有数据目录所有日志的检查点写到检查点文件中(默认 60s);
  • deleteLogs:定时删除标记为 delete 的日志文件(默认 30s)。

2. controller高可用

controller的高可用和Leader是通过zk的临时锁实现的。

1.1 选主逻辑

在kafka集群启动的时候,会自动选举一台broker作为controller来管理整个集群,选举的过程是集群中每个broker都会尝试在zookeeper上创建一个 /controller 临时节点,zookeeper会保证有且仅有一个broker能创建成功,这个broker就会成为集群的总控器controller。

在这里插入图片描述

1.2 HA切换

当这个controller角色的broker宕机了,此时zookeeper临时节点会消失,集群里其他broker会一直监听这个临时节点,发现临时节点消失了,就竞争再次创建临时节点,就是我们上面说的选举机制,zookeeper又会保证有一个broker成为新的controller。

1.3 controller的职责

具备控制器身份的broker需要比其他普通的broker多一份职责,具体细节如下:

  • 监听broker相关的变化。为Zookeeper中的/brokers/ids/节点添加BrokerChangeListener,用来处理broker增减的变化。
  • 监听topic相关的变化。为Zookeeper中的/brokers/topics节点添加TopicChangeListener,用来处理topic增减的变化;为Zookeeper中的/admin/delete_topics节点添加TopicDeletionListener,用来处理删除topic的动作。
  • 从Zookeeper中读取获取当前所有与topic、partition以及broker有关的信息并进行相应的管理。对于所有topic所对应的Zookeeper中的/brokers/topics/[topic]节点添加PartitionModificationsListener,用来监听topic中的分区分配变化。
  • 更新集群的元数据信息,同步到其他普通的broker节点中。

所以所有的broker保存的元数据都是一致的,随时可以HA切换成为controller。

3. partition高可用

partition的高可用和Leader是通过controller来实现的。

3.1 ISR列表

副本进入ISR列表有两个条件:

  • 副本节点不能产生分区,必须能与zookeeper保持会话以及跟leader副本网络连通
  • 副本能复制leader上的所有写操作,并且不能落后太多。(与leader副本同步滞后的副本,是由 replica.lag.time.max.ms 配置决定的,超过这个时间都没有跟leader同步过的一次的副本会被移出ISR列表)

3.1 选举Leader

  1. controller感知到分区leader所在的broker异常(controller监听了很多zk节点可以感知到broker存活)
  2. controller会从ISR列表(参数unclean.leader.election.enable=false的前提下)里挑第一个broker作为leader(第一个broker最先放进ISR列表,可能是同步数据最多的副本)
  3. 如果参数unclean.leader.election.enable为true,代表在ISR列表里所有副本都挂了的时候可以在ISR列表以外的副本中选leader,这种设置,可以提高可用性,但是选出的新leader有可能数据少很多。

在这里插入图片描述

注明
unclean.leader.election.enable:是否启用不在ISR中的副本参与选举leader的最后的手段。这样做有可能丢失数据。

4. 疑问和思考

4.1 如果一个broker宕机,运行在broker上的partiton数据丢失,是否会自动做均衡?

不会,需要人工干预后才能修复。

kafka的数据机制是,对于每一个partition进行数据分配后,原则上不会再改动,因此不会重新分配一个Follower副本给这个paritition,并主动触发数据迁移。需要人工干预,重新分配Follower副本后,新的Follower主动向Leader获取消息,follower每次读取消息都会更新HW状态。具体操作可以参考 KAFKA高可用架构涉及常用功能整理中的《3.2.3 topic的partition扩、缩容、数据均衡》章节。

5. 参考文档

  • Kafka 源码解析之日志管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/442220.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux实验记录:使用firewalld

前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

分布式事务的概述及其解决方案

分布式事务 本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 其中,隔离性的隔离级别: 脏读: ReadUnCommited(读未提交) 并发的线程读取到其他线…

【笔记】React-Native跟Android交互--简单示例

/** * 使用命令 npx react-nativelatest init DemoRN创建项目 * * "react": "18.2.0", * "react-native": "0.73.2" * * 官网有详细教程:https://reactnative.dev/docs/native-modules-android */ 一、RN invoke androi…

Android Studio 安装配置教程 - Windows版

Android Studio下载 安装: 下载: Android Studio Hedgehog | 2023.1.1 | Android Developers (google.cn) 安装: 基本不需要思考跟着走 默认下一步 默认下一步 自定义修改路径,下一步 默认下一步,不勾选 默认下一…

中移(苏州)软件技术有限公司面试问题与解答(5)—— Linux进程调度参数调优是如何通过代码实际完成的1

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文对于中移(苏州)软件技术有限公司面试问题中的“(11)Linux进程调度参数调优是如…

【lesson26】学习MySQL事务前的基础知识

文章目录 CURD不加控制,会有什么问题?CURD满足什么属性,能解决上述问题?什么是事务?为什么会出现事务事务的版本支持 CURD不加控制,会有什么问题? CURD满足什么属性,能解决上述问题&…

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时,项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题,在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料,以为是浏览器访问权限或者是https什么证…

Python如何递归删除空文件夹

嗨喽,大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹,这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题,其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…

使用.NET6 Avalonia开发跨平台三维应用

本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD Rapid AvaloniaUI三维控件的过程。 0 初始化环境 安装Avalonia.Templates dotnet new install Avalonia.Templates若之前安装过可忽略此步骤。 1 创建项目 选择创建AvaloniaUI项目 选一下.NET6版本和Avalonia版…

深入理解二叉树:遍历、构建与性质探索的代码实现

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构冒险记 ✅C语言进阶之路 🌅 有航道的人,再渺小也不会迷途。 文章目录 前言一、二叉树的存储结构二、二叉树链式结构的实现三、二叉树的前、中、后续遍历&…

银行数据仓库体系实践(10)--汇总指标层和集市模型设计

建立多层次的数据访问服务体系,有力提升数据仓库的价值。基于指标汇总层、集市层、可以提供面向业务人员的即席数据查询、以及面向应用开发者的数据接口、应用访问接口,满足不同类型应用的需要。 1、汇总指标层模型设计原则及步骤 1.1建设目标&#xff…

Servlet过滤器个监听器

过滤器和监听器 过滤器 什么是过滤器 当浏览器向服务器发送请求的时候,过滤器可以将请求拦截下来,完成一些特殊的功能,比如:编码设置、权限校验、日志记录等。 过滤器执行流程 Filter实例 package com.by.servlet;import jav…