首页 > 其他分享 >kafka基础原理

kafka基础原理

时间:2022-12-07 15:56:18浏览次数:41  
标签:消费 消费者 分区 Partition 基础 Kafka 原理 kafka 数据

kafka基础原理

1. topic

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

 

此时我需要获取CM的数据,那就直接监听 TopicA 即可。

2. Partition 分区

Kafka 还有一个概念叫 Partition(分区),分区具体在服务器上面表现起初就是一个目录。

一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。

这些分区主要的信息就存在了 .log 文件里面。跟数据库里面的分区差不多,是为了提高性能。

 

 

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

Topic 和 Partition 像是 HBase 里的 Table 和 Region 的概念,Table 只是一个逻辑上的概念,真正存储数据的是 Region。

这些 Region 会分布式地存储在各个服务器上面,对应于 Kafka,也是一样,Topic 也是逻辑概念,而 Partition 就是分布式存储单元。

这个设计是保证了海量数据处理的基础。我们可以对比一下,如果 HDFS 没有 Block 的设计,一个 100T 的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入 Block 后,大文件可以分散存储在不同的服务器上。

注意:

  • 分区会有单点故障问题,所以我们会为每个分区设置副本数
  • 分区的编号是从 0 开始的。

3. Replica 副本

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

 

 而且其实每个副本都是有角色之分的,它们会选取一个副本作为 Leader,而其余的作为 Follower。

我们的生产者在发送数据的时候,是直接发送到 Leader Partition 里面,然后 Follower Partition 会去 Leader 那里自行同步数据,消费者消费数据的时候,也是从 Leader 那去消费数据的

4. 生产者

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

5. 消费者

从消息系统kafka里面读取数据的就是消费者

6. 消费者组

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

我们所熟知的一些消息系统一般来说就是只要有一个消费者去消费了消息系统里面的数据,那么其余所有的消费者都不能再去消费这个数据了。

 但是Kafka 并不是这样,ConsumerA 和ConsumerB在同一个group.id下,ConsumerC 和ConsumerD中重新指定一个另外的 group.id

 ConsumerA 去消费了一个 TopicA 里面的数据,再让 ConsumerB 也去消费 TopicA 的数据,它是消费不到了

但是,ConsumerC 是可以消费到 TopicA 的数据的,而 ConsumerD 也是消费不到的

所以在 Kafka 中,不同组可有唯一的一个消费者去消费同一主题的数据

所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息。

 

 如图,因为前面提到过了消费者会直接和 Leader 建立联系,所以它们分别消费了三个 Leader,所以一个分区不会让消费者组里面的多个消费者去消费,但是在消费者不饱和的情况下,一个消费者是可以去消费多个分区的数据的

消费者和分区是一对多的关系

7. Controller与Zookeeper

Kafka 也是主从式的架构,主节点就叫 Controller,其余的为从节点,Controller 是需要和 Zookeeper 进行配合管理整个 Kafka 集群。

Kafka 和 Zookeeper 如何配合工作

Kafka 严重依赖于 Zookeeper 集群,所有的 Broker 在启动的时候都会往 Zookeeper 进行注册,目的就是选举出一个 Controller。

这个选举过程非常简单粗暴,就是一个谁先谁当的过程,不涉及什么算法问题。

那成为 Controller 之后要管理做啥呢?

它会监听 Zookeeper 里面的多个目录,其他从节点往目录上注册各个节点必定会暴露自己的主机名,端口号等等的信息,此时 Controller 就要去读取注册上来的从节点的数据(通过监听机制),生成集群的元数据信息,之后把这些信息都分发给其他的服务器,让其他服务器能感知到集群中其它成员的存在。

比如创建一个topic就会创建一个目录,Kafka 会把分区方案生成在这个目录中,此时 Controller 就监听到了这一改变,它会去同步这个目录的元信息,然后同样下放给它的从节点,通过这个方法让整个集群都得知这个分区方案,此时从节点就各自创建好目录等待创建分区副本即可。这也是整个集群的管理机制。

kafka数据是写在磁盘上的性能为啥快?

1. 顺序写

Kafka 的设计中,数据其实是存储在磁盘上面,一般来说,会把数据存储在内存上面性能才会好。

但是 Kafka 用的是顺序写,追加数据是追加到末尾,磁盘顺序写的性能极高,在磁盘个数一定,转数达到一定的情况下,基本和内存速度一致。如果是随机写的话就会降低性能

2. 零拷贝

先来看看非零拷贝的情况:

 

 

可以看到数据的拷贝从内存拷贝到 Kafka 服务进程那块,又拷贝到 Socket 缓存那块,整个过程耗费的时间比较高。

Kafka 利用了 Linux 的 sendFile 技术(NIO),省去了进程切换和一次数据拷贝,让性能变得更好。

 

标签:消费,消费者,分区,Partition,基础,Kafka,原理,kafka,数据
From: https://www.cnblogs.com/Mr-shen/p/16963310.html

相关文章

  • Android.mk基础知识
    Android.mk用于构建系统描述源文件和共享库,它实际上是一个微小的GNUmakefile片段,构建系统会将其解析一次或多次。1.AOSP示例我们以hello-jni开始熟悉Android.mk,位于And......
  • JAVA基础
    JAVA基础命名规范项目名全小写包全小写域名反写:从大到小类 大驼峰命名:每个单词首字母大写,其他字母小写方法小驼峰命名......
  • 实时数仓原来如此:Kafka+Flink+Hudi
    原来使用kafka消费者直接进行mysql数据同步,现在发现当时只考虑了数据的同步,对于后续数据的存储和使用没有考虑全面。面对大量流式数据,面向的是应用,数据同步之后,数据如何存......
  • Mysql复制原理
    复制采用异步方式,效率高。 ......
  • 来啦!滤波SLAM之MSCKF原理解析与源码详解
    以下内容来自从零开始机器人SLAM知识星球每日更新内容点击领取学习资料→机器人SLAM学习资料大礼包MSCKF全称Multi-StateConstraintKalmanFilter(多状态约束卡尔曼......
  • PHP扩展 Opcache工作原理
    PHP工作原理首先,我们先了解下解释型语言PHP的工作原理,这有利于我们了解PHPOpcache。对于PHP,我们常用的是cli模式和php-fpm模式。下面我们拿cli模式来描述下php执行脚本......
  • 手写vue-router核心原理
    最近也在观察vue3新特性,抽空玩一玩嵌套路由的vue-router,直接上代码项目目录结构代码展示app.vue<template><divid="app"><div><router-linkto="/"......
  • Webpack插件核心原理
    引言围绕Webpack打包流程中最核心的机制就是所谓的Plugin机制。所谓插件即是webpack生态中最关键的部分,它为社区用户提供了一种强有力的方式来直接触及webpack......
  • 机器学习--CF协同过滤推荐算法原理
    1.1概述什么是协同过滤(CollaborativeFiltering,简称CF)?首先想一个简单的问题,如果你现在想看个电影,但你不知道具体看哪部,你会怎么做?大部分的人会问问周围的朋友,看看最......
  • 算法基础课
    给定nn个正整数aiai,请你输出这些数的乘积的约数之和,答案对109+7109+7取模。输入格式第一行包含整数nn。接下来nn行,每行包含一个整数aiai。输出格式输出一个......