Kafka集群内复制功能深入剖析 (kafka集成spring boot)

教程大全 2025-07-20 13:28:55 浏览

Kafka集群内复制功能深入剖析

2018-10-15 17:24:31Kafka是一个分布式发布订阅消息系统。由LinkedIn开发并已经在2011年7月成为apache顶级项目。kafka在LinkedIn, Twitte等许多公司都得到广泛使用,主要用于:日志聚合,消息队列,实时监控等。

Kafka是一个分布式发布订阅消息系统。由LinkedIn开发并已经在2011年7月成为apache***项目。kafka在LinkedIn, Twitte等许多公司都得到广泛使用,主要用于:日志聚合,消息队列,实时监控等。

0.8版本开始,kafka支持集群内复制,从而提高可用性和系统稳定性,这篇文章主要概述kafka复制的设计。

复制

有了复制后,kafka客户端将会得到如下好处:

kafka是一个基于CA的系统(???),zookeeper是一个基于CP的系统(很确定),eureka是一个基于AP的系统(很确定)。

复制强一致

现有比较成熟的方案中,有两种保持强一致性复制的典型方法。这两种方法都需要副本中的一个被设计为leader,所有写入都需要发布到该副本。leader负责处理所有的接入。并广播这些写到其他follower副本,并且要保证复制顺序和leader的顺序一致。

kafka复制选择的是第二种方法,有两个主要原因:

相同数量的副本情况下,第二种方法能承受更多的容错。例如,总计2n+1个副本,第二种方法能承受2n个副本故障(只要还有一个ISR,就能正常写入),而***种方法只能承受n个副本故障。如果在只有两个副本的情况下,***种方法不能容忍任意一个副本故障。

***种方法延迟性表现更好,因为只需要法定人数确认即可,所以会隐藏掉一些比较慢的副本的影响。而kafka副本被设计在相同的数据中心的一个集群下。所以网络延迟这种变数是比较小的。

术语

为了了解kafka中的副本是如何实现的,我们首先需要介绍一些基本概念。在kafka中,消息流由topic定义,topic被切分为1个或者多个分区(partition),复制发生在分区级别,每个分区有一个或者多个副本。

副本被均匀分配到kafka集群的不同 服务器 (称为broker)上。每个副本都维护磁盘上的日志。生产者发布的消息顺序追加到日志中,日志中每条消息被一个单调递增的offset标识。

offset是分区内的逻辑概念, 给定偏移量,可以在分区的每个副本中标识相同的消息。 当消费者订阅某个主题时,它会跟踪每个分区中的偏移量以供使用,并使用它来向broker发出获取消息的请求。

设计

kafka中增加副本的目标是为了更强的持久性和高可用。kafka要保证任何成功发布的消息不会丢失,且能被消费,即使在有一些服务器宕机的情况下。kafka复制的主要目标有:

配置的持久化保证:例如,某些数据不能容忍丢失的应用,可以选择更强的持久性,当然会伴随延迟的增长。另一个产生海量允许部分数据丢失的应用,可以选择稍微弱一点的持久性,但是更获得更好的写入响应时间,得到更好的吞吐量。

自动化的副本管理:kafka要简化向broker分配副本的指配过程,并且能支持集群逐步扩容&缩容。

这样的话,有两个主要问题需要解决:

数据复制

kafka允许客户端选择异步或者同步复制,异步复制的话,发布的消息,当被1个副本接收到就能确认。同步复制的话,kafka尽***努力确保消息到达多个副本(所以有效的ISR)后才确认。当客户端尝试发布消息到一个topic的分区时,kafka必须传播这个消息到所有副本,kafka必须决定:

实现

保持副本同步有两种常用的策略:主备复制和基于仲裁复制。这两种情况下,一个副本被设计为leader,其他副本被称为follower,所有写请求都由leader处理,leader传播写请求给follower。

在主备复制下,leader等待直到写在这个组里每个副本都完成,才向客户端发送确认。如果某个副本故障,leader把它从这个组移除,并继续写到剩余的副本。一个故障副本也被允许从新加入组,只要它恢复,并追赶上leader。在用n个副本的前提下,主备复制模式能容忍n-1个副本故障。

在基于仲裁方法下,leader等待直到写在大多数副本上完成,副本组的大小不会因为某些副本故障发生改变(例如某个分区有5个副本,即使有2个副本故障,我们还是认为这个副本组有5个副本)。因此如果有2n+1个副本,基于仲裁复制的话,只能容忍n个副本故障。如果leader出现故障,需要至少n+1个副本才能选举一个新的leader。

这两种方法需要权衡:

同步复制

kafka同步复制是典型的主备方式,每个分区有n个副本,并且能容忍n-1个副本故障。只有一个副本被选举为leader,其他都是follower。leader维护了一个ISR集合:这个副本集完全和leader保持同步状态,kafka还会把当前的leader和当前的ISR保持到zookeeper中。

每个副本保存信息在本地日志中,并且维护了一个日志中重要的offset位置。LEO表示日志尾部,HW是***提交消息的offset。每个日志周期性的同步到磁盘,已经刷新的偏移量之前的数据保证保留在磁盘上。

为了发布消息到分区,客户端首先从zookeeper中找到分区的leader,然后发送消息到这个leader。leader写消息到它的本地日志,每个follower经常从leader拉取***的消息。所以,follower接收到的所有消息的顺序和leader保持一致,follower把每条接收到的消息写入它的本地日志,并向leader发送一个确认。一旦leader接收到所有ISR副本的确认,消息就能被提交。leader推进HW,然后向客户端发送确认。为了更好的性能,每个follower在把消息写入内存后,就发送确认。因此,对于每条提交的消息,我们保证它被保存到多个副本的内容中然而,不保证任何副本已经持久化已提交消息到磁盘上。

由于这种相关故障相对罕见,并且这种方法能给我们一个在响应时间和持久性之间一个很好的平衡。在将来,kafka可能考虑增加一个选项参数从而提供更强的保证。

为了简化,读也是leader提供服务,并且只有HW以上的消息才会被暴露给消费者读取。

异步复制

为了支持异步复制,leader可以在消息写入本地日志后,马上通知客户端。唯一需要注意的是在追赶阶段,follower必须截断HW位置以后的数据。follower主要是异步复制,所以不能保证提交的消息在broker故障后不丢失。

复制实现

kafka复制示意图如下所示:

producer写入消息到分区topic1-part1的leader上(在broker1上),然后复制到它的两个副本,分别在broker2和broker3上。

producer写入消息到分区topic1-part2的leader上(在broker4上),然后复制到它的两个副本,分别在broker2和broker3上。

当生产者发布消息到topic的某个分区时,消息首先被传递到leader副本,并追加日志。follower副本从leader中不停的拉取新消息,一旦有足够的副本收到消息,leader就会提交这个消息。

这里有个问题,leader是怎么决定什么是足够的。kafka维护了一个 in-sync replica(ISR)集合。这个ISR副本集都是存活的,并且完全赶上leader的副本,没有消息延迟(leader总是在ISR集合中)。当分区初始化创建时,每个副本都在ISR集合中。当新消息发布后,leader提交消息前一直等待直到所有ISR副本收到消息。如果某个follower副本故障,它将会被从ISR中移除。leader会继续提交新的消息,只不过ISR数量相比分区创建时副本数量更少。

请注意,现在,系统运行在under replicated模式。

leader还会维护high watermark (HW,可以翻译成高水位),是指分区中***一次提交消息的offset。HW会被不断传播给follower副本:

boot kafka high watermark

当一个故障副本被重启后,它首先从磁盘上恢复***的HW,并将日志截断到HW。这是必要的,因为不能保证在HW之后的消息被提交,所以可能需要丢弃。然后副本成为follower,并继续从leader那里获取HW以后的消息。一旦完全赶上leader,这个副本从新被加入到ISR中。系统将重新回到fully replicated模式。

故障处理

kafka依赖zookeeper检测broker故障,kafka会用一个controller(broker集合中的一个)接收所有zookeeper关于故障,选举新leader等相关通知,这样还有一个好处,减少了对zookeeper的压力。如果某个leader故障,controller就会从ISR副本中选举一个新的leader,并发布新leader的消息给其他follower。

按照设计,leader选举过程中,已经提交的消息总是会被保留,一些未提交的消息可能会丢失。leader和每个分区的ISR也会被保存在Zookeeper中,controller出现故障转移时需要用到。由于broker级别的故障一般会非常少,所以预期的leader和ISR都会不经常改变。

对客户端来说,broker仅向消费者公开已经提交的消息。broker故障期间,已提交的数据始终被保留。消费者使用相同的offset可以从另一个被选举为leader的副本拉取消息。

生产者能选择在broker收到消息后何时得到broker的确认。例如,它能等到消息被leader提交并被所有ISR确认(即acks=-1)。另外,也可以选择消息只要被leader追加到日志中,可能还没有提交(acks=0表示无需等待leader确认,acks=1表示需要等待leader确认)。前一种情况即acks=-1,生产者需要等待更长的时间。但是确认的消息都保证在broker中保留。后一种情况即acks=0或者1,生产者有更低的延迟,更高的吞吐量,但一些确认的消息在broker故障时可能会丢失。如何抉择,由你决定。


大数据专业主要学什么?

大数据技术专业属于交叉学科:以统计学、数学、计算机为三大支撑性学科;生物、医学、环境科学、经济学、社会学、管理学为应用拓展性学科。

此外还需学习数据采集、分析、处理软件,学习数学建模软件及计算机编程语言等,知识结构是二专多能复合的跨界人才(有专业知识、有数据思维)。

以中国人民大学为例:

基础课程:数学分析、高等代数、普通物理数学与信息科学概论、数据结构、数据科学导论、程序设计导论、程序设计实践。

必修课:离散数学、概率与统计、算法分析与设计、数据计算智能、数据库系统概论、计算机系统基础、并行体系结构与编程、非结构化大数据分析。

选修课:数据科学算法导论、数据科学专题、数据科学实践、互联网实用开发技术、抽样技术、统计学习、回归分析、随机过程。

求一篇关于辽宁鞍山十七大以后如何变化的社会调查报告~~~~

十七大之后,辽宁省鞍山市通过深入实施管理节能、结构节能、技术节能和全民节能,全市节能降耗成效显著,去年万元地区生产总值综合能耗为1.87吨标准煤,比上年下降5.3%,比预期多下降0.3个百分点。 我市制定出台的一系列政策规定,为管理节能打下了坚实基础。 为加大节能监察、监测执法力度,我市开展了固定资产投资项目节能、报费机动车辆、能效标识、淘汰用能设备、重点用能设备运行等九个方面的专项执法监督检查,整改企业40多户,查处淘汰变压器150多台,淘汰电机200多台,报废机动车辆60多台,老旧高耗能车辆800多台。 严格执行能源评价和环保评价制度,否决了20个不符合国家产业政策的高耗能、高污染项目;依法关闭了小选矿、小炼钢、小水泥、小造纸等企业227户;对暂不能关停的90多户国家淘汰类、限制类高耗能企业实行了差别电价。 按照国家产业政策,分期、分批淘汰年产20万吨以下水泥立窑、300立方米以下高炉,年产1万吨以下造纸以及落后的铸钢、轧钢工艺企业。 为大力推广新型墙体材料,我市对工业废渣多孔砖生产企业进行培训,推广《工业废渣混凝土多孔砖》产品标准和《工业废渣混凝土多孔砖建筑技术规程》,对118项在建工程进行了抽查,各建设单位严格按设计施工,基本没有使用粘土实心砖,新型墙体材料应用比例达95%以上,同比提高了5个百分点。 同时,按照结构调整和优化升级方向,我市规划30个低能耗、少排放产业集群,通过产业集群项目的实施,装备制造业比重达9%,比上年提高3个百分点;矿产品深加工率达到40%,比上年提升5个百分点;钢材就地加工能力由上年不足100万吨增加到200万吨。 在企业中大力实施技术改造和技术创新,采用节能新技术、新工艺、新设备、新材料。 去年全年实施节能技术改造项目20项,项目完成后节约标准煤90万吨。 其中中橡公司为充分回收和有效利用炭黑尾气中的余热,减少炭黑尾气污染,投资2500余万元建设了综合利用热电站、污水处理及回用装置各一座,每年回收利用生产过程尾气4.2亿余标准立方米,实现废水全部回收再利用。 辽宁衡业集团将建厂初期的燃煤加热炉改造为环保型煤气发生炉。 在工作过程中,不排烟、不排尘,清洁卫生。 与辽宁衡业集团一起进行窑炉改造的还有天河矿产有限公司、西洋集团等企业,年节约标准煤近20万吨。 鞍山2007年的GDP超过了1350亿元。 依托中心城市沈阳,我们提出要打造辽宁新的经济隆起带,以鞍海经济带为建设重点,高起点规划建设沈西工业走廊鞍山段,促使鞍山成为辽宁经济发展新的增长极。 调查中,鞍山钢铁股份公司第二炼钢厂认真贯彻落实科学发展观,深入开展技术创新活动,不断提升企业创新能力,努力建设创新型炼钢厂。 年初以来,这个厂确立了7个公司级创新项目,241个厂级创新项目,职工提出合理化建议864条,有效推进了企业实现又好又快发展。 该厂今年提出了建设“生产高效型、资源节约型、环境友好型企业,保证企业可持续协调发展”的今后三年总体发展目标。 为了实现这一目标,该厂首先开展了“创新意识教育”,要求全厂干部职工增强对创新工作重要性和紧迫性的认识;做到人人有创新意识,人人有创新欲望,人人有创新项目,人人有创新成果。 在形成浓厚的创新氛围的基础上,该厂抓住制约生产的瓶颈问题、涉及到品种质量上档次的核心问题、影响设备功能和稳定顺行的突出问题、实现节能减排和降成本目标的关键问题等八个方面问题,广泛开展创新活动。 为保证创新活动的深入开展,该厂成立了以厂主要领导为组长的技术创新领导小组,修订了科研创新管理细则和科研创新管理办法,进一步完善了创新工作的方法要求及工作程序。 在创新活动中,炼钢一工区提出“顶吹转炉高碳钢冶炼方法”,采取留渣操作,调整供氧强度,不同阶段调整渣内氧化铁含量等有效措施,使冶炼高碳钢过程中碳的命中率达到98%,磷的命中率达到 95%,分别比原来冶炼方法提高了2%和1.5%。 炼钢一工区提出的铁水脱硫“防溅”工艺技术,成功应用于生产,效益明显,目前正在申请国家专利。 在公司级创新项目??“175吨转炉复吹长寿技术研究攻关”中,他们采用快速测炉底的方法,对转炉溅渣进行调质处理,减少溅渣时间,控制炉底上涨,目前1号转炉底吹寿命已经达到 8100炉,为鞍钢最好水平。 通过不断努力,该厂在RH保产攻关、铸坯夹杂攻关、降低铁水单耗等11个重点攻关项目及活动中相继取得了可喜成果。 合理化建议完成并应用创经济效益1235万元,有10项专利已被国家专利局受理

如何为Kafka集群选择合适的主题和分区数量

如何决定kafka集群中topic,partition的数量,这是许多kafka用户经常遇到的问题。 本文列举阐述几个重要的决定因素,以提供一些参考。 分区多吞吐量更高一个话题topic的各个分区partiton之间是并行的。 在producer和broker方面,写不同的分区是完全并行的。 因此一些昂贵的操作比如压缩,可以获得更多的资源,因为有多个进程。 在consumer方面,一个分区的数据可以由一个consumer线程在拉去数据。 分区多,并行的consumer(同一个消费组)也可以多。 因此通常,分区越多吞吐量越高。 基于吞吐量可以获得一个粗略的计算公式。 先测量得到在只有一个分区的情况下,Producer的吞吐量(P)和Consumer的吞吐量(C)。 那如果总的目标吞吐量是T的话,max(T/P,T/C)就是需要的最小分区数。 在单分区的情况下,Producer的吞吐量可以通过一些配置参数,比如bath的大小、副本的数量、压缩格式、ack类型来测得。 而Consumer的吞吐量通常取决于应用程序处理每一天消息逻辑。 这些都是需要切合实际测量。 随着时间推移数据量的增长可能会需要增加分区。 有一点需要注意的是,Producer者发布消息通过key取哈希后映射分发到一个指定的分区,当分区数发生变化后,会带来key和分区映射关系发生变化。 可能某些应用程序依赖key和分区映射关系,映射关系变化了,程序就需要做相应的调整。 为了避免这种key和分区关系带来的应用程序修改。 所以在分区的时候尽量提前考虑,未来一年或两年的对分区数据量的要求。 除了吞吐量,还有一些其他的因素,在定分区的数目时是值得考虑的。 在某些情况下,太多的分区也可能会产生负面影响。 分区多需要的打开的文件句柄也多每个分区都映射到broker上的一个目录,每个log片段都会有两个文件(一个是索引文件,另一个是实际的数据文件)。 分区越多所需要的文件句柄也就越多,可以通过配置操作系统的参数增加打开文件句柄数。 分区多增加了不可用风险kafka支持主备复制,具备更高的可用性和持久性。 一个分区(partition)可以有多个副本,这些副本保存在不同的broker上。 每个分区的副本中都会有一个作为Leader。 当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。 Producer和Consumer都只会与Leader相连。 一般情况下,当一个broker被正常关机时,controller主动地将Leader从正在关机的broker上移除。 移动一个Leader只需要几毫秒。 然当broker出现异常导致关机时,不可用会与分区数成正比。 假设一个boker上有2000个分区,每个分区有2个副本,那这样一个boker大约有1000个Leader,当boker异常宕机,会同时有1000个分区变得不可用。 假设恢复一个分区需要5ms,1000个分区就要5s。 分区越多,在broker异常宕机的情况,恢复所需时间会越长,不可用风险会增加。 分区多会增加点到点的延迟这个延迟需要体现在两个boker间主备数据同步。 在默认情况下,两个boker只有一个线程负责数据的复制。 根据经验,每个boker上的分区限制在100*b*r内(b指集群内boker的数量,r指副本数量)。 分区多会增加客户端的内存消耗kafka0.8.2后有个比较好的特色,新的Producer可以允许用户设置一个缓冲区,缓存一定量的数据。 当缓冲区数据到达设定量或者到时间,数据会从缓存区删除发往broker。 如果分区很多,每个分区都缓存一定量的数据量在缓冲区,很可能会占用大量的内存,甚至超过系统内存。 Consumer也存在同样的问题,会从每个分区拉一批数据回来,分区越多,所需内存也就越大。 根据经验,应该给每个分区分配至少几十KB的内存。 总结 在通常情况下,增加分区可以提供kafka集群的吞吐量。 然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐