转载请注明出处:

  最近在做集群高可用验证的时候,遇到了一个kafka 副本集高可用的问题,在这里分析总结一下。

  当前的部署情况是kafka集群有三个节点;在做集群高可用验证的时候,先shutdown一个服务器实例之后,再验证服务相关的高可用,当shutdown一个实例之后,发现kafka 有的topic可以正常发送和接收消息,而有的topic 却不能。

  报错的关键日志:

org.apache.kafka.common.errors.TimeoutException: Expiring 53 record(s) for TWAMP_LINK_TOPIC-0: 120000 ms has passed since batch creation

  再经过层层排查之后,通过以下命令,找到了关键点。

kafka-run-class kafka.admin.TopicCommand --describe --topic TUNNEL_STATE_TOPIC --bootstrap-server kafka2:9092

  注意将 --topic 之后的topic 换成不同的topic进行查看,具体显示如下:

根据提供的两个Topic的描述信息,可以得出以下结论:

主题名 (Topic) 状态 分区 副本因子 Leader 副本位置 ISR 诊断结果
TWAMP_LINK_TOPIC 严重故障 0 1 none 3 3 完全不可用。因唯一副本在Broker 3上,且Broker 3已宕机。
TUNNEL_STATE_TOPIC 脆弱但可用 0 1 1 1 1 当前可用,但处于高风险中。因唯一副本在Broker 1上。

再切换了之后,发现有的topic 存在正常的leader、 而有的topic 却不存在leader。 而kafka 发送消息是通过leader去发送的,没有leader就会异常。

输出结果详解:

第一行:Topic 级别的概要信息

Topic: TWAMP_LINK_TOPIC TopicId: iw-DWE9jSBKsxT7NJwQBzQ PartitionCount: 1 ReplicationFactor: 1 Configs:
参数 解释
Topic: TWAMP_LINK_TOPIC Topic的名称,由用户或应用程序创建时指定。
TopicId: iw-DWE9jSBKsxT7NJwQBzQ Topic的唯一内部标识符。在Kafka集群内部,TopicId比Topic名称更常用,因为它不会因Topic重命名而改变。这是一个由Kafka自动生成的唯一字符串。
PartitionCount: 1 该Topic的分区总数。分区是Kafka实现水平扩展和并行处理的基础单元。1表示所有数据都写入同一个分区,这可能会成为性能瓶颈。
ReplicationFactor: 1 副本因子。这是当前最关键、最不健康的参数。它表示Topic的每个分区数据有多少个副本。1意味着数据没有冗余,只在集群中的一台Broker上存了一份。这是生产环境的反模式,没有任何容错能力。
Configs: (空) 显示该Topic级别的自定义配置(会覆盖Broker的全局默认配置)。例如retention.ms(数据保留时间)、cleanup.policy(清理策略)等。这里是空的,表示全部使用集群默认配置。

第二行:分区级别的详细信息

Topic: TWAMP_LINK_TOPIC Partition: 0 Leader: none Replicas: 3 Isr: 3
参数 解释
Topic: TWAMP_LINK_TOPIC 分区所属的Topic名称。
Partition: 0 分区编号。由于PartitionCount: 1,所以只有一个分区,编号从0开始。
Leader: none 这是最直接的故障表现! 表示这个分区的领导者副本。所有客户端的读写请求都必须发往Leader副本。
none 意味着当前没有可用的Leader。因为唯一的副本(在Broker 3上)已经宕机,导致无法进行读写操作,从而引发 TimeoutException
Replicas: 3 副本列表。列出了存放这个分区数据的所有Broker的ID。
重要:这里的 3 是Broker的编号,不是数量! 它的含义是:“这个分区的所有副本(因为ReplicationFactor: 1,所以其实就一个副本)存放在ID为3的Broker上。”
如果ReplicationFactor是3,这里可能会显示 Replicas: 1,2,3
Isr: 3 同步副本集(In-Sync Replicas)。这是一个动态列表,包含了当前所有与Leader副本保持同步的副本所在的Broker ID。
在健康状态下,Isr 列表应该和 Replicas 列表一致(例如 Replicas: 1,2,3 和 Isr: 1,2,3)。
这里的 3 表示:同步副本集中唯一的成员是Broker 3。 但因为Broker 3宕机了,这个信息是“最后已知的良好状态”,实际上它已经不同步了,很快就会从ISR中被控制器移除。

此处需要注意两个配置容易误解:

  1. ReplicationFactor: 1 (副本因子:1)

    • 这是最重要的配置!它意味着Kafka只会为这个分区的数据创建1个副本。这是数据的冗余度,决定了容错能力。

    • 1 表示 “没有冗余”。就像只把文件打印了一份。

  2. Replicas: 3 (副本所在Broker ID:3)

    • 这个字段只是告诉你:那唯一的一个副本,被放置在了Broker ID 为 3 的服务器上。

    • 它不是说有三个副本。这里的 3 是一个Broker编号,不是数量。

    • 如果把 Replicas: 3 换成 Replicas: 1,意思就是那唯一的一个副本在Broker 1上。

解决方法:

  重新创建topic,并设置topic的副本因子的数量大于1;从而保证高可用

kafka-topics.sh --create --topic TWAMP_LINK_TOPIC \
--partitions 1 \
--replication-factor 3 \ # 关键!必须设置为 3,为每个分区创建3个副本
--bootstrap-server kafka1:9092

kafka 副本集设置和理解的更多相关文章

  1. mongodb replica set(副本集)设置步骤

    网上已经有一大堆的设置步骤的了,根据我遇到的问题,整理一下,如下: 首先先去下载一个mongodb最新版,目前最新版应该是2.6 cd /usr/local/bin wget http://fastd ...

  2. mongo副本集设置主库权重,永远为主

    mongo副本集设置主库权重,即使主库宕机了再重启也还是主库. cfg = rs.conf()     ------->(查看序列)cfg.members[0].priority = 1 (设置 ...

  3. MongoDB 副本集的相关概念【转】

    一.副本集基本概念 副本集(replica set) MongoDB的replica set是一个mongod进程实例簇,数据在这个簇中相互复制,并自动进行故障切换. MongoDB的数据库复制增加了 ...

  4. Mongodb主从复制/ 副本集/分片集群介绍

    前面的文章介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 Master-Slave 模式(主从复制),一种是 Replica Sets 模式(副本集). Mong ...

  5. Mongodb主从复制 及 副本集+分片集群梳理

    转载努力哥原文,原文连接https://www.cnblogs.com/nulige/p/7613721.html 介绍了Mongodb的安装使用,在 MongoDB 中,有两种数据冗余方式,一种 是 ...

  6. mongo副本集搭建及服务器复用方案

    比较常见的mongodb副本集搭建是有:常规节点.数据副本.仲裁节点组成,也就是需要三台服务器组建.常规节点即数据的主存储节点,数据副本是主存储节点的从属节点,它定期去主节点获取更新日志来更新自己.仲 ...

  7. MongoDB 复制(副本集)

    MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...

  8. 知其所以然~mongodb副本集

    MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您 ...

  9. MongoDB 3.6.9 集群搭建 - 切片+副本集

    1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...

  10. MongoDB4.0 WINDOWS环境下 副本集、分片部署

    部署开始: 创建路径 D:\Program Files\MongoDB\MySet下 config Data log 文件夹 config文件夹下准备配置文件: 分片1的副本集1 storage: d ...

随机推荐

  1. Python中的cls变量

    技术背景 在Python的类型设计中,有时候会遇到一个cls参数.其实cls参数就是一个约定俗成的名称,用其他的名字也能正常运行但不建议这么用.它的作用类似于实例方法中的self参数,代表的是类本身, ...

  2. C语言基础算法

    C语言基础算法 目录 C语言基础算法 1.阶乘 递归实现 循环实现 2.排序 冒泡排序 选择排序 3.斐波那契数列 4.ASCII码的使用 1.阶乘 递归实现 #include <stdio.h ...

  3. C++面试题:虚函数表(vtable)的底层实现机制与应用解析

    一.问题描述 ​请描述C++虚函数表的实现原理,并解释以下问题​: 虚函数表在内存中的存储位置及布局结构 多继承场景下虚函数表的组织形式 虚函数调用时的动态绑定过程 虚析构函数与虚函数表的关系 二.核 ...

  4. 在SpringCloud中的相关报错

    在SpringCloud中使用REST服务时 使用前需要先在配置类中注入RestTemplate的Bean 然后再使用 自动装配即可 @Autowired private RestTemplate r ...

  5. 做stm32嵌入式的上限是做什么?薪资天花板是多少?

    作为一个在嵌入式领域摸爬滚打了近10年的老兵,看到这个问题时我的内心五味杂陈.说实话,当年24岁刚从机械专业被调剂到电子专业开始接触STM32的时候,我也曾经无数次地问过自己这个问题:做嵌入式到底能走 ...

  6. golang+vue3开发的一个im应用

    这是一個开源的前后端分离的IM网页应用. 简单的功能 支持微博登录 端对端消息推送.图片发送.表情包 语音功能 视频功能 支持离线消息推送 创建群聊 群聊消息推送 好友功能 响应式的前端界面支持pc与 ...

  7. nginx反向代理,负载均衡和yeauty集成的websocket的使用

    被要求一个这样的需求:要求项目和websocket使用一个端口.经过一周激烈争论,领导终于同意可以可以开通一个端口,一个月了,端口还没有开. 正式环境已经通过此方法进行部署,没有问题. 前言 因涉及到 ...

  8. 将本地的jar包加到maven中,pom添加依赖

    开发过程中经常遇到需要用某些http://maven.apache.org/中没有的jar包,这个时候可以用maven命令自己添加 通常这些jar包可以从其官网下载下来,然后用maven明天添加此ja ...

  9. batocera添加游戏

    进入batocera系统之后,会发现就只有几个不懂什么东西的模拟器,或者FC和其它,好象没有发现可以用NS或者其它的模拟器,在此说明 一下: 整个系统至少支持73个以上模拟器,主界面没有仅因为你没有放 ...

  10. centos8 yum替换阿里源

    解决centos7使用yum安装mysql 下载速度慢的问题 挺好用的,之前用腾讯云安装了半天,太慢了,改过之后速度快多了. 1.首先备份系统自带yum源配置文件/etc/yum.repos.d/Ce ...