代码编织梦想

kafka整体架构

先上一个整体架构图,如下图。
在这里插入图片描述
图一:集群整体架构,P代表partition的leader, r代表partition的follower

对各个组件说明如下:

  • Broker: Kafka服务器节点就是被称为Broker,Broker主要负责创建并存储Topic,存储Producer所发布的消息,记录消息处理的过程,现是将消息保存到内存中,然后持久化到磁盘。

  • Topic: 就是数据主题,是数据记录发布的地方,可以用来区分业务系统,同一个Topic的消息可以分布在一个或多个Broker上,一个Topic包含一个或者多个Partition分区,数据被存储在多个Partition中。

  • Partition: 一个Topic在Broker中被分为1个或者多个Partition。分区才是真正存储数据的单元。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。
    如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。
    如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。
    如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。
    每个partition有多个副本(replication-factor设置):

  • Leader 每个partition多个副本中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。

  • Follower leader的备份,follwers只需被动的同步leader上的数据。当leader宕机了,followers中的一台服务器会自动成为新的 leader。每台 server 都会成为某些分区的 leader 和某些分区的 follower,因此集群的负载是平衡的。

  • Producer: 消息和数据的生产者,主要负责生产Push消息到指定Broker的Topic中。生产者负责将记录分配到topic的哪一个
    partition(分区)中。可以使用循环的方式来简单地实现负载均衡,也可以根据某些语义分区函数(例如:记录中的key)来完成。

  • Consumer: 消息和数据的消费者,主要负责主动到已订阅的Topic中拉取消息并消费 消费者使用一个 消费组 (Consumer
    Group)名称来进行标识,发布到topic中的每条记录被分配给订阅消费组中的一个消费者实例.消费者实例可以分布在多个进程中或者多个机器上,如下图所示:

    在这里插入图片描述
    图二:消费者用消费组标识

    如果所有的消费者实例在同一消费组中,消息记录会负载平衡到每一个消费者实例.
    如果所有的消费者实例在不同的消费组中,每条消息记录会广播到所有的消费者进程.

  • Offset: 分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。在每一个消费者中唯一保存的元数据是offset(偏移量)即消费在log中的位置.偏移量由消费者所控制:通常在读取记录后,消费者会以线性的方式增加偏移量,但是实际上,由于这个位置由消费者控制,所以消费者可以采用任何顺序来消费记录。例如,一个消费者可以重置到一个旧的偏移量,从而重新处理过去的数据;也可以跳过最近的记录,从"现在"开始消费。

    在这里插入图片描述
    图三:offset在partition示意图

  • ZooKeeper: ZooKeeper负责维护整个Kafka集群的状态,存储Kafka各个节点 的信息及状态,实现Kafka集群的高可用,协调Kafka的工作内容。

    Broker和Consumer有使用到ZooKeeper,而Producer并没有使用到ZooKeeper,因为Kafka从0.8版本开始, Producer并不需要根据ZooKeeper来获取集群状态,而是在配置中指定多个Broker节点进行发送消息,同时跟指定 的Broker建立连接,来从该Broker中获取集群的状态信息,这是Producer可以知道集群中有多少个Broker是否在 存活状态,每个Broker上的Topic有多少个Partition,Prodocuer会将这些元信息存储到Producuer的内存中。如果Producoer像集群中的一台Broker节点发送信息超时等故障,Producer会主动刷新该内存中的元信息,以获取当 前Broker集群中的最新状态,转而把信息发送给当前可用的Broker,当然Prodocuer也可以在配置中指定周期性的去刷新Broker的元信息以更新到内存中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/zwq00451/article/details/111060132

53. 翻转字符串中的单词 ( 字符串 )-爱代码爱编程

LintCode: 53. 翻转字符串中的单词 easy, 硬拆模拟 先以空格分割出每个单词,然后从后向前依次添加单词即可。 AC Code public class Solution { /* * @param s: A string * @return: A string */ public S

JavaSE_集合-爱代码爱编程

集合类 集合概述Collection接口List接口ArrayListVectorLinkedListSet接口HashSetTreeSetMap接口HashMapHashtableTreeMapIterator接口 集合概述 1、类集设置的目的(重点) 对象数组有那些问题?普通的对象数组的最大问题在于数组中的元素个数是固定的,不能动态的扩充

美团十年架构师精心分享:手写分布式消息中间件RocketMQ笔记-爱代码爱编程

RocketMQ作为一款高可靠、低延迟、高并发、支持海量Topic的分布式消息中间件,服务于阿里巴巴、VIPKID、 滴滴出行、微众银行、华为等国内各大企业。在阿里巴巴内的业务涵盖了阿里巴巴全部的业务,也是双11的核心链路支撑者之一。笔者所在公司选择它,也是由于RocketMQ具有高可靠、吞吐高的特点。 本篇介绍了RocketMQ的基本使用方法

Java什么叫方法-爱代码爱编程

1.首先方法是什么 1.解决某一件事的功能实现。方法,是一段代码块的封装,方法中的代码应围绕某一功能的实现来写,目标明确,逻辑清晰。方法的语法格式 2.格式:在Java中,声明一个方法的具体语法格式如下: 修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,......){ 执行语句 1.方法的调用 2.变量的操作:声明 赋值

凭借这份pdf三个月拿到饿了么P6的offer,今年真的太难了!-爱代码爱编程

前言 最近一位年前裸辞的朋友来找我诉苦,说因为疫情原因现在都在家吃老本。本想着年后就来找工作的,但是现在这个情况也不好找,而且很多公司也随着这次疫情面临着资金紧缺导致裁员严重的甚至倒闭,导致很多人失业找不到工作,就更加竞争压力大了 朋友说自己实力不过关,很多面试题都答不上,问我有没有之前的面试总结,于是我给了他这份(核心知识点)还有一些面试题总结。现在

2020-12-12-继承-爱代码爱编程

继承 5.1.什么是继承? 1.继承体现的是一种父子关系。 2.由一个已有的类创建出新类的机制。【扩展】 已有的类----父类 新类-----------子类 3.面向对象的特征 5.2.如何完成一个继承关系? 已有的类----父类 新类-----------子类 通过extends关键字实现继承关系 继承格式: public  c

从小白的角度讲解kafka并使用java、python_API-爱代码爱编程

目录 1. 什么是kafka 1.1 基本概述 1.2 深度讲解 2. kafka的安全机制 3. python_API 3.1 作为生产者连接kafka并发送数据 1. 什么是kafka 1.1 基本概述 提前说明,以下主要涉及kafka、topic、partition、broker、offset、replica、leader、foll

kafka核心内容讲解-爱代码爱编程

存储策略 每个topic有多个分区组成,而每个分区由多个segmet组成,每个segment由.log文件和.index文件组成index文件主要保存消息的偏移量,根据消息的偏移量以及消息大小快速定位到消息的位置 当查找消息时采用二分查找 生产者 分区原因 方便在集群中扩展提高并发分区原则 producer在发送消息时把每条消息包装成一个produ

悄悄掌握 Kafka 常用命令,再也不用全网搜索了(建议收藏)-爱代码爱编程

点击上方蓝色“大数据实战演练”,选择“设为星标”或“置顶” 回复“资源”领取独家整理的学习资料! 每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。 放弃不难,但坚持很酷~ 前言 对于从事大数据相关职位的朋友们来说,使用 kafka 的频率应该不会少。为了解决各位在操作 kafka 时记不住命令参数的痛点,所以我整理了

kafka原理解析之-高性能内幕-爱代码爱编程

一、日志持久化设计 1. partition的持久化队列结构:数据按先后顺序依次追加在文件末尾,读写操作分开,如下图所示。 这种结构有如下优势: 所有的操作复杂度都是O(1),读操作不会阻塞写操作,读操作之间也不会互相影响。由于性能和数据大小完全分离开来——服务器现在可以充分利用大量廉价、低转速的1+TB SATA硬盘,通过顺序写的方式追加数据。

Kafka 使用java api从指定位移消费 (从开头消费/从结尾消费)-爱代码爱编程

一、auto.offset.reset值详解 在 Kafka 中,每当消费者组内的消费者查找不到所记录的消费位移或发生位移越界时,就会根据消费者客户端参数 auto.offset.reset 的配置来决定从何处开始进行消费,这个参数的默认值为 “latest” 。 auto.offset.reset 的值可以为 earliest、latest 和 no

kafka原理解析之-消息交付语义-爱代码爱编程

消息交付语义 kafka消息交付语义假设存在完美无缺的 broker, 从producer 和 consumer 角度讨论数据保证机制,主要表现重试生产消息或重新消费消息(可能是不同的消费实例)时的情况。 Kafka提供了三种消息交付语义,如下。 At most once——消息可能会丢失但绝不重传。At least once——消息可以重传但绝不丢