kafka
文章平均质量分 91
中国好胖子、
学不死就往死里学,比你优秀的人比你还努力,你还拿什么和别人拼
展开
-
Kafka源码解析之Kafka高性能的秘密概述(一)
1. Kafka是什么1.1 为什么会有消息系统如上图所示,我们有一个华为手机的生产线,我们手机的主板使用的是机械手臂生产的然后通过人工搬运的方式送到组装车间,进行手机的组装,最后去往我们的质检车间,这个时候我们应该可以发现一个问题,人工搬运过去有点慢啊,我们应该引入传送带,传过去,这样就省掉了人工搬运的过程这样我们就引入了传送带提高了效率,运行了几天我们又发现了一个问题,机械手臂生产的很快,组装比较慢,质检比较快,这样就到了生产效率不一致的问题这个时候我们应该怎么解决这个问题呢,我们是不是在每原创 2020-07-22 22:33:46 · 1244 阅读 · 0 评论 -
KafkaBroker管理之时间轮机制
kafka内部为什么要设计时间轮?kafka内部有很多很多的延时任务,并没有急于JDK Timer来实现,那个插入和删除任务的时间复杂度是O(nlogn)而是与自己写的时间轮来实现的,时间复杂度是O(1),依靠时间轮机制,延时任务插入和删除O(1)时间轮是什么?其实时间轮说白了就是一个数组tickMS: 时间轮间隔 1mswheelSize: 时间大小 20个interval: tickMS * wheelSize, 一个时间轮的总的时间跨度是20mscurrentTime: 当前时间的指针原创 2020-08-02 18:29:35 · 386 阅读 · 0 评论 -
KafkaBroker管理之延迟任务
Kafka Broker的延迟调度机制有哪些任务是有延迟调度机制呢?第一类 ,比如说producer的acks = -1 必须等待leader和follower都写完才能返回响应,有一个超时时间,默认是30s(request.timeout.ms),所以需要在写入一条数据到leader磁盘的之后,就必须有一个延时任务,到期时间是30秒延时任务,放到DalayedOperationPurgatory(延时管理器)中。假如30秒之前如果所有的follower都写入副本到本地磁盘了,那么和这个任务就会原创 2020-08-02 17:59:27 · 526 阅读 · 0 评论 -
KafkaBroker管理之Controller是如何管理整个集群的
怎么决定谁是Controller?Kafka的Controller管理我们的kafka集群的时候是借助zookeeper来进行的,我们所有的broker启动的时候都会去zookeeper进行创建目录,谁创建成功谁是ControllerController又做了什么事情?controller 抢占成功之后,就会去zk进行监控很多目录 例如 /broker/ids 用来感知 broker上下线,/broker/topics创建主题,/admin/reassign_partitions 分区重分配等,然后原创 2020-08-02 17:44:11 · 315 阅读 · 0 评论 -
KafkaBroker管理之HW的更新
HW的值是怎么更新的,leader 挂了以后 follower他怎么知道hw是几呢?通过我上一篇的博客已经知道了,follower parition进行同步数据的时候会把自己的LEO带回去,那么这个时候leader partition 就会从自己的管理follower的数据结构里面找到最小的LEO的值,即为HW,那么follower的HW是根据 leader返回的当前HW的值来进行更新的,follower parition 的更新是根据 min(leader HW,自己的LEO)得到最小值作为 HW.原创 2020-08-02 17:21:20 · 325 阅读 · 0 评论 -
KafkaBroker管理之LEO的更新
我们应该都知道kafka分区是有leader和follower之分的,消费的时候是找的leader进行消费的,那么follower之间的数据同步,也是由leader parition来进行负责的!每个partition都管理了自己的LEO,那么leader的LEO和 follower的 LEO 是一样的吗?是不一样的,那么我们的LEO是怎么更新的呢?follower partition会找到我们的leader partition来进行数据的同步操作,我们的leader partition 有一个专门的数据原创 2020-08-02 17:09:28 · 168 阅读 · 0 评论 -
KafkaBroker管理之LEO、HW的含义
LEO 是跟offset有关系的在kafka里面,无论leader partition 还是follower partition 统一都称为副本(replica)。LEO: log end offset每次partition接收到一条消息,都会更新自己的LEO,也就是 log end offset ,LEO其实就是最新的offset + 1**HW: ** 高水位LEO 有一个很重要的功能就是更新HW,如果folllower和leader的LEO 同步了,此时HW就可以更新HW之前的数据对消.原创 2020-08-02 17:00:44 · 651 阅读 · 0 评论 -
Kafka消费者之Consumer Rebalance策略
consumer group 是依靠 coorinator实现了rebalance比如我们消费的一个主题有12个分区:p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p111. range策略p0~p3给 conusmer1p4~p7给 consumer2p8~p11给 consumer3默认的情况下就是这个策略2. round-robin策略就是轮训分配consumer1: 0,3,6,9consumer2: 1,4,7,10consumer3: 2,.原创 2020-08-02 15:09:23 · 633 阅读 · 0 评论 -
Kafka消费者之Group Coordinator原理
消费者是如何实现rebalance的?1. 什么是coordinator?每个consumer group 都会选择一个broker作为自己的coordinator,他是负责监控整个消费组里的各个分区的心跳,以及判断是否宕机,和开启rebalance的。2. 如何选择coordinator机器首先对group id 进行hash,接着对__consumer_offsets的分区数量进行取模,默认分区数量是50__consumer_offsets的分区数量可以通过offsets.topic.nu.原创 2020-08-02 11:40:31 · 3586 阅读 · 0 评论 -
Kafka消费者之Consumer核心参数
fetch.max.bytes: 获取一条消息最大的字节数,一般设置的大一点,根据公司不同吧,我们没有超过1M的 我就走默认的就好了,默认就是1Mproducer里面也有这个值,代表的就是发送的数据一条消息,最大能有多大Broker里面也有这个值,代表的就是存储数据,一条消息最大能接受多大max.poll.records: 一次poll返回消息的最大条数,默认是500条connection.max.idle.max: consumer跟broker的socket连接如果空闲超过了一定的时间就.原创 2020-08-01 18:50:16 · 593 阅读 · 0 评论 -
Kafka消费者之Consumer如何感知消费异常
heartbeat.interva.ms:consumer心跳时间间隔,必须得与coordinator保持心跳才能知道consumer是否故障了,然后如果故障之后就会通过心跳下发rebalance的指令给其他的consumer进行rebalance的操作session.timeout.ms:kafka多长时间感知不到一个consumer就认为他故障了,默认是10秒max.poll.interval.ms如果在两次poll操作之间,超过了这个时间,那么就会认为这个consumer处理能力太弱了,会被原创 2020-08-01 18:30:40 · 938 阅读 · 0 评论 -
Kafka消费者之Consumer的偏移量如何管理
偏移量管理每个consumer内存里的数据结构保存每个topic的每个分区的消费的offset,定期会提交offset,老版本是写入zookeeper,但是我们知道zookeeper是不支持高并发的,kafka当初的架构设计的不合理采用zk用来控制并发,是不够的,zk是用来做分布式协调的,轻量级的可以,不能负责高并发操作,作为简单的数据存储可以,例如集群信息等和clickhouse现在面临的问题一样现在新的版本提交offset发送给kafka内部topic:__consumer_offset,提交过去原创 2020-08-01 18:17:10 · 767 阅读 · 2 评论 -
Kafka消费者之消费者组的概念
1. P2P模式每个consumer都要属于一个consumer.group,就是一个消费者组,topic的一个分区只会分配给一个消费者组下面的一个consumer来进行处理,每个consumer可能会分配多个分区,也可能某个consumer没有分配到任何分区2. 广播模式如果想要实现一个广播的效果,那么只需要使用不同的 group id去消费就可以了3. 总结如果comusmer group 中的某个消费者挂了,此时会自动把分配给他的分区交给其他的消费者,如果他又冲去了,那么会把一些分区重新交原创 2020-08-01 17:56:37 · 998 阅读 · 0 评论 -
Kafka生产者之自定义分区器
1. 没有设置key我们的消息会被轮训的发送到不同的分区2. 设置了keykafka自带的分区器,会根据key计算出来一个hash值,这个hash值会对应某一个分区如果key相同的,那么hash值必然相同,key相同的值,必然是会被发送到同一个分区3. 自定义分区器package com.bigdata.test;import org.apache.kafka.clients.producer.Partitioner;import org.apache.kafka.common.Clust原创 2020-08-01 17:21:02 · 396 阅读 · 0 评论 -
Kafka生产者之acks机制以及不丢失数据方案
Producer端设置的参数1. request.required.acks=0只要请求已经发送出去了,就算是发送完了。不关心有没有写成功性能会很好,如果是对一些日志进行分析,可以承受丢数据的情况,用这个参数性能会很好2. request.required.acks=1发送一条消息,当leader partition写入成功以后,才算写入成功,这种方式也会有丢数据的风险假如我们往kafka某一个broker上进行写数据,我们当然是给某一个分区的leader进行写数据,那么这个时候我们写入了这个原创 2020-08-01 16:55:27 · 703 阅读 · 0 评论 -
Kafka生产者之重试机制
假如我们的kafka集群可能有一些网络问题,这个时候 producer写数据的时候可能会出现一些问题,那么kafka内部就会有失败重试机制,但是面临了两个问题1. 消息乱序有的时候一些leader切换的时候,需要进行重试,设置retries即可,但是消息重试会导致重复发送的问题,比如说网络抖动导致producer以为没成功,其实是成功了的,这个时候就会出现消息重复的问题2. 消息乱序消息重试是可能会导致消息乱序的,因为可能排在你后面的消息都发送出去了,所以可以使用“max.in.flight.r.原创 2020-08-01 16:33:03 · 3281 阅读 · 0 评论 -
Kafka生产者之如何处理异常
1. LeaderNotAvailableExecption这个就是如果某台机器挂了,此时的leader副本不可用,会导致你写入失败,要等待其他follower副本切换为leader副本之后,才能继续写入,此时可以重试发送即可2. NotControllerExecption这个也是一样的,如果说Controller所在的broker挂了,那么此时会有问题,需要等待Controller重新欢聚,此时也是一样的重试即可3. NetworkEcecption 网络异常这个代表的是网络异常,可能是某个原创 2020-08-01 16:24:25 · 1006 阅读 · 0 评论 -
Kafka企业搭建之核心参数详解
服务端核心参数broker.id=0 每个broker唯一id号,在源码里面是根据这个来判定一个broker的listeners=hostname://:9092 当前broker对外提供访问的brokernum.network.threads=3 是服务端将请求转发时候的线程数,一般设置为 6 或者 9 根据自己机器的性能以及业务场景num.io.threads=8 真正处理数据的线程 一般为io密集型 设计为2-3倍比较好log.dirs 我们有多块硬盘 log.dirs=/data0原创 2020-08-01 14:47:26 · 261 阅读 · 0 评论 -
Kafka企业搭建之Kafka集群规划
1. 需求分析因为我的公司是属于零售业务,我就拿电商平台来说电商平台,假设每天有10亿请求都需要发送到kafka上面,28原则的话10亿请求是通过24个小时来进行发送的,一般情况下,零点到早上8点这段时间是没有多大的数据量的,百分之80的请求都是需要另外的16个小时来进行处理的,其实16个小时也并不是每个小时都是高峰,我们采用28原则,其实真正的高峰是有3个小时的,那么我们高峰qps也就是 5.5W2. kafka物理机数量的评估其实在生产环境中,像Kafka、MySQL、Hadoop等这些基础原创 2020-08-01 12:59:10 · 608 阅读 · 0 评论 -
Kafka源码解析之Producer发送数据流程(三)
1. Kakfa生产者examplespublic class Producer extends Thread { private final KafkaProducer<Integer, String> producer; private final String topic; private final Boolean isAsync; /** * 构造方法,初始化生产者对象 * @param topic * @param i原创 2020-07-26 14:12:40 · 2117 阅读 · 0 评论 -
Kafka源码解析之Kafka源码导入IDEA(二)
1. Gradle准备2. Kafka源码准备3. Scala安装version: 2.11.83. 修改gradle配置文件修改build.gradle修改properties4. 进行build项目原创 2020-07-22 22:48:51 · 450 阅读 · 0 评论