Kafka概要简述核心要点

1.基本概念:scala编写、LinkedIn转交给Apache、版本格式kafka_<scala版本>-<kafka版本>、不属于CPU密集型,多核优于高时钟频率

    1)基本命令:

    zookeepler启动:bin/zookeeper-server-start.sh config/zookeeper.properties(端口2181)

    kafka启动:bin/kafka-server-start.sh -daemon config/kafka.properties(端口9092)

    创建Topic:bin/kafka-topic.sh --create --zookeeper localhost:2181 --topic test --partitions 1 --replication-factor 1(查看状态--describe)

    发送消息:bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test hello world(回车发送)

    消费消息:bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

    吞吐测试脚本:kafka-producer/consumer-perf-test.sh

    2)Topic:每个Topic有若干个partition组成,每个partition有若干个副本,Kafka只能保证分区有序而不是topic有序

    3)消息:每个消息由Key和Value组成,支持4种压缩(0:无压缩;1:GZIP;2:Snappy;3:LZ4)

    4)副本:leader replica和follower replica,follower replica不提供服务只追随leader replica获取数据;AR(Assigned Replicas)、ISR(In-Sync Replicas)、OSR(Out-of Sync Replicas)

    ISR(in-sync replica):与leader副本保持同步的动态replica集合

2.概要设计:

1)高吞吐/低延时:写操作(写入页缓存、io交给操作系统、追加顺序写、微批次),读操作(零拷贝)

大量使用操作系统页缓存,内存操作速度快和命中率高

不直接参与IO操作,交给操作系统

采用追加写入方式

使用以sendfile为代表的零拷贝技术加强网络间的数据传输效率

2)消息持久化:所有消息立即持久化

3)负载均衡和故障转移:负载均衡通过智能化的分区领导选举来实现;故障转移通过心跳和会话的机制来实现

4)伸缩性:启动新kafka服务器即可

3.Producer开发:

1)基本工作流程:消息、分区器(partitioner)、key、分区leader

  producer首先使用线程(用户主线程)将待发送的消息封装进一个ProducerRecord实例,然后序列化后发送给partitioner,再由partitioner确定了目标分区后一同发送到位于producer程序中的一块内存缓存(RecordAccumulator)中,而producer的另外一个工作线程(I/O发送线程,也称sender线程)则负责实时的从缓冲区中提取准备就绪的消息封装到一个批次中,统一发送到对应的broker

备注:如果生产者发送消息的速度超过发送到服务器的速度,则会导致生产者空间不足,这个时候KafkaPro ducer 的send()方法调用要么被阻塞,要么抛出异常,这个取决于参数max.block.ms 的配置,此参数的默认值为60000,即60 秒

2)基本要素(Properties、KafkaProducer、send(ProducerRecord(topic,key,value))、close)

3)发送消息(同步、异步(Callback(onCompletion)))、异常(可重试异常RetriableException和不可重试异常)、重试次数异常

4)主要参数:

基础:bootstrap.servers、key.serializer、value.serializer;

基础准备:buffer.memory=32M;

消息准备:batch.size=16k、linger.ms=0ms;

发送准备:compression.type=0、max.request.size=1M、reties=0、retry.backoff.ms=100ms;

结果:arks(0,1,all)=1、request.session.timeout=30s

5)分区策略:murmurHash2(key)

6)Producer拦截器:ProducerInterceptor(onSend、onAcknowledgement、close)

7)多线程处理:KafkaProducer线程安全,多线程单KafkaProducer实例,多线程多KafkaProducer实例

4.Consumer开发:

1)基础概念:消费组(consumer group)消费组使用一个消费者组名来标识自己,topic的每条消息都只会发送到每个订阅它的消费者组的一个消费者实例上;分区分配策略(partition.assignment.strategy=range、round-robin、sticky);2种消息引擎模型;位移提交(topic _consumer_offsets(group.id+topic+分区号));消费者组重平衡;多线程(消费线程和心跳线程)

2)基本要素(Properties、KafkaConsumer、subscribe、poll、ConsumerRecord)

3)主要参数:

基础:bootstrap.servers、key.serializer、value.serializer、group.id

接受处理数据:max.poll.records=500、fetch.max.bytes、fetch.max.wait.ms (一次拉取等待的最大时间)=500ms、max.poll.interval.ms

处理完以后:enable.auto.commit、connection.max.idle.ms=9分

其他:sesstion.timeout.ms(检查组员崩溃时间)=10s、heartbeats.interval.ms、auto.offset.reset(earliest、latest、none)

4)poll返回条件:足够数据或超时

5)中断方式:一种设置volatile变量,一种wakeup抛出异常

6)提交方式:手动提交(同步异步),自动提交(每隔5秒)

7)重平衡(rebalance):本质是一组协议,规定了一个consumer group是如何达成一致来分配订阅topic的所有分区的

重平衡触发条件:组员发生变更、组订阅topic分区发生变更、组订阅topic数发生变更

rebalance generation

重平衡流程:consumer发起joingroup,coordinate收集,选择leader consumer,lc重新分配,发给coordinater,下发

8)多线程消费:KafkaConsumer非线程安全,一种每个线程维护一个KafkaConsumer,一种单kafkaConsumer+多worker线程

9)consumer拦截器:ConsumerInterceptor(onConsume、onCommit)

5.Kafka设计原理

1)副本和ISR设计:ISR引入是防止落后leader副本进度太多的follower副本被选为leader(参数replica.lag.time.max.ms=10s)

副本不同步原因:请求速度跟不上、进程卡住、新创建的副本

2)LEO更新机制:

follower副本LEO更新:FETCH请求获取数据写log后自动更新LEO

leader副本LEO更新:写log后自动更新LEO

leader副本内follower副本LEO更新:follower副本进行FETCH时上报自己LEO

3)HW更新:

follower副本HW更新:follower副本更新LEO后,比较获取到的leader副本HW和自身当前LEO大小,取较小值

leader副本更新HW更新:4种情况下尝试更新(producer向leader副本写入消息、leader副本处理follower副本FETCH请求、副本成为leader时、被踢出ISR时),通过比较自身包冲follower副本LEO取最小值更新

HW缺陷:数据丢失、数据不一致或离散,通过引入leader epoch解决

4)kafka日志:按照时间顺序在日志尾部追加记录,每个分区都有自己的日志(日志段和日志段索引(位移索引和时间戳索引))

日志留存:基于时间(log.retention=7天),基于大小(log.retention.bytes=-1)

5)精确语义(EOS):

  生产端:幂等性producer(enable.idempotence=true(默认为false))和事务支持

    幂等性:通过每批次消息赋予序列号,同时producer使用producer id形成Map<(PID,分区号),value>,发送序列号小于等于broker端保存的序列号则抛弃,只能保证单个producer实例的EOS

    事务支持:可跨分区保证EOS

  消费端:事务支持

6.kafka监控

1)常用工具:kafka-manager,kafka-monitor,cruiseControl(超大规模Kafka集群)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容