hyperxu

一个专注于运维领域的个人技术博客


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 公益404

  • 搜索

kafka是如何保证消息不丢失的

发表于 2020-01-16 | 分类于 kafka | 阅读次数

今天和大家聊一下,kafka对于消息的可靠性保证。作为消息引擎组件,保证消息不丢失,是非常重要的。

那么kafka是如何保证消息不丢失的呢?

前提条件

任何消息组件不丢数据都是在特定场景下一定条件的,kafka要保证消息不丢,有两个核心条件。

第一,必须是已提交的消息,即committed message。kafka对于committed message的定义是,生产者提交消息到broker,并等到多个broker确认并返回给生产者已提交的确认信息。而这多个broker是由我们自己来定义的,可以选择只要有一个broker成功保存该消息就算是已提交,也可以是令所有broker都成功保存该消息才算是已提交。不论哪种情况,kafka只对已提交的消息做持久化保证。

第二,也就是最基本的条件,虽然kafka集群是分布式的,但也必须保证有足够broker正常工作,才能对消息做持久化做保证。也就是说 kafka不丢消息是有前提条件的,假如你的消息保存在 N 个kafka broker上,那么这个前提条件就是这 N 个broker中至少有 1 个存活。只要这个条件成立,kafka就能保证你的这条消息永远不会丢失。

阅读全文 »

kafka的发行版选择

发表于 2020-01-15 | 分类于 kafka | 阅读次数

今天继续和大家聊一下,kafka的各种发行版。kafka历经数年的发展,从最初纯粹的消息引擎,到近几年开始在流处理平台生态圈发力,衍生出了各种不同特性的版本。

你了解几种kafka

kafka的确有好几种,这里我不是指他的版本,是指存在多个组织或公司发布不同特性的kafka。你应该听说过Linux发行版,比如我们熟知的CentOS、RedHat、Ubuntu等,它们都是Linux系统,其实就是因为它们是不同公司发布的Linux系统,即不同的发行版。kafka也同样有多个发行版。

Apache Kafka

Apache Kafka是最“正统”的kafka,也应该是你最熟悉的发行版了。自kafka开源之初,它便在Apache基金会孵化并最终毕业成为顶级项目,也被称为社区版kafka。重要的是,它是后面其他所有发行版的基础。也就是说,后面提到的其他发行版,要么是原封不动地继承了Apache Kafka,要么是在此之上扩展了新功能,总之Apache Kafka是我们学习和使用kafka的基础。

阅读全文 »

kafka分区数和吞吐量的关系

发表于 2020-01-01 | 分类于 kafka | 阅读次数

分区(partition)概念

要讲kafka分区数和吞吐量的关系,首先得理解什么是分区(partition)。
E7D66E0B-E03B-4FAF-ADEE-22D86FC69211

Partition是作用于具体的Topic而已的,而不是一个独立的概念。Partition能水平扩展客户端的读写性能,是高吞吐量的保障。通俗的讲,Partition就是一块保存具体数据的空间,本质就是磁盘上存放数据的文件夹,所以Partition是不能跨Broker存在的,也不能在同一个Broker上跨磁盘。对于一个Topic,可以根据需要设定Partition的个数。数据持久化时,每条消息都是根据一定的分区规则路由到对应的Partition中,并append在log文件的尾部(这一点类似于HDFS),如上图;在同一个Partition中消息是顺序写入的且始终保持有序性;但是不同Partition之间不能保证消息的有序性(高吞吐量的保障)。kafka就是通过使用分区的设计将topic的消息打散到多个分区分布保存在不同的broker上,实现了producer和consumer消息处理的高吞吐量。

阅读全文 »

kafka分区数过多的弊端

发表于 2020-01-01 | 分类于 kafka | 阅读次数

上篇文章我们了解到,如果一个topic分区越多,理论上整个集群所能达到的吞吐量就越大。那么,分区数越多就越好吗?显然不是。今天我们来聊下kafka在分区数过多的情况下,会带来哪些弊端。

内存开销

客户端producer有个参数batch.size默认为16KB。它会为每个分区缓存消息,一旦批次数满了后,将消息批量发出。一般来说,这个设计是用于提升吞吐性能的。但是由于这个参数是partition级别的,如果分区数越多,这部分缓存所需的内存占用也会越多。假如有10000个分区,按照默认配置,这部分缓存就要占用约157MB的内存。而consumer端呢?抛开拉取数据所需的内存不说,单说线程的开销。如果还是10000个分区,同时consumer线程数要匹配分区数的话(大部分情况下是最佳的消费吞吐量配置),那么在consumer client就要创建10000个线程,也需要创建大约10000个Socket去获取分区数据,这里面的线程切换的开销本身就已经不容小觑了。
服务器端的开销也不小,如果阅读kafka源码的话就会发现,服务器端的很多组件在内存中维护了partition级别的缓存,比如controller,FetcherManager等,因此分区数越多,这种缓存的成本就越大。

阅读全文 »

kafka数据存储目录间迁移

发表于 2019-12-13 | 分类于 kafka | 阅读次数

生产环境kafka集群,在数据量大的情况下,会出现单机各个磁盘间的占用不均匀情况,经常出现“一边倒”的情形。

原因探究

这是因为kafka只保证分区数量在各个磁盘上均匀分布,但它无法统计每个分区实际占用磁盘空间。因此很有可能出现某些分区消息数量巨大导致占用大量磁盘空间的情况。在1.1版本之前,用户对此基本没有优雅的处理方法,即便手动迁移日志文件和offset信息,也需要重启生效,风险极高。因为1.1之前kafka只支持分区数据在不同broker间的重分配,而无法做到在同一个broker下的不同磁盘间做重分配。1.1版本正式支持副本在不同路径间的迁移,具体的实现细节详见kafka官方wikiKIP-113。

目录间迁移步骤

假设我在server.properties文件中配置了多个日志存储路径(代表多块磁盘),如下所示:

1
2
3
# A comma seperated list of directories under which to store log files
log.dirs=/data1/kafka-logs,/data2/kafka-logs,/data3/kafka-logs

阅读全文 »
123…7
hyperxu

hyperxu

35 日志
10 分类
21 标签
RSS
GitHub Facebook 知乎
© 2025 hyperxu | 浙ICP备15043518号-3
由 Hexo 强力驱动
主题 - NexT.Mist