guicaizhou 2019-11-06
First: Kafka 是什么?
Kafka 是一个发布订阅系统 最初是是LinkedIn 开发 最后交给Apache 开源组织 github地址:https://github.com/apache/kafka 是用java 和Scala 去开发的~
Kafka 现在主要用于 消息队列使用
Kafka 是一个快速 可扩展 内在就是分布式的系统
分布式: Kafka 提供集群服务 Kafka cluster 可以由一个或者多个Broker 组成 每个Broker 提供对客户端的服务
分区: 每一类消息 或者叫订阅主体 topic 可以有很多分区 Partition
复制:一个topic 的分区有多个副本,按照一定的规则分布在broker集群中,副本可分为leader和follow,leader所在broker负责响应客户端的读写请求,follow周期性地同步leader数据,已防止leader故障后消息丢失
常见的术语有哪些
Broker :
Kafka集群包含一个或多个服务器,这种服务器被称为broker。broker端不维护数据的消费状态,提升了性能。直接使用磁盘进行存储,线性读写,速度快:避免了数据在JVM内存和系统内存之间的复制,减少耗性能的创建对象和垃圾回收
Topic && Partition :
Topic 是指消息发送的服务器的类别 消费着用此类别去订阅消息 比如我订阅的是苏州日报 还是人民日报等此意思,topic 可存在于一个或者多个broker 中 消费者 不用关心 存储在那个broker 中 就像 我们网上买东西 我们不关心 这个东西存在那个物流仓库里面 反正会有快递员 给我送过来~
每个topic 会有存一个或者多个Partition 中 每个Partition 都能保证有序 Partition 物理地址中 对应的是一个文件夹 文件夹中 这个目录下有两类文件,一类是以log为后缀的文件,另一类是以index为后缀的文件 每一个log文件和一个index文件相对应,这一对文件就是一个Segment File,其中的log文件就是数据文件,里面存放的就是Message,而index文件是索引文件。Index文件记录了元数据信息,指向对应的数据文件中Message的物理偏移量。
Partition 的存在 线性的提高的kafka的吞吐效率
Topic 是一个逻辑概念 最终真正的物理实现是partition 当创建topic 的时候会指定partition的数量 数量越大 其吞吐能力越强 但是也越消耗资源
Producer:
发布消息到Kafka Broke
Consumer && Consumer Group:
Consumer:消息的消费者,从Kafka Broker中拉取消息的客户端
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)
每个Partition 只会被Consumer Group中的一个Consumer 顺序消费 每个Consumer Group 中的一个Consumer 会消费一个或者多个Partition
所以设置topic 中的Pattition 的数量要根据 Consumer Group 中的consumer 做参考 一般是相等 如果Consumer group 的数量大于订阅的topic 中的partition 数量多导致 其中一个consumer 没法消费数据
保存位置: 在老版本中offset保存在zk中,而在新版本中offset保存在kafka自己的一个名为consumer_offsets的topic中.
为了防止consumer在处理消息过程中,出现消息丢失的情况,也可以由consumer将offset保存到第三方库中,由consumer自己维护,比如redis,mysql中.
唯一标识 :offset以groupid,topic,partition组成的三元组来唯一区分不同的partition分区的偏移量.
Replica
副本,Kafka中同一条消息拷贝到多个地方做数据冗余,这些地方就是副本,副本分为Leader和Follower,角色不同作用不同,副本是对Partition而言的,每个分区可配置多个副本来实现高可用
Record
消息,Kafka处理的对象
Second:Kafka 有什么特点
1:持久化 消息存储在磁盘中 为什么存在磁盘中还能这么快 后面进阶慢慢去分析 得益于他的文件存储结构
2:高吞吐 由于每个topic 可以分别存储于每个partition 中 可以横向扩展 线性的提高了Kafka 的吞吐量
3:分布式 kafka 可以有一个或者多个Broker 本来就是一个分布式的架构系统 可快速的去平滑扩展
4:实时性 由于消息持久化,使kafka可以支持离线; 实时性使kafka又可以支持在线,可用于一些流计算
End: Kafka 用于哪些场景
正是由于具有实时性的特点
常见的架构组合:Flume+Kafka+Storm/Spark streaming +Hbase/Hive
Flume+Kafka+Hdfs 搭建实时日志收集系统
Flume+Kafka+Storm/Spark streaming :搭建流数据处理系统
下篇:
1: 消费位置offset 怎么去维护存储的
2:Kafka 文件存储机制 怎么去存储 怎么去查询
3:kafka 中zk 是怎么工作的?
问题分析:
1:Kafka全局消费的有序性
3:Kafka 为什么这么快
参考文献如下: