Kafka(七)可靠性

目录

  • 1 可靠的数据传递
    • 1.1 Kafka的可靠性保证
    • 1.2 复制
    • 1.3 Broker配置
      • 1.3.1 复制系数
      • 1.3.2 broker的位置分布
      • 1.3.3 不彻底的首领选举
      • 1.3.4 最少同步副本
      • 1.3.5 保持副本同步
      • 1.3.6 持久化到磁盘
    • 1.2 在可靠的系统中使用生产者
      • 1.2.1 根据需求配置恰当的acks
      • 1.2.2 配置重试参数
      • 1.2.3 处理不可重试错误
    • 1.3 在可靠的系统中使用消费者
      • 1.3.1 消费者的可靠性配置
      • 1.3.2 自动提交偏移量
      • 1.3.3 手动提交偏移量
        • 1. 总是在处理完消息后提交偏移量
        • 2. 提交频率时性能和重复消息数量之间的权衡
        • 3. 在正确的时间点提交正确的偏移量
        • 4. 消费者再均衡
        • 5. 消费者重试
        • 6. 消费者可能需要维护状态
    • 1.4 验证系统可靠性
      • 1.4.1 验证配置
      • 1.4.2 验证应用程序
    • 1.5 监控系统可靠性
  • 2 精确一次性语义

1 可靠的数据传递

1.1 Kafka的可靠性保证

  1. 分区中的消息时有序的
  2. 一条消息只有被写入分区所有的同步副本时才被认为是“已提交”
  3. 只要还有一个副本是活动的,已提交的消息就不会丢失
  4. 消费者只能读取已提交的消息

1.2 复制

同步副本需满足的条件:

  1. 与ZooKeeper之间有一个活跃的会话,在过去的6秒内向ZooKeeper发送过消息
  2. 在过去的10秒内从首领那里复制过消息
  3. 在过去的10秒内从首领那里复制过最新消息

1.3 Broker配置

1.3.1 复制系数

broker级别配置:default.replication.factor=1
topic级别配置:replication.factor=1
建议非关键数据小于3

1.3.2 broker的位置分布

建议把broker分布在多个不同的机器上

1.3.3 不彻底的首领选举

unclean.leader.election.enable=false
指示是否启用非同步副本可以被选为首领,作为首领选举的最后手段,即使这样做可能会导致数据丢失

1.3.4 最少同步副本

min.insync.replicas=1
最小同步副本数。min.insync.replicas(默认值为1)代表了正常写入生产者数据所需要的最少ISR个数, 当ISR中的副本数量小于min.insync.replicas时,Leader停止写入生产者生产的消息,并向生产者抛出NotEnoughReplicas异常,阻塞等待更多的 Follower 赶上并重新进入ISR, 因此能够容忍min.insync.replicas-1个副本同时宕机。当与min.insync.replicas和acks一起使用时,可以实现更大的耐用性保证。一个典型的场景是创建一个复制因子为3的主题,将min.insync.replicas设置为2,并使用acks “all”进行生产。

1.3.5 保持副本同步

replica.lag.time.max.ms=30000 (30 seconds)
如果一个follower这段时间内没有发送任何fetch请求,或者没有消费leader最新偏移量的消息,那么leader将从isr中删除该follower。
zookeeper.session.timeout.ms=18000 (18 seconds)
允许broker不向ZooKeeper发送心跳的时间间隔。如果超过这个时间不向ZK发送心跳,ZK会认为broker已经死亡,会将其移除出集群。

1.3.6 持久化到磁盘

Kafka会在重启之前和关闭日志片段的时候将消息冲刷到磁盘上,或者等Linux系统页面缓存被填满时冲刷。拥有不同机架上的副本的多个磁盘比只写入首领磁盘更加安全。不过,也可以让broker更频繁的写入磁盘。
flush.messages=9223372036854775807
此设置允许指定一个间隔,在该间隔,我们将强制对写入日志的数据进行fsync。例如,如果将其设置为1,我们将在每条消息之后进行fsync;如果是5,我们将在每5条消息之后进行fsync。通常,我们建议您不要设置此项,并使用复制以提高耐用性,并允许操作系统的后台刷新功能,因为它更高效。此设置可以在每个主题的基础上覆盖(请参阅每个主题配置部分)。
flush.ms=9223372036854775807
此设置允许指定一个时间间隔,在该时间间隔内,我们将强制对写入日志的数据进行fsync。例如,如果将其设置为1000,我们将在1000毫秒后进行fsync。通常,我们建议您不要设置此项,并使用复制以提高耐用性,并允许操作系统的后台刷新功能,因为它更高效。

1.2 在可靠的系统中使用生产者

1.2.1 根据需求配置恰当的acks

acks参数指定了生产者在多少个分区副本收到消息的情况下才会认为消息写入成功。允许以下设置:
acks=0。如果设置为零,则生产者根本不会等待来自服务器的任何确认。该记录将立即添加到套接字缓冲区,并被视为已发送。在这种情况下,无法保证服务器已收到记录,重试配置也不会生效(因为客户端通常不会知道任何故障)。为每条记录返回的偏移量将始终设置为-1。
acks=1。表示只要首领收到消息,并将记录成功写入其本地日志,就返回成功响应,不等待所有追随者的确认。在这种情况下,如果首领在确认成功后,追随者复制之前崩溃,则记录将会丢失。
acks=all。表示首领将等待同步复制集合中所有的副本都确认收到了记录。这保证了只要至少有一个同步复制副本保持活动状态,记录就不会丢失。这是最有力的保证。这相当于acks=-1的设置。
请注意,启用幂等性要求此配置值为“all”。如果设置了冲突的配置并且没有显式启用幂等性,则会禁用幂等性。

1.2.2 配置重试参数

设置自动重试,并使用默认重试次数。
将delivery.timeout.ms设置成愿意等待的时长,生产者会在这段时间内重试。

1.2.3 处理不可重试错误

例如:

  1. 不可重试的broker错误:消息大小,身份验证
  2. 在将消息发送给broker之前发生的错误,比如序列化错误
  3. 在生产者道道重试次数上限或重试消息占用的内存达到上限时发生的错误
  4. 超时

1.3 在可靠的系统中使用消费者

1.3.1 消费者的可靠性配置

group.id
auto.offset.reset

1.3.2 自动提交偏移量

如果所有的处理逻辑都是在轮询里进行的,并且不需要维护轮询之间的状态(比如为了聚合数据),那么就很简单,可以使用自动提交,在轮询结束时提交偏移量。
enable.auto.commit
无法控制应用应用程序可能重复处理的消息的数量
如果应用程序把消息交给另一个后台线程处理,那么只能使用手动提交了
auto.commit.interval.ms
自动提交的频率过大,会增加重复的概率;过小,会增加额外开销

1.3.3 手动提交偏移量

手动提交偏移量增加了灵活性,但也增加了复杂度并且有可能对性能产生影响,所以可能需要考虑如下事项:

1. 总是在处理完消息后提交偏移量

如果所有的处理逻辑都是在轮询里进行的,就很简单,选择一个合适的提交频率;
如果涉及额外线程,该如何呢?

2. 提交频率时性能和重复消息数量之间的权衡
3. 在正确的时间点提交正确的偏移量

一定要在处理完后在提交偏移量

4. 消费者再均衡

如何在分区被撤销之前提交偏移量;
如何在应用程序被分配到新分区并清理状态时提交偏移量

5. 消费者重试

如果遇到批次中的部分消息需要稍后处理。因为消费者不能针对每一条消息提交偏移量,而是提交最后一条成功的偏移量,所以需要借助额外的工具来处理。
有两种模式来解决这个问题:

  1. 在遇到可重试错误时,提交最后一条处理成功的消息的偏移量,然后把还未处理好的消息保存到缓冲区(这样下一个轮询就不会把他们覆盖掉),并调用消费者的pause()方法,确保其他轮询不会返回数据,之后继续处理缓冲区里的消息。
  2. 在遇到可重试错误时,把消息写到另一个重试主题,并继续处理其他消息。另一个消费者群组负责处理重试主题中的消息,或者让一个消费者同时订阅主主题和重试主题。这种模式有点像其他消息系统中的死信队列。
6. 消费者可能需要维护状态

1.在提交偏移量的同时,状态存入另一个主题中,可以开启事务来保证一致性。当一个线程重新启动时,就可以读取状态和从偏移量处读取消息。
2. 使用流式处理框架

1.4 验证系统可靠性

1.4.1 验证配置

测试场景:

  • 首领选举
  • 控制器选举
  • 滚动重启
  • 不彻底的首领选举

1.4.2 验证应用程序

测试场景:

  • 客户端与服务器断开连接
  • 客户端与服务器之间存在高延迟
  • 磁盘被填满
  • 磁盘被挂起
  • 首领选举
  • 滚动重启broker
  • 滚动启动消费者
  • 滚动重启生产者

1.5 监控系统可靠性

生产者:

  • 错误率
  • 重试率

消费者:

  • 消费者滞后

broker:

  • kafka.server:type=BrokerTopicMetrics,name=FailedProduce-RequestsPerSec
  • kafka.server:type=BrokerTopicMetrics,name=FailedFetch-RequestsPerSec

2 精确一次性语义

To be continued …

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

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

相关文章

视频智能分析支持摄像头异常位移检测,监测摄像机异常位移变化,保障监控状态

我们经常在生产场景中会遇到摄像头经过风吹日晒,或者异常的触碰,导致了角度或者位置的变化,这种情况下,如果不及时做出调整,会导致原本的监控条件被破坏,发生事件需要追溯的时候,查不到对应位置…

找到字符串中所有字母异位词【滑动窗口】

Problem: 438. 找到字符串中所有字母异位词 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 主要需要注意s长度可能比p短 复杂度 时间复杂度: 添加时间复杂度, 示例: O ( 26 n ) O(26n) O(26n) 空间复杂度: 添加空间复杂度, 示例: O ( …

Camtasia2024苹果Mac电脑版(屏幕录制剪辑软件)

Camtasia Mac2024免费版是一款由TechSmith公司官方进行汉化推出的最新版本,借助Camtasia,您可以轻松记录屏幕并创建优美,专业的视频。记录所有内容-您的整个屏幕或只是一个窗口。或者,添加您已经拥有的视频,图像&#…

第十三章 接口测试(笔记)

一、接口测试分类 内部接口:测试被测系统各个子模块之间的接口,或者被测系统提供给内部系统使用的接口 外部接口: 1.被测系统调用外部的接口 2.系统对外提供的接口 接口测试重点:检查接口参数传递的正确性,接口功能的…

java数据结构与算法刷题-----LeetCode303. 区域和检索 - 数组不可变

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

Chunjun纯钧(Flinkx)同步任务开发通用配置参数详解

Chunjun纯钧(Flinkx)是一款稳定、易用、高效、批流一体的数据集成框架,目前基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算,支持JSON模版配置任务,兼容FlinkSQL语法。本文对chunjun同步任务的配置文件进行详细的介绍和总结。 文章目录 配置文件结构详解Conte…

HackTheBox - Medium - Linux - Ambassador

Ambassador Ambassador 是一台中等难度的 Linux 机器,用于解决硬编码的明文凭据留在旧版本代码中的问题。首先,“Grafana”CVE (“CVE-2021-43798”) 用于读取目标上的任意文件。在研究了服务的常见配置方式后,将在其…

2023「总结」,2024「展望」

前言 时光荏苒,岁月如梭,转眼已经进入2024年了。回想过去的2023年,成长了很多,有收获,有付出,也有一丝丝的遗憾。   其实在写这篇文章之前我思考了很久,一直不知如何下手,也许这是…

el-select显示不全

css代码: .el-select-dropdown__wrap.el-scrollbar__wrap {margin-bottom: 0 !important; }

nodejs 实现内部之间接口的相互调用

ChatGPT4.0国内站点:海鲸AI 在 Node.js 中调用服务内的接口,通常是指发起 HTTP 请求到某个服务的 API 端点。这可以通过 Node.js 的内置 http 模块来实现,或者使用第三方库如 axios、request(已被弃用)、node-fetch 等…

Redis 常见的几种数据结构说一下?各自的使用场景?

文章目录 Redis 常见的几种数据结构说一下?各自的使用场景?stringlisthashsorted setbitmap使用场景: Redis 常见的几种数据结构说一下?各自的使用场景? string 介绍:string 数据结构是简单的 key-value …

机器学习笔记 - 用于语义图像分割的空洞卷积DeepLabv3

一、什么是DeepLabv3? DeepLabv3 是用于语义分割任务的深度神经网络 (DNN) 架构。虽然不是比较新的网络模型,但是也是分割模型里的杰出代表之一,所以还是值得深入了解。 它使用Atrous(Dilated)卷积来控制感受野和特征图…

lucky_number.exe逆向

使用IDA打开lucky_number.exe 在IDA view中找到包含flag的信息。 点击F5进入源码 可以看到程序输入的数据会经过凯撒密码加密后进行与变量aHv1g1gM0ifTzou比较判断。 双击进入这个变量,可以找到比较的字符串Hv1g_1g_M0if_Tzou_v4v4v 知道了加密算法是凯撒加密,我们就可以…

20240106-算术切片 II - 子序列

题目要求 给定一个整数数组 nums,返回 nums 的所有算术子序列的个数。 如果一个数字序列至少由三个元素组成,且任意两个连续元素之间的差值相同,则该序列称为算术序列。 例如,[1, 3, 5, 7, 9]、[7, 7, 7]和[3, -1, -5, -9]都是…

机器学习(四) -- 模型评估(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 机器学习(四) -- 模型评估…

小家电type-c接口PD诱骗

小家电Type-C接口PD诱骗:未来充电的便捷与安全 随着科技的不断发展,Type-C接口已经成为了许多小家电产品的标配。而PD(Power Delivery)诱骗技术,作为一种新兴的充电技术,更是为小家电产品的充电带来了前所…

MySQL学习笔记1: 数据库的简单介绍

目录 1. 数据库是什么2. 数据库这一类软件中的一些典型代表2.1. Oracle2.2. MySQL2.3. SQL Server2.4. SQLite (lite 轻量版) 3. 数据库的类型3.1. 关系型数据库3.2. 非关系型数据库 4. 总结 1. 数据库是什么 数据库是一类软件,这一类软件可以用来管理数据&#xf…

Freemarker实现Html全站静态化

全站静态化 在大型网站中,比如主流电商商品页,访问者看到的页面基本上是静态页面。为什么都要把页面静态化呢?其实把页面静态化,好处有很多。例如:访问速度快,更有利于搜索引擎收录等。 目前主流的静态化…

复旦MBA :在多元共融中,探寻可持续发展和创新的魅力

复旦MBA的课堂从来不只在复旦校园:从中国到全球,从教室到企业,从每年Global Immersion Program(简称GIP)的美国耶鲁及MIT、UC Berkeley 、英国伦敦商学院、西班牙ESADE商学院、新加坡国立大学、韩国高丽大学等名校寒暑假课程,到Gl…

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…