Apache Kafka 源码剖析
Getting Start
下载
优点和应用场景
- Kafka消息驱动,符合发布-订阅模式,优点和应用范围都共通
- 发布-订阅模式优点
- 解耦合 : 两个应用不需要相互调用
- 可扩展性 : 消费者的个数可实时扩展
- 实时性 : 消费者能实时的获取生产者发布的事件
- 高效 :减少由于多个消费者请求数据造成的数据计算带来的资源消耗
- 异步通讯 :发布-订阅模式是天生的异步通讯
- Kafka其他优点
- 持久化 : 消息丢失的可控性极高
- 高性能
- 顺序性
- 发布-订阅模式应用范围
- 适合数据一被生产,就需要被处理的情况
- 适合数据具有潜在消费者的情况
- 适合无论有没有消费者,数据都在生产的情况
- 不适合对数据的处理时间有特殊限定的情况
- 应用场景
- 最为消息中间件,实现消息队列和消息的发布-订阅,消息驱动的服务
- 数据总线,一对多的模式
- 日志收集,消息中间件的一种应用
- 数据库主从同步
核心概念
- Broker
- 一个Kafka server就是一个Broker
- 一般情况下,一个Broker独占一台服务器,发挥微服务的优势
- 服务器资源有限的情况下,需要设计出Broker/Topic/Partition/Replica的最优分配策略,从而充分利用服务器资源
- 一个broker可以有多个topic
- Topic
- 存储消息的逻辑上的消息集合
- 每个Topic有多个分区
- 分区 Partition
- 同一个Topic的不同分区分配在不同Broker上,也就是一个分区一个服务器
- 不同Topic的分区可以共享一个服务器
- 同一个分区的消息是有序的,通过维护offset实现
- 相同key的消息会被发布到同一个分区
- 同一个分区的消息会被一个消费组里固定的一个消费者独占消费
- 通过增加分区来增加并行处理能力
- 每个分区可以有多个副本
- 消费组 Consumer Group
- 实现一个消息只被同组的一个消费者独占消费
- 消费组里的消费者有变化的时候会触发Rebalance操作重新分配分区与消费者的对应关系
- Rebalance操作实现了分区消费的故障转移
- 通过增加分区和消费组里的消费者数量来水平扩展,理想情况一对一,也可以一对多,最好不要多对一,造成浪费
- 副本 Replica
- 同一个分区的不同副本分配在不同Broker上,但是这些Broker可以是在同一台服务器上,也可以不是
- 副本是一个热备份设计,会选举一个作为Leader,提供对外服务
- Fllower副本批量的从Leader副本同步消息
- HW & LEO
- HW是所有ISR副本都有的最新offset,HW之前的消息在所有副本中都存在,HW由Leader副本维护
- 所有消费者只能获取HW之前的消息,这样保证了Leader副本不可用的情况下,所有消费者的状态是一致的
- LEO是每个副本各自的最新offset
- ISR集合
- 满足两个条件的副本会被选入ISR可用副本集合
- 副本与Zookeeper连接
- 副本的LEO与Leader副本的LEO差值不超过阈值
- ISR集合保证了Kafka不会被故障副本拖累,也保证了Leader的HW与LEO的差值在阈值内
- 满足两个条件的副本会被选入ISR可用副本集合
- 生产者
- 异步提交
- acks=0 : 生产者只管提交,不会等待Leader副本返回,不保证数据不丢失
- 同步提交
- acks=1 : 默认设置,生产者等待Leader副本返回成功,保证数据在Leader中部丢失,但是不保证重新选举后数据不丢失
- 同步复制
- acks=all : 生产者等待所有副本同步消息后才算提交成功,保证数据不丢失,性能低
- 异步提交
- Log
- 一个副本对应一个Log,用于持久化数据,Kafka采用顺序读写的方式,性能高
- 一个Log里有多个Segment,每个Segment有一个日志文件和一个索引文件
- 日志文件的大小有限制,超出后会生成新的Segment
- 日志消息保留策略有两种
- 消息的保留时间超过指定时间,可以被删除
- Topic的存储满,可以开始删除最旧的消息
- 保留策略可以全局配置,也可以按Topic配置
- 日志压缩
- 开启日志压缩后,相同的key会被定期合并,只保留最新的value
Kafka/zookeeper 命令
- 启动Zookeeper
- ./zookeeper-server-start.sh ../config/zookeeper.properties
- 启动Kafka
- ./kafka-server-start.sh ../config/server.properties
- 查看Topic
- ./kafka-topics.sh --list --zookeeper localhost:9860
- 删除Topic
- ./kafka-topics.sh --delete --zookeeper localhost:9860 /kafka --topic test
- 不会立马删除topic
- 查看Topic的详细信息
- ./kafka-topics.sh --zookeeper localhost:9860 --topic test--describe
- 查看zk信息
- ./zookeeper-shell.sh 127.0.0.1:9860
- 生产数据
- ./kafka-console-producer.sh --broker-list cvatap3d.nam.nsroot.net:9801 --topic midcurve-ds
- 消费数据
- ./kafka-console-consumer.sh --zookeeper localhost:9860 --topic midcurve-ds-subscribe --from-beginning
Kafka集群
zookeeper集群配置 : zookeeper.properties
- clientPort=2180
- 端口号
- dataDir=/tmp/zookeeper
- 集群信息记录目录,清空目录可以重置zookeeper
- 如果需要在同一台server上启动多个node,这个路径必须不同
- tickTime=2000
- zookeeper副本与leader之间维护心跳的频率
- initLimit=5
- zookeeper的leader初始化连接follower时等待多少个tickTime时间的心跳,超时副本连接失败
- syncLimit=2
- leader与follower之间发送消息,请求和应答超时是多少个tickTime
- server.0=cvatap3d.nam.nsroot.net:2888:3888
- server.1=cvatap3d.nam.nsroot.net:2889:3889
- server.2=cvatap3d.nam.nsroot.net:2890:3890
- 第一个启动的为leader
- zookeeper集群数量必须是基数3,5,7...
- 0,1,2是服务id,需要在对应的dataDir=/tmp/zookeeper下面创建myid文件,内容就是服务id,比如0
- ip或者host都可以
- 后面两个端口是zookeeper内部通讯使用
- 第一个端口是用于副本与Leader建立TCP连接
- 第二个端口是用于Leader选举的TCP端口
Kafka配置 : server.properties
- broker.id=0
- 同一个zookeeper集群下的broker的id必须唯一
- log.dirs=/tmp/kafka-logs
- 启动kafka会从zookeeper下载配置到log目录
- 如果修改了server.properties可能因为配置与存储的配置不匹配导致启动失败,这时候可以删除这个目录
- 如果需要在同一台server上启动多个broker,这个路径必须不同
- zookeeper.connect=localhost:2181
- zookeeper集群,以逗号隔开
- listeners=PLAINTEXT://cvatap3d.nam.nsroot.net:9093
- broker的host:port
zookeeper与kafka
- Kafka将Broker信息注册到zookeeper
- zookeeper会维护topic与broker的关系,选举Leader
- 监控partition leader存活性,发现Leader异常会重新选举Leader
- 当异常Broker恢复后,会在一段时间后重新分配Leader
- Broker从zookeeper获取集群中其它Broker信息
- Consumer端将自己注册到zookeeper
- 用来获取broker列表
- 并和partition leader建立socket连接
- 在Consumer Group发生变化时进行rebalance
- Zookeeper管理consumer的offset跟踪当前消费的offset。
- Producer端将自己注册到zookeeper
- 用来获取broker列表和分区状态,从而将消息发布到正确的Broker
- Zookeepr不管理producer
Apache Kafka 源码剖析的更多相关文章
- Apache Spark源码剖析
Apache Spark源码剖析(全面系统介绍Spark源码,提供分析源码的实用技巧和合理的阅读顺序,充分了解Spark的设计思想和运行机理) 许鹏 著 ISBN 978-7-121-25420- ...
- 《Apache Spark源码剖析》
Spark Contributor,Databricks工程师连城,华为大数据平台开发部部长陈亮,网易杭州研究院副院长汪源,TalkingData首席数据科学家张夏天联袂力荐1.本书全面.系统地介绍了 ...
- Apache Kafka源码分析 – Broker Server
1. Kafka.scala 在Kafka的main入口中startup KafkaServerStartable, 而KafkaServerStartable这是对KafkaServer的封装 1: ...
- Apache DolphinScheduler 源码剖析之 Worker 容错处理流程
今天给大家带来的分享是 Apache DolphinScheduler 源码剖析之 Worker 容错处理流程 DolphinScheduler源码剖析之Worker容错处理流程 Worker容错流程 ...
- Kafka 源码剖析
1.概述 在对Kafka使用层面掌握后,进一步提升分析其源码是极有必要的.纵观Kafka源码工程结构,不算太复杂,代码量也不算大.分析研究其实现细节难度不算太大.今天笔者给大家分析的是其核心处理模块, ...
- apache kafka源码分析-Producer分析---转载
原文地址:http://www.aboutyun.com/thread-9938-1-1.html 问题导读1.Kafka提供了Producer类作为java producer的api,此类有几种发送 ...
- Apache Kafka源码分析 - kafka controller
前面已经分析过kafka server的启动过程,以及server所能处理的所有的request,即KafkaApis 剩下的,其实关键就是controller,以及partition和replica ...
- Apache Kafka源码分析 – Controller
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Controller+Internalshttps://cwiki.apache.org ...
- Apache Kafka源码分析 - KafkaApis
kafka apis反映出kafka broker server可以提供哪些服务,broker server主要和producer,consumer,controller有交互,搞清这些api就清楚了 ...
随机推荐
- 尚学堂java 参考答案 第九章
一.选择题 1.AC 解析:A.注意题目是Collections不是 Collection,前者是一个until下的类,后者才是接口 C.Set中的数据是无序且不能重复的 2.A 解析:将发生数组越界 ...
- QuickStart系列:docker部署之MariaDB
Centos7里面没有Mysql 取而代之的是MariaDB,MariaDB是完全开源的.MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的 ...
- Java并发编程_wait/notify和CountDownLatch的比较(三)
1.wait/notify方法 package sync; import java.util.ArrayList; import java.util.List; public class WaitA ...
- java有关构造器的面试题详解
1,编译器只会提供自动提供一个默认的无参数的构造函数 2,如果程序员没有给类A没有提供构造函数,则编译器会自动提供一个默认的无参数的构造函数,如果用户提供了自己的构造函数,则编译器就不在提供默认的无参 ...
- weblogic连接池过小导致TPS呈周期性跳坑现象
利用晚上时间跑个12小时稳定性,第二天发现TPS曲线图成了这个样子. 排查步骤: 1.观察TPS图发现,几乎每两个小时TPS掉一次坑,是周期性的,而且TPS有掉到0的现象.LR上也有失败的交易,猜想是 ...
- UI控件Telerik UI for WinForms发布R1 2019|附下载
Telerik UI for WinForms拥有适用Windows Forms的110多个令人惊叹的UI控件.所有的UI for WinForms控件都具有完整的主题支持,可以轻松地帮助开发人员在桌 ...
- openstack网络DVR
一.DVR描述 分布式路由 二.相关的专业术语 术语名称 术语解释 SNAT 在路由器后(POSTROUTING)将内网的ip地址修改为外网网卡的ip地址,也就是绑定浮动IP和外部通信 DNAT 在路 ...
- Java语法基础学习DayNine(Java集合)
一.Java集合 1.概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要对对象进行存储.另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器, ...
- Highcharts 柱图 每个柱子外围的白色边框
Highcharts 柱图中每条柱外会有默认白色的边框, 去边框代码如下: plotOptions: { bar: { borderColor: "",//去边框 } }
- day 42 mysql 数据类型
mysql 数据类型 数据类型 truncate t1 (删除表) # 无符号类型 alter table t1 modify id tinyint unsigned (表里有值,不能直接改) d ...