大白话 + 13 张图解 Kafka

2020-05-22 00:00:00 数据 线程 分区 消费 消费者

  • 前言
  • 一、Kafka基础
    • 消息系统的作用
    • 1.Topic 主题
    • 2.Partition 分区
    • 3.Producer - 生产者
    • 4.Consumer - 消费者
    • 5.Message - 消息
  • 二、kafka的集群架构
    • Replica - 副本
    • Consumer Group - 消费者组
    • Controller
    • kafka和zookeeper如何配合工作
  • 加餐时间
    • 1.Kafka性能好在什么地方?
    • 2.日志分段存储
    • 3.Kafka的网络设计
  • finally

  • 《Java 2019 超神之路》
  • 《Dubbo 实现原理与源码解析 —— 精品合集》
  • 《Spring 实现原理与源码解析 —— 精品合集》
  • 《MyBatis 实现原理与源码解析 —— 精品合集》
  • 《Spring MVC 实现原理与源码解析 —— 精品合集》
  • 《Spring Boot 实现原理与源码解析 —— 精品合集》
  • 《数据库实体设计合集》
  • 《Java 面试题 —— 精品合集》
  • 《Java 学习指南 —— 精品合集》

前言

应大部分的小伙伴的要求,在Yarn之前先来一个kafka的小插曲,轻松愉快。

一、Kafka基础

消息系统的作用

应该大部份小伙伴都清楚,用机油装箱举个例子



所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。

引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。



按照刚刚前面提到的消息系统的作用,我们知道了消息系统其实就是一个模拟缓存 ,且仅仅是起到了缓存的作用 而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。

1.Topic 主题

kafka学习了数据库里面的设计,在里面设计了topic(主题),这个东西类似于关系型数据库的表



此时我需要获取中国移动的数据,那就直接监听TopicA即可

2.Partition 分区

kafka还有一个概念叫Partition(分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。这些分区主要的信息就存在了.log文件里面。跟数据库里面的分区差不多,是为了提高性能。



至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多

Topic和partition像是HBASE里的table和region的概念,table只是一个逻辑上的概念,真正存储数据的是region,这些region会分布式地存储在各个服务器上面,对应于kafka,也是一样,Topic也是逻辑概念 ,而partition就是分布式存储单元。这个设计是保证了海量数据处理的基础。我们可以对比一下,如果HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以分散存储在不同的服务器上。

注意:1.分区会有单点故障问题,所以我们会为每个分区设置副本数

2.分区的编号是从0开始的

3.Producer - 生产者

往消息系统里面发送数据的就是生产者



4.Consumer - 消费者

从kafka里读取数据的就是消费者



5.Message - 消息

kafka里面的我们处理的数据叫做消息

二、kafka的集群架构

创建一个TopicA的主题,3个分区分别存储在不同的服务器,也就是broker下面。Topic是一个逻辑上的概念 ,并不能直接在图中把Topic的相关单元画出



需要注意:kafka在0.8版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的kafka

Replica - 副本

kafka中的partition为了保证数据安全,所以每个partition可以设置多个副本。

此时我们对分区0,1,2分别设置3个副本(其实设置两个副本是比较合适的)



而且其实每个副本都是有角色之分的,它们会选取一个副本作为leader,而其余的作为follower,我们的生产者在发送数据的时候,是直接发送到leader partition里面 ,然后follower partition会去leader那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的



Consumer Group - 消费者组

我们在消费数据时会在代码里面指定一个group.id,这个id代表的是消费组的名字,而且这个group.id就算不设置,系统也会默认设置

conf.setProperty("group.id","tellYourDream")

相关文章