Kafka源码之Broker启动流程
启动kafka
kafka-server-start.sh内容如下:
12345678910111213141516171819202122232425262728if [ $# -lt 1 ];then echo "USAGE: $0 [-daemon] server.properties [--override property=value]*" exit 1fibase_dir=$(dirname $0)if [ "x$KAFKA_LOG4J_OPTS" = "x" ]; then export KAF ...
Kafka源码阅读环境搭建
下载Kafka源码
官方下载源码地址:http://archive.apache.org/dist/kafka/1.0.2/kafka-1.0.2-src.tgz
安装配置Gradle
官方gradle-4.8.1下载地址:https://services.gradle.org/distributions/gradle-4.8.1-bin.zip
解压gradle-4.8.1-bin.zip到⼀个⽬录,如下图:
配置环境变量,其中GRADLE_HOME指向gradle解压到的根⽬录,GRADLE_USER_HOME指向gradle的本地仓库位置。
...
Kafka集群监控
监控度量指标
Kafka使⽤Yammer Metrics在服务器和Scala客户端中报告指标。Java客户端使⽤Kafka Metrics,它是⼀个内置的度量标准注册表,可最⼤程度地减少拉⼊客户端应⽤程序的传递依赖项。两者都通过JMX公开指标,并且可以配置为使⽤可插拔的统计报告器报告统计信息,以连接到您的监视系统。
具体的监控指标可以查看官⽅⽂档: https://kafka.apache.org/10/documentation.html#monitoring。
JMX
Kafka开启Jmx端⼝
1[root@node4 bin]# vim /opt/lagou/servers/kafk ...
Kafka集群应用与搭建
集群应⽤场景
消息传递
Kafka可以很好地替代传统邮件代理。消息代理的使⽤有多种原因(将处理与数据⽣产者分离,缓冲未处理的消息等)。与⼤多数邮件系统相⽐,Kafka具有更好的吞吐量,内置的分区,复制和容错功能,这使其成为⼤规模邮件处理应⽤程序的理想解决⽅案。
根据我们的经验,消息传递的使⽤通常吞吐量较低,但是可能需要较低的端到端延迟,并且通常取决于Kafka提供的强⼤的持久性保证。
在这个领域,Kafka与ActiveMQ或 RabbitMQ等传统消息传递系统相当。
⽹站活动路由
Kafka最初的⽤例是能够将⽤户活动跟踪管道重建为⼀组实时的发布-订阅。这意味着将⽹站活动(⻚⾯ ...
Kafka特性之延时队列与重试队列
延时队列
两个follower副本都已经拉取到了leader副本的最新位置,此时⼜向leader副本发送拉取请求,⽽leader副本并没有新的消息写⼊,那么此时leader副本该如何处理呢?可以直接返回空的拉取结果给follower副本,不过在leader副本⼀直没有新消息写⼊的情况下,follower副本会⼀直发送拉取请求,并且总收到空的拉取结果,消耗资源。
Kafka在处理拉取请求时,会先读取⼀次⽇志⽂件,如果收集不到⾜够多(fetchMinBytes,由参数 fetch.min.bytes配置,默认值为1)的消息,那么就会创建⼀个延时拉取操作(DelayedFetch)以 ...
Kafka特性之消息重复解决和consumer-offsets
消息重复解决方案
消息重复和丢失是kafka中很常⻅的问题,主要发⽣在以下三个阶段:
⽣产者阶段
broke阶段
消费者阶段
⽣产者阶段重复场景
根本原因
⽣产发送的消息没有收到正确的broke响应,导致⽣产者重试。
⽣产者发出⼀条消息,broke落盘以后因为⽹络等种种原因发送端得到⼀个发送失败的响应或者⽹络中断,然后⽣产者收到⼀个可恢复的Exception重试消息导致消息重复。
重试过程
new KafkaProducer()后创建⼀个后台线程KafkaThread扫描RecordAccumulator中是否有消息;
调⽤KafkaProducer.sen ...
Kafka特性之一致性保证
概念
⽔位标记
⽔位或⽔印(watermark)⼀词,表示位置信息,即位移(offset)。Kafka源码中使⽤的名字是⾼⽔位,HW(high watermark)。
副本⻆⾊
Kafka分区使⽤多个副本(replica)提供⾼可⽤。
LEO和HW
每个分区副本对象都有两个重要的属性:LEO和HW。
LEO:即⽇志末端位移(log end offset),记录了该副本⽇志中下⼀条消息的位移值。如果LEO=10,那么表示该副本保存了10条消息,位移值范围是[0, 9]。另外,Leader LEO和Follower LEO的更新是有区别的。
HW:即上⾯提到的⽔位值 ...
Kafka特性之控制器和可靠性保证
控制器
Kafka集群包含若⼲个broker,broker.id指定broker的编号,编号不要重复。
Kafka集群上创建的主题,包含若⼲个分区。
每个分区包含若⼲个副本,副本因⼦包括了Follower副本和Leader副本。
副本⼜分为ISR(同步副本分区)和OSR(⾮同步副本分区)。
控制器就是⼀个broker。
控制器除了⼀般broker的功能,还负责Leader分区的选举。
broker选举
集群⾥第⼀个启动的broker在Zookeeper中创建临时节点 /controller 。
其他broker在该控制器节点创建Zookeeper watch对象,使⽤Zooke ...
Kafka特性之事务
事务
事务场景
如producer发的多条消息组成⼀个事务这些消息需要对consumer同时可⻅或者同时不可⻅ 。
producer可能会给多个topic,多个partition发消息,这些消息也需要能放在⼀个事务⾥⾯,这就形成了⼀个典型的分布式事务。
kafka的应⽤场景经常是应⽤先消费⼀个topic,然后做处理再发到另⼀个topic,这个consume-transform-produce过程需要放到⼀个事务⾥⾯,⽐如在消息处理或者发送的过程中如果失败了,消费偏移量也不能提交。
producer或者producer所在的应⽤可能会挂掉,新的producer启动以 ...
Kafka特性之物理存储
⽇志存储
概述
Kafka 消息是以主题为单位进⾏归类,各个主题之间是彼此独⽴的,互不影响。
每个主题⼜可以分为⼀个或多个分区。
每个分区各⾃存在⼀个记录消息数据的⽇志⽂件。
图中,创建了⼀个 tp_demo_01 主题,其存在6个 Parition,对应的每个Parition下存在⼀个 [Topic-Parition] 命名的消息⽇志⽂件。在理想情况下,数据流量分摊到各个 Parition 中,实现了负载均衡的效果。在分区⽇志⽂件中,你会发现很多类型的⽂件,⽐如: .index、.timestamp、.log、.snapshot 等。
其中,⽂件名⼀致的⽂件集合就称为 LogSe ...