大白话八股文-Kafka

一.Kafka的系统架构

如上图所示,Kafka由Producer、Broker、Consumer 以及负责集群管理的 ZooKeeper 组成,各部分功能如下:

  • Producer:生产者,负责消息的创建并通过一定的路由策略发送消息到合适的 Broker
  • Broker:服务实例,负责消息的持久化、中转等功能;
  • Consumer:消费者,负责从 Broker 中拉取(Pull)订阅的消息并进行消费,通常多个消费者构成一个分组,消息只能被同组中的一个消费者消费;
  • ZooKeeper:负责 broker、consumer 集群元数据的管理等;

上图消息流转过程中,还有几个特别重要的概念—主题(Topic)、分区(Partition)、分段(segment)、位移(offset)。

  • topic:消息主题。Kafka 按 topic 对消息进行分类,我们在收发消息时只需指定 topic。
  • partition:分区。为了提升系统的吞吐,一个 topic 下通常有多个 partition,partition 分布在不同的 Broker 上,用于存储 topic 的消息,这使 Kafka 可以在多台机器上处理、存储消息,给 kafka 提供给了并行的消息处理能力和横向扩容能力。另外,为了提升系统的可靠性,partition 通常会分组,且每组有一个主 partition、多个副本 partition,且分布在不同的 broker 上,从而起到容灾的作用。
  • segment:分段。宏观上看,一个 partition 对应一个日志(Log)。由于生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据检索效率低下,Kafka 采取了分段和索引机制,将每个 partition 分为多个 segment,同时也便于消息的维护和清理。每个 segment 包含一个 .log 日志文件、两个索引(.index、timeindex)文件以及其他可能的文件。每个 Segment 的数据文件以该段中最小的 offset 为文件名,当查找 offset 的 Message 的时候,通过二分查找快找到 Message 所处于的 Segment 中。
  • offset:消息在日志中的位置,消息在被追加到分区日志文件的时候都会分配一个特定的偏移量。offset 是消息在分区中的唯一标识,是一个单调递增且不变的值。Kafka 通过它来保证消息在分区内的顺序性,不过 offset 并不跨越分区,也就是说,Kafka 保证的是分区有序而不是主题有序。

二.Kafka的高可靠性(不丢失)

Kafka 高可靠性的核心是保证消息在传递过程中不丢失,涉及如下核心环节:

  1. 消息从生产者可靠地发送至 Broker;-- 网络、本地丢数据。
  2. 发送到 Broker 的消息可靠持久化;-- PageCache 缓存落盘、单点崩溃、主从同步跨网络
  3. 消费者从 Broker 消费到消息且最好只消费一次 -- 跨网络消息传输。

如何保障消息从生产者可靠地发送至 Broker

Producer 发送消息后,能够收到来自 Broker 的消息保存成功 ack;

  • Request.required.acks = 0:请求发送即认为成功,不关心有没有写成功,常用于日志进行分析场景。
  • Request.required.acks = 1:当 leader partition 写入成功以后,才算写入成功,有丢数据的可能。
  • Request.required.acks= -1:ISR 列表里面的所有副本都写完以后,这条消息才算写入成功,强可靠性保证。

        为了实现强可靠的 kafka 系统,我们需要设置 Request.required.acks= -1,同时还会设置集群中处于正常同步状态的副本 follower 数量 min.insync.replicas>2,另外,设置 unclean.leader.election.enable=false 使得集群中 ISR 的 follower 才可变成新的 leader,避免特殊情况下消息截断的出现。

三.Kafka的消息持久化

为了确保 Producer 收到 Broker 的成功 ack 后,消息一定不在 Broker 环节丢失,我们核心要关注以下几点:

  • Broker 返回 Producer 成功 ack 时,消息是否已经落盘;
  • Broker 宕机是否会导致数据丢失,容灾机制是什么;
  • Replica 副本机制带来的多副本间数据同步一致性问题如何解决;

Broker 异步刷盘机制

        kafka 为了获得更高吞吐,Broker 接收到消息后只是将数据写入 PageCache 后便认为消息已写入成功,而 PageCache 中的数据通过 linux 的 flusher 程序进行异步刷盘(刷盘触发条:主动调用 sync 或 fsync 函数、可用内存低于阀值、dirty data 时间达到阀值),将数据顺序写到磁盘。由于消息是写入到 PageCache ,单机场景,如果还没刷盘 Broker 就宕机了,那么 Producer 产生的这部分数据就可能丢失。为了解决单机故障可能带来的数据丢失问题,Kafka 为分区引入了副本机制。

Replica 副本机制

        Kafka 每组分区通常有多个副本,同组分区的不同副本分布在不同的 Broker 上,保存相同的消息(可能有滞后)。副本之间是“一主多从”的关系,其中 leader 副本负责处理读写请求,follower 副本负责从 leader 拉取消息进行同步。分区的所有副本统称为 AR(Assigned Replicas),其中所有与 leader 副本保持一定同步的副本(包括 leader 副本在内)组成ISR(In-Sync Replicas),与 leader 同步滞后过多的副本组成 OSR(Out-of-Sync Replicas),由此可见,AR=ISR+OSR。follower 副本是否与leader同步的判断标准取决于 Broker 端参数 replica.lag.time.max.ms(默认为10秒),follower 默认每隔 500ms 向 leader fetch 一次数据,只要一个 Follower 副本落后 Leader 副本的时间不连续超过10秒,那么 Kafka 就认为该 Follower 副本与 leader 是同步的。在正常情况下,所有的 follower 副本都应该与 leader 副本保持一定程度的同步,即 AR=ISR,OSR 集合为空。

        当 leader 副本所在 Broker 宕机时,Kafka 会借助 ZK 从 follower 副本中选举新的 leader 继续对外提供服务,实现故障的自动转移,保证服务可用。为了使选举的新 leader 和旧 leader 数据尽可能一致,当 leader 副本发生故障时,默认情况下只有在 ISR 集合中的副本才有资格被选举为新的 leader,而在 OSR 集合中的副本则没有任何机会(可通过设置un

### MQ-2烟雾传感器的工作原理通俗解释 MQ-2烟雾传感器是一种基于气敏电阻的气体检测设备,其核心是通过检测特定气体对传感器阻值的影响来判断气体浓度。以下是对该传感器工作原理的详细说明: #### 1. 基本结构与材料 MQ-2烟雾传感器的核心部件是一个气敏电阻,通常由氧化锡(SnO₂)等半导体材料制成。在正常空气中,这种材料具有较高的电阻值。当接触到可燃气体或烟雾时,其电阻值会发生变化[^1]。 #### 2. 工作机制 传感器的工作机制基于气体吸附和脱附过程: - 在加热元件的作用下,传感器表面温度升高,使得气敏材料能够更有效地吸附气体分子。 - 当气体分子(如一氧化碳、甲烷、液化气等)接触到气敏材料时,会发生化学反应,改变材料的导电性能。 - 对于还原性气体(如CO、CH₄等),它们会在气敏材料表面发生氧化反应,从而降低材料的电阻值。 - 反之,在气体浓度下降时,气敏材料表面的气体分子逐渐脱附,电阻值恢复到初始状态。 #### 3. 信号输出 MQ-2传感器提供两种类型的输出: - **模拟输出**:通过内置的分压电路,将气敏电阻的变化转化为电压信号,供外部设备(如MCU的ADC模块)采集。需要注意的是,直接从ADC读取的数值并不直接等于气体浓度,而是需要经过校准和计算才能得到实际浓度[^1]。 - **数字输出**:部分型号的MQ-2传感器带有比较器电路,当气体浓度超过预设阈值时,会输出一个高低电平信号。 #### 4. 校准与计算 为了准确测量气体浓度,需要对传感器进行校准: - 使用标准气体(如一定浓度的一氧化碳)标定传感器的灵敏度。 - 根据厂商提供的公式或实验数据,建立电压与气体浓度之间的关系曲线。 - 在实际应用中,通过采集ADC值并代入校准公式,可以计算出气体浓度。 ```python # 示例代码:计算气体浓度 def calculate_gas_concentration(voltage, sensitivity): # 根据传感器手册中的校准公式计算浓度 concentration = (voltage / sensitivity) * 1000 # 示例公式 return concentration ``` #### 5. 注意事项 - MQ-2传感器的响应速度较慢,通常需要几分钟才能达到稳定状态。 - 加热元件的功耗较高,需确保电源能够稳定供电。 - 环境因素(如温度、湿度)可能影响传感器的准确性,因此需要进行补偿处理。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值