集群和中央控制器

一个独立的Kafka服务器被称为broker。broker用来接收来自生产者的消息,为消息设置偏移量,并把消息保存到磁盘。换句话说,多个kafka实例组成kafka集群,每个实例(server)被称为broker。

broker中央控制器:Kafka集群中多个broker,在Kafka启动时所有的broker会在zk里面注册,只有一个会被选举为broker中央控制器(controller也就是broker的 leader)。

中央控制器产生:

中央控制的主要工作为:

  • 管理整个集群中的分区

  • 监控副本的状态

这些工作如:

  • leader副本故障,由中央控制器负责为该partition重新选举新的leader 副本

  • 当检测到同步列表发生变化,有中央控制器通知集群中所有broker更新其元数据缓存信息

  • 当增加某个topic分区的时候也会由中央控制器管理分区的重新分配工作

broker中央控制器的选举过程:

当broker启动的时候,都会创建KafkaController对象,但是集群中只能有一个leader对外提供服务,这些每个节点上的KafkaController会在指定的zookeeper路径下创建临时节点,只有第一个成功创建的节点的KafkaController才可以成为leader(抢先注入),其余的都是follower。当leader故障后,所有的follower会收到通知,再次竞争在该路径下创建节点从而选举新的leader。

主题、分区

主题就是数据主题,是数据记录发布的地方,可以用来区分业务系统。Kafka中的Topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。

每一个主题可以被分为若干个分区,一个分区就是一个提交日志。消息以追加的方式写入分区

对于每一个topic,Kafka集群都会有一个或者多个分区。分区角色有分为Leader分区和Follower分区。每个分区都是有序且顺序不可变的记录集,并且不断地追加到log文件中。

由于主题一般包含几个分区,因此无法在整个主题范围内保 证消息的顺序,但是同一个分区是有序的。

每个分区是一个有序的,不可变的消息序列,新的消息 不断追加到这个有组织的有保证的日志上。分区会给每 个消息记录分配一个顺序ID号 – 偏移量, 能够唯一地标 识该分区中的每个记录。

Kafka集群保留所有发布的记录,不管这个记录有没有被 消费过,Kafka提供可配置的保留策略去删除旧数据。 例如:如果将保留策略设置为两天,在记录公布后两天 可用于消费,之后它将被丢弃以腾出空间

为什么设计分区?

  • 为了并发读写,加快读写速度;通过这种优化,可以极大的提高并发响应

  • 运用多分区的存储,利于数据的均衡;

  • 加快数据的康复速率。如:一旦某台机器挂了,全部集群只需要康复一部分数据,可加快故障康复的时间。

分区策略:

轮训策略

  如果键值为null,并且使用了默认的分区器,Kafka会根据轮训(Random Robin)策略将消息均匀地 分布到各个分区上

散列策略

  如果键值不为null,并且使用了默认的分区器,Kafka会对键进行散列,然后根据散列值把消息映射到 对应的分区上

黏性分区器

很多时候消息是没有指定Key的。而Kafka 2.4之前的策略是轮询策略,这种策略在使用中性能比较低。所以2.4中版本加入了黏性分区策略(Sticky Partitioning Strategy)。

黏性分区器(Sticky Partitioner)主要思路是选择单个分区发送所有无Key的消息。一旦这个分区的batch已满或处于“已完成”状态,黏性分区器会随机地选择另一个分区并会尽可能地坚持使用该分区——象黏住这个分区一样。

自定义策略

  默认分区器是使用次数最多的分区器。除了散列分区之外,用户可以根据需要对数据使用不一样的分 区策略

总结一下 broker、topic、分区、副本的关系

1.broker与副本:一个broker就是一台服务器,副本是针对服务器的,副本数可以是1到broker数,比如2个服务器副本数就是1-2.

2.broker 和分区:分区会尽可能的均匀分在broker上,比如3个broker,10个分区,那么每个broker上就是3个分区

3.分区和副本:有多少个副本,分区的数据都有多少个重复的。

3.topic与其他:broker、分区、副本都是为了保存好topic数据。topic的数据分散各个分区,假设数据均匀分布那每个分区都是1/分区数 的topic数据。当副本数=broker数时就代表每个broker上都有一份完成的topic数据,如果副本数 < broker数时 每个broker都只有部分的topic数。

如下图无机架的情况下,5个broker-10个分区-3个副本分布。

这种情况下broker-0 上就有p0 p5 p4 p9 p3 p8 六个分区的数据。这个无机架的情况,每个增加一个副本分区位置都会位移+1。

二、kafka 中央控制器、主题、分区、副本的更多相关文章

  1. 入门大数据---Kafka深入理解分区副本机制

    一.Kafka集群 Kafka 使用 Zookeeper 来维护集群成员 (brokers) 的信息.每个 broker 都有一个唯一标识 broker.id,用于标识自己在集群中的身份,可以在配置文 ...

  2. (二)Kafka动态增加Topic的副本(Replication)

    (二)Kafka动态增加Topic的副本(Replication) 1. 查看topic的原来的副本分布 [hadoop@sdf-nimbus-perf ~]$ le-kafka-topics.sh ...

  3. Python 基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控

    基于Python结合pykafka实现kafka生产及消费速率&主题分区偏移实时监控   By: 授客 QQ:1033553122   1.测试环境 python 3.4 zookeeper- ...

  4. Kafka实战宝典:Kafka的控制器controller详解

    一.控制器简介 控制器组件(Controller),是 Apache Kafka 的核心组件.它的主要作用是在 Apache ZooKeeper 的帮助下管理和协调整个 Kafka 集群.集群中任意一 ...

  5. Kafka动态增加Topic的副本

    一.kafka的副本机制 由于Producer和Consumer都只会与Leader角色的分区副本相连,所以kafka需要以集群的组织形式提供主题下的消息高可用.kafka支持主备复制,所以消息具备高 ...

  6. kafka 日常使用和数据副本模型的理解

    kafka 日常使用和数据副本模型的理解 在使用Kafka过程中,有时经常需要查看一些消费者的情况.Kafka健康状况.临时查看.同步一些数据,又由于Kafka只是用来做流式存储,又没有像Mysql或 ...

  7. 【Kafka】《Kafka权威指南》——分区partition

    在上篇的例子里([Kafka]<Kafka权威指南>--写数据), ProducerRecord 对象包含了目标主题.键和值. Kafka 的消息是 一个个 键值对, ProducerRe ...

  8. Maven入门系列(二)--设置中央仓库的方法

    原文地址:http://www.codeweblog.com/maven入门系列-二-设置中央仓库的方法/ Maven仓库放在我的文档里好吗?当然不好,重装一次电脑,意味着一切jar都要重新下载和发布 ...

  9. Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

    Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程 ...

随机推荐

  1. Zabbix 邮箱告警(Python脚本)

    Python 脚本内容 #!/bin/env python #coding:utf- import smtplib from email.mime.text import MIMEText from ...

  2. 根据现有Bitmap生成相同图案指定大小的新Bitmap

    通过一张现有的Bitmap,画出一张同样的但是大小使我们指定的Bitmap 需求:直接createBitmap的话不允许生成的bitmap的宽高大于原始的,因此需要特定方法来将一张Bitmap的大小进 ...

  3. arduino 的analogRead() 和analogWrite()

    模拟输入analogRead()函数的返回值范围是0 到1023; 而模拟输出analogWrite()函数的输出值范围是0 到255; 所以: val = analogRead(potpin); / ...

  4. SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis

    今天项目不忙,想搞一下shardingJDBC分库分表看看,主要想实现以下几点: 舍弃xml配置,使用.yml或者.properties文件+java的方式配置spring. 使用 Druid 作为数 ...

  5. @bzoj - 2658@ [Zjoi2012]小蓝的好友(mrx)

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 终于到达了这次选拔赛的最后一题,想必你已经厌倦了小蓝和小白的故事 ...

  6. 手把手教你学Numpy,这些api不容错过

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题的第5篇文章,我们来继续学习Numpy当中一些常用的数学和统计函数. 基本统计方法 在日常的工作当中,我们经常需要通过一 ...

  7. Java——int、double型数组常用操作工具类

    学了数组之后,感觉有好多操作需要经常去写,很不方便,因此自己做了一个工具类,方便调用,方法可能不全,希望大家可以添加,让我使用也方便一点儿. public class ArrayUtils { //求 ...

  8. C#数据结构与算法系列(五):常见单链表笔试

    1.求单链表中有效节点个数 public static int GetLength(HeroNode headNode) { int length = ; var cur = headNode.Nex ...

  9. WPF入门(2)——依赖属性

    今天我们说说依赖属性 什么是依赖属性? 当然,学术定义依旧Please Baidu:https://baike.baidu.com/item/%E4%BE%9D%E8%B5%96%E5%B1%9E%E ...

  10. fork,vfork和clone底层实现

    分类: LINUX2011-10-13 09:33 1116人阅读 评论(0) 收藏 举报 structdstsignalthreadnulldomain fork,vfork,clone都是linu ...