kafka学习笔记

妖精的绣舞 提交于 2020-12-29 22:27:55

kafka

消费者可以根据自己的需要根据offset去消费,也可以消费已经消费过的消息,前提是在消息失效的时间范围之内。

在Kafka中保证高可靠模型的依靠的是副本机制,有了副本机制之后,就算机器宕机也不会发生数据丢失。

kafka一个topic下面的所有消息都是以partition的方式分布式的存储在多个节点上。同时在kafka的机器上

partition中的每条Message包含了以下三个属性:

offset MessageSize data

其中offset为long型,MessageSize为int32,表示data有多大,data为message的具体内容。它的格式和Kafka通讯协议中介绍的MessageSet格式是一致。

每个Partition其实都会对应一个日志目录,在目录下面会对应多个日志分段(LogSegment)。

LogSegment文件由两部分组成,分别为“.index”文件和“.log”文件,分别表示为segment索引文件和数据文件。这两个文件的命令规则为:partition全局的第一个segment从0开始,后续每个segment文件名为上一个segment文件最后一条消息的offset值,数值大小为64位,20位数字字符长度,没有数字用0填充顺序读操作时速度很快。

但是kafka有个问题,如果分区过多,那么日志分段也会很多,写的时候由于是批量写,其实就会变成随机写了,随机I/O这个时候对性能影响很大所以一般来说Kafka不能有太多的partition。针对这一点,RocketMQ把所有的日志都写在一个文件里面,就能变成顺序写,通过一定优化,读也能接近于顺序读。

KAFKA为什么要进行分区:

若没有分区,一个topic对应的消息集在分布式集群服务组中,就会分布不均匀,即可能导致某台服务器A记录当前topic的消息集很多,若此topic的消息压力很大的情况下,服务器A就可能导致压力很大,吞吐也容易导致瓶颈。

有了分区后,假设一个topic可能分为10个分区,kafka内部会根据一定的算法把10分区尽可能均匀分布到不同的服务器上,比如:A服务器负责topic的分区1,B服务器负责topic的分区2,在此情况下,Producer发消息时若没指定发送到哪个分区的时候,kafka就会根据一定算法上个消息可能分区1,下个消息可能在分区2。

当然高级API也能自己实现其分发算法

KAFKA日志文件解析:

https://blog.csdn.net/jewes/article/details/42970799

一句话,Kafka的Message存储采用了分区(partition),分段(LogSegment)和稀疏索引这几个手段来达到了高效性。 https://www.toutiao.com/a6582089108129055245/

kafka分区的好处:

一个分区会被划分成大小相等的若干segment,这样一方面保证了分区的数据被划分到多个文件中保证不会产生体积过大的文件;另一方面可以基于这些segment文件进行历史数据的删除,提高效率。 http://cxytiandi.com/code

http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability

经验证,顺序写磁盘效率比随机写内存还要高,这是Kafka高吞吐率的一个很重要的保证)。

kafka中,客户端和服务器之间的通信是通过简单,高性能,语言无关的TCP协议完成的每个分区都是一个有序的,不可变的记录序列,不断附加到结构化的提交日志中。分区中的记录每个都分配了一个称为偏移的顺序ID号,它唯一地标识分区中的每个记录。

Kafka集群持久保存所有已发布的记录 - 无论是否已使用 - 使用可配置的保留期。例如,如果保留策略设置为两天,则在发布记录后的两天内,它可供使用,之后将被丢弃以释放空间。Kafka的性能在数据大小方面实际上是恒定的,因此长时间存储数据不是问题。

实际上,基于每个消费者保留的唯一元数据是该消费者在日志中的偏移或位置。这种偏移由消费者控制:通常消费者在读取记录时会线性地提高其偏移量,但事实上,由于该位置由消费者控制,因此它可以按照自己喜欢的任何顺序消费记录。例如,消费者可以重置为较旧的偏移量来重新处理过去的数据,或者跳到最近的记录并从“现在”开始消费。

这些功能组合意味着Kafka消费者非常便宜 - 他们可以来来往往对集群或其他消费者没有太大影响。例如,您可以使用我们的命令行工具“拖尾”任何主题的内容,而无需更改任何现有使用者所消耗的内容。

1.kakfa启动命令: https://www.cnblogs.com/flower1990/p/7466882.html https://blog.csdn.net/u012050154/article/details/76270655 https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem

安装Kafka 1.Kafka下载路径 http://kafka.apache.org/downloads

2.解压文件(我的目录是D:\kafka_2.12-0.11.0.0 【这里不要在Program Files等文件名之间有空格的目录下,不然一会执行会不识别路径】)

3.打开目录D:\kafka_2.12-0.11.0.0\config下server.properties文件,把log.dirs修改为【log.dirs=D:\kafka_2.12-0.11.0.0\kafka-logs】

4.进入kafka文件目录D:\kafka_2.12-0.11.0.0,执行以下命令,启动kafka通讯的服务器broker .\bin\windows\kafka-server-start.bat .\config\server.properties

kafka -manager https://blog.csdn.net/isea533/article/details/73727485

kafka-生态 https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem

kafka官方文档 http://kafka.apache.org/documentation/#gettingStarted https://blog.csdn.net/saytime/article/details/79950635

springboot +kafka:

Kafka中涉及的一些基本概念:

Broker:Kafka集群包含一个或多个服务器,这些服务器被称为Broker。

Topic:逻辑上同Rabbit的Queue队列相似,每条发布到Kafka集群的消息都必须有一个Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个Broker上,但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

Partition:Partition是物理概念上的分区,为了提供系统吞吐率,在物理上每个Topic会分成一个或多个Partition,每个Partition对应一个文件夹(存储对应分区的消息内容和索引文件)。

Producer:消息生产者,负责生产消息并发送到Kafka Broker。

Consumer:消息消费者,向Kafka Broker读取消息并处理的客户端。

Consumer Group:每个Consumer属于一个特定的组(可为每个Consumer指定属于一个组,若不指定则属于默认组),组可以用来实现一条消息被组内多个成员消费等功能。

kafka linux下的在线安装 https://www.cnblogs.com/huojg-21442/p/7569237.html

zookeeper 安装 https://blog.csdn.net/m0_37949684/article/details/80549548 https://cwiki.apache.org/confluence/display/KAFKA/Ecosystem

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!