专栏首页T客来了内功提升-kafka入门到精通

内功提升-kafka入门到精通

debug-kafka

这个专题的主要目的是debug kafka,并从中学习到kafka的架构原理,以及底层实现,提升抽象思维、汲取优秀设计思想、实现场景复用,当然也能实现与面试官侃大山。

章节

  • 消息队列两种模式
  • 消息队列的作用
  • kafka基础架构
  • kafka快速入门
  • kafka架构深入 kafka工作流程及文件存储机制

kafka producer

  • kafka 分区策略
  • kafka 数据可靠性保证

kafka 消费者

1. 消息队列两种模式

1.1 点对点 (point-to-point)

点对点模式,一对一的关系,消费者主动去拉取消息进行处理
 

1.2 发布订阅模式

消息生产者将消息发送到topic中,同时会有多个消费者(订阅)消费该消息,和点对点方式不同发布到topic的消息会被所有订阅者消费。
 

topic 根据消费者订阅列表,主动推送消息给订阅者,如果消费者的处理能力比较弱,则会消息会产生积压。订阅有两种模式:1. 消费者主动从topic 拉取数据 2. topic 主动推 拉取的模式有缺点,实时获取消息,轮训topic,获取信息,长时间没有消息,会出现长轮训,会浪费消费者的资源。

2. 消息队列的作用

2.1 解耦合;

2.2 削峰填谷,做一层缓冲;

2.3 同步通信转为异步通信;

3. kafka 基础架构

3.1 kafka集群拆解

  1. one server = one broker
  2. one broker contains many topics
  3. one topic contains many partitions - partition load balance(提高并发 + 实现负载均衡能力)
  4. one partition has many fllowers one leader has many followers partition 有副本 topic 有partitions , broker 有多个topic topic 是一个逻辑单位, 对数据做了一个分类 消息存储在partation当中

注意客户端请求zk leader 和 follower 分读写请求,写请求打到follower上 ,先将请求转发给leader,leaderchu

主题是分区的,且有副本的概念,leader接收所有的请求,副本只做一个容灾,这样当leader挂掉之后,follower可以顶上来

3.2 消费者的消费机制

2 consumer group - 消费者组 某一个分区的数据只能被同一个消费者组里面的某一个(only)消费者消费, 多个分区数据 可以被同一个消费者组里面 一夫多妻制度, 可以将消费者组里面的消费者想象成男性,分区想象成女性 提高并发处理能力的一个机制

消费者组的消费者个数与 partition 分区个数保持一致

3.3 zk的作用以及zk作用的削弱

zk 存储kafka集群的信息,kafka集群信息被zk集群统一管理 consumer 挂掉之后,需要从index + 1 处开始,已经消费的位置信息,需要存储在zk中。

0.9 版本之前offset 存在zk 0.9 版本之后offset 存储在本地 存在kafka系统当中,kafka系统生成topic 为什么改? 消费者拉取(kafka消费者消费信息的手段) 频繁跟zk打交道(频繁在zk中更新offset,zk的压力也会比较大)效率不高。

消息存在磁盘,存在内存干不了这个事情,默认存7天,168小时

4. kafka 快速入门

4.1 kafka 安装部署

1. 设置broker_id
 
2. 设置kafka运行日志(消息数据)存放的路径
 
3. 配置需要的zk集群连接,上报自身meta信息的远程zk集群地址
 

4.2 kafka 集群规划

 采用哨兵模式 sentinal (zk能够保持数据强一致的原因) 

4.3 kafka broker 启动、topic curd、 生产者、消费者 实例演示:

4.3.1 启动zk

kafka内置了zk,可以使用内置zk在单机上启动一个zk服务进程(哨兵、集群、与选举模式 & 如何保证一致性,这颗好好研究一下,)
 
nohup bin/zookeeper-server-start.sh config/zookeeper.properties > /data/home/bofengliu/soft/logs/zk.log 2>&1 &
 

(PS:zk的作用) zk 用来存储维护broker集群的的meta信息,如topic的信息,0.9 版本以前consoumer 最近消费的message offest 会记录在zk中,0.9 版本以后消费者的消费offset 由broker集群自己维护。

4.3.2 启动kafka

虽然kafka有-dameond 后台启动的选项,但是没有日志,这个比较痛苦,所以采用nohup & + 日志的方式启动

nohup bin/kafka-server-start.sh config/server_0.properties > /data/home/bofengliu/soft/logs/kas_0.log 2>&1 &
 
nohup bin/kafka-server-start.sh config/server_1.properties > /data/home/bofengliu/soft/logs/kas_1.log 2>&1 &
 
nohup bin/kafka-server-start.sh config/server_2.properties > /data/home/bofengliu/soft/logs/kas_2.log 2>&1 &
 

4.3.3 kafka server topic 操作

4.3.3.1 查看当前kafka集群主题

bin/kafka-topics.sh --list --zookeeper localhost:2181
 

注意: --list 后面不跟 --zookeeper 参数是查询不出来的,因为zk上存储了topic的相关元数据

4.3.3.2 新增topic主题 -- 对消息进行分类

bin/kafka-topics.sh  --create --zookeeper localhost:2181 --topic first_test --partitions 2 --replication-factor 2
 

注意: bin/kafka-topics.sh --help 可以显示当前的命令提示 --topic 后面紧跟主题名字 --partitions 紧跟这个 topic 对应的分区数量 当前我们设置为2 --replication-factor 设置每个分区的副本数量 当前我们设置为2

然后查看下kafka存储log(其实也存储消息数据的)目录,如下图所示:

我们发下在topic name 后面会加上-0、-1的数字,这个数字代表着分区号,而且每个分区目录会copy 两份,且存放在不同的目录里面(PS: 其实不同的目录在真实 的生产环境中代表不同的server,)即统一分区的不同副本不会存储在同一server上,这也很容易理解,如果同一分区的不同副本存储在同一台server, 那么当这台 机器宕机之后副本的容灾能力就太鸡肋了。

文件夹的名字 = [topic_name] + [partition index](PS:) 创建主题时, 分区的副本数量不能超过kafka集群server的总数量

4.3.3.3 删除topic

  1. bin/kafka-topic.sh --delete --zookeeper localhost:2181 --topic third-test

删除后的效果如下所示:

4.3.3.4 查看主题详情

  1. bin/kafka-topics.sh --describe --topic first-test --zookeeper localhost:2181

4.3.4 生产者,消费者控制台命令:

4.3.4.1 生产者生产命令- console 演示 -

命令格式: kafka-console-producer.sh --topic [topic-name] --broker-list [one broker of brokers 地址,ip:port]

  1. bin/kafka-console-producer.sh --topic first-test --broker-list localhost:9093

参数详解:

  • --topic topic-name
  • broker-list 对应 kafka broker 集群

4.3.4.2 消费者消费命令- console 演示

命令格式: old-version: kafka-console-consumer.sh --topic [topic-name] --zookeeper [zk 地址] new-version: kafka-console-consumer.sh --topic [topic-name] --bootstrap-server

4.3.4.3 the consumer of old version

  1. kafka-console-consumer.sh --topic first-test --zookeeper localhost:2181 (PS: 与生产者的标准终端打开方式不同)

4.3.4.4 the consumer of new version

  1. kafka-console-consumer.sh --topic first-test --bootstrap-server

broker 记录消费者已经消费的消息的offset, kafka 分配专门的消费topic __consumer-offset 默认50个分区,均匀分配在kafka的多台brokers 上。--from-beginning 所有数据都可以消费

5 kafka架构深入

5.1 kafka工作流程及文件存储机制

5.1.1 kafka 工作流程

(PS: 这幅图中描述的重点信息都在图中有描述了,可以对照记忆一下)

5.1.2 kafka 文件存储机制

新概念: 1个partition 是由 n 个 segment 片段数据组成的,如0...0.log 0...1.log one segment 的最大大小为sever.properties 中配置的 log.segment.bytes=1073741824 默认为1G大小 那么产生两个问题:

  1. 超过1g 新的 segment 命名 问题;
  2. 快速定位到想要的数据 - 依赖到0...0.index文件

如下是上面两个问题对应的kafka 解决方案: 由于生产者会不断追加到log文件末尾,为了防止log文件过大导致数据定位效率底下,kafka采取了 分片and 索引机制,且分片文件命名与索引文件命名的前缀保持一致 索引文件命名成 *.index 数据分片 segment 命名为 *.log, 这些文件位于一个文件夹下,该文件夹的命名规则为: [topic name] + [partition name]

关于kafka架构的深入探索,会在出现在后续的推文中,敬请期待!

本文分享自微信公众号 - T客来了(ltdo11),作者:bofeng

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python内置函数sorted()从入门到精通

    Python内置函数sorted()可以对列表、元组、字典、集合、字符串、range对象以及其他可迭代对象进行排序,返回排序后的列表,支持使用key参数指定排序...

    Python小屋屋主
  • 汇编语言从入门到精通-通用寄存器功能的说明

      数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。

    墨文
  • Genesis框架从入门到精通(3):框架的内置动作

    在本系列的第一部分, Genesis框架从入门到精通(1):什么是框架? ,从总体上解释了Genesis框架是如何工作的,并展示了文件中的钩子长什么样子。在第二...

    丘壑
  • Genesis框架从入门到精通(4):框架的内置动作(续)

    在本系列的前一篇 Genesis框架从入门到精通(3):框架的内置动作 ,我解释了在哪里找Genesis 的内置动作,以及如何使用钩子移除,移动或改变动作。在这...

    丘壑
  • 一篇文章教你从入门到精通 Google 指纹验证功能

    Google 从 Android 6.0开始,提供了开放的指纹识别相关 API,通过此篇文章可以帮助开发者接入指纹验证的基础功能,并且提供了系统应用基于指纹验证...

    2020labs小助手
  • Kafka:高吞吐量、消息精确一次语义以及保证消息顺序

    Kafka 最初由 Linkedin 公司开发,是一个分布式、支持分区的、多副本的,基于 Zookeeper 协调的分布式消息系统,其最大的特性就是可以实时的处...

    CG国斌
  • 消息系统兴起二次革命:Kafka不需要ZooKeeper

    微服务平台 TSF、消息队列 CKafka / TDMQ、微服务观测平台 TSW 等中间件产品的负责人

    腾讯云中间件团队
  • 内存泄露从入门到精通三部曲之排查方法篇

    1 最原始的内存泄露测试 重复多次操作关键的可疑的路径,从内存监控工具中观察内存曲线,是否存在不断上升的趋势且不会在程序返回时明显回落。 这种方式可以发现最基本...

    腾讯Bugly
  • 内存泄露从入门到精通三部曲之基础知识篇

    1 首先以一个内存泄露实例来开始本节基础概念的内容: 实例1:(单例导致内存对象无法释放而泄露) ? ? 可以看出ImageUtil这个工具类是一个单例,并引...

    腾讯Bugly
  • Genesis框架从入门到精通(5):框架的内置动作(又续)

    现在你已经了解了什么是动作,已经如何使用它们来添加新内容、移动和删除现有内容,可能你还会用到一个更有用的技巧。那就是:

    丘壑
  • 还没使用过消息队列?这一份书单值得你好好看看!

    Java工程师往往容易忽视的一块知识点,其实就是Java网络编程,为什么呢,因为如果我想写一个Java Web项目,我只要用SSM就可以轻松搞定,写好我们的co...

    程序员书单
  • 还没使用过消息队列?这一份书单值得你好好看看!

    Java工程师往往容易忽视的一块知识点,其实就是Java网络编程,为什么呢,因为如果我想写一个Java Web项目,我只要用SSM就可以轻松搞定,写好我们的co...

    程序员书单
  • Guide哥从毕业到入职半年的感受!工作之后我学到了什么?

    如果大家看过我之前的介绍的话,就会知道我是 19 年毕业的几百万应届毕业生中的一员。这篇文章主要讲了一下我入职大半年的感受,文中有很多自己的主观感受,如果你们有...

    Guide哥
  • 时隔多年。。终于有一款云原生消息系统出仕了!

    这两年,圈子里关于海量数据、复杂业务场景的探讨越来越多,一方面是居安思危,另一方面是,大家对成熟系统的追求一直在升级。也难怪,毕竟现在高级工程师的门槛都上升到系...

    米开朗基杨
  • Kafka经典面试题,你都会吗?

    最近工作中呢,频频用到消息中心,包括异步转同步的功能,分布式收集日志信息等功能,在面试中也常会问到候选人关于消息中心的知识点,但大多数程序员,尤其是工作两三年的...

    Bug开发工程师
  • Kafka 2.5.0发布——弃用对Scala2.11的支持

    下载地址:https://kafka.apache.org/downloads#2.5.0

    实时计算
  • Kafka如何保证数据可靠性

    即发送的数据根本没有保存到Broker端。出现这个情况的原因可能是,网络抖动,导致消息压根就没有发送到 Broker 端;也可能是消息本身不合格导致 Broke...

    程序员酷森
  • 重磅发布:Kafka迎来1.0.0版本,正式告别四位数版本号

    Kafka 从首次发布之日起,已经走过了七个年头。从最开始的大规模消息系统,发展成为功能完善的分布式流式处理平台,用于发布和订阅、存储及实时地处理大规模流数据。...

    Spark学习技巧
  • 大数据技术学习路线指南

    要说当下IT行业什么最火?ABC无出其右。所谓ABC者,AI + Big Data + Cloud也,即人工智能、大数据和云计算(云平台)。每个领域目前都有行业...

    用户2292346

扫码关注云+社区

领取腾讯云代金券