1、Kafka概览

Apache下的项目Kafka(卡夫卡)是一个分布式流处理平台,它的流行是因为卡夫卡系统的设计和操作简单,能充分利用磁盘的顺序读写特性。kafka每秒钟能有百万条消息的吞吐量,因此很适合实时的数据流处理。例如kafka在线日志收集系统可作为flume的实时消息sink端,再通过kafka的消费者将消息实时写入hbase数据库中。

卡夫卡以topic分类对记录进行存储,每个记录包含key-value和timestamp。

1.1卡夫卡系统的组件、角色

broker: 每个正在运行的kafka节点

producer:消息生产者

consumer:消息的消费者

consumer group:消费者组,同一个消费者组只能有一个consumer能消费消息

kafka server :也叫作broker, 已部署kafka的服务器, 以broker.id来区分不同的服务器

topic:主题, 主题中的每条消息包括key-value和timestamp。可以定义多个topic,每个topic又可以划分为多个分区

partition:topic下的消息分区,通过key取哈希后把消息映射分发到一个指定的分区,每个分区都映射到broker上的一个目录。一般每个分区存储在一个broker上

replica:副本, 每个分区按照生产者的消息达到顺序存放。每个分区副本都有一个leader

leader replica:leader角色的分区副本,leader角色的分区处理消息的读写请求. Leader和follower位于不同的broker.

follower replica:follower角色的分区副本,负责从Leader拉取数据到本地,实现分区副本的创建

zookeeper:严格来说这不是kafka的组件。但是在Kafka集群中, 很有必要通过Zookeeper管理kafka集群的配置、选举leader,以及在Consumer Group发生变化时进行rebalance。下面说一下kafka的哪些组件需要注册到zookeeper——

为什么要注册到zk集群?
1,Kafka集群通过Zookeeper来管理kafka的配置,选举leader;
2,在Consumer Group发生变化时进行rebalance
3,所有的topic与broker的对应关系都由zk维护

kafka的哪些组件需要注册到zookeeper?
(1)Broker注册到zk
每个broker启动时,都会注册到zk中,把自身的broker.id通知给zk。待zk创建此节点后,kafka会把这个broker的主机名和端口号记录到此节点

(2)Topic注册到zk
当broker启动时,会到对应topic节点下注册自己的broker.id到对应分区的isr列表中;当broker退出时,zk会自动更新其对应的topic分区的ISR列表,并决定是否需要做消费者的rebalance

(3)Consumer注册到zk
一旦有新的消费者组注册到zk,zk会创建专用的节点来保存相关信息。如果zk发现消费者增加或减少,会自动触发消费者的负载均衡。
(注意,producer不注册到zk)

消息如何被消费的?

Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消息;producer通过联系zk获取leader角色的消息分区码,把消息写到leader

Producer使用push模式将消息发布到broker
+————+
| broker     |
+————+
   |  |
    \/
   PULL
   |  |
    \/
Consumer使用pull模式从broker订阅并消费消息

1.2 卡夫卡的副本机制简介

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

一个分区可以有多个副本,这些副本保存在不同的broker上。每个分区的副本中都会有一个作为Leader。当一个broker失败时,Leader在这台broker上的分区都会变得不可用,kafka会自动移除Leader,再其他副本中选一个作为新的Leader。

在通常情况下,增加分区可以提供kafka集群的吞吐量。然而,也应该意识到集群的总分区数或是单台服务器上的分区数过多,会增加不可用及延迟的风险。

(更正:图中Broker1中的topic1-part1和Broker2中的topic1-part1都是从topic1-part2复制过来的,所以要改成topic1-part2 )

1.3 卡夫卡创建副本的2种模式——同步复制和异步复制

Kafka动态维护了一个同步状态的副本的集合(a set of In-Sync Replicas),简称ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息只有被这个集合中的每个节点读取并追加到日志中,才会向外部通知说“这个消息已经被提交”。

只有当消息被所有的副本加入到日志中时,才算是“committed”,只有committed的消息才会发送给consumer,这样就不用担心一旦leader down掉了消息会丢失。

消息从leader复制到follower, 我们可以通过决定Producer是否等待消息被提交的通知(ack)来区分同步复制和异步复制。

同步复制流程:

1.producer联系zk识别leader

2.向leader发送消息

3.leadr收到消息写入到本地log

4.follower从leader pull消息

5.follower向本地写入log

6.follower向leader发送ack消息

7.leader收到所有follower的ack消息

8.leader向producer回传ack

异步复制流程:

和同步复制的区别在于,leader写入本地log之后,

直接向client回传ack消息,不需要等待所有follower复制完成。

既然卡夫卡支持副本模式,那么其中一个Broker里的挂掉,一个新的leader就能通过ISR机制推选出来,继续处理读写请求。

1.4 卡夫卡判断一个broker节点是否存活,依据2个条件:

1.节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接。

2. 如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。

Leader会追踪所有“同步中”的节点,一旦一个down掉了,或是卡住了,或是延时太久,leader就会把它移除

kafka 分区和副本以及kafaka 执行流程,以及消息的高可用的更多相关文章

  1. kafka分区及副本在broker的分配

    kafka分区及副本在broker的分配 部分内容參考自:http://blog.csdn.net/lizhitao/article/details/41778193 以下以一个Kafka集群中4个B ...

  2. 详细解析kafka之kafka分区和副本

    本篇主要介绍kafka的分区和副本,因为这两者是有些关联的,所以就放在一起来讲了,后面顺便会给出一些对应的配置以及具体的实现代码,以供参考~ 1.kafka分区机制 分区机制是kafka实现高吞吐的秘 ...

  3. 聊一聊高并发高可用那些事 - Kafka篇

    目录 为什么需要消息队列 1.异步 :一个下单流程,你需要扣积分,扣优惠卷,发短信等,有些耗时又不需要立即处理的事,可以丢到队列里异步处理. 2.削峰 :按平常的流量,服务器刚好可以正常负载.偶尔推出 ...

  4. 在 Kubernetes 上运行高可用的 Kafka 集群

    转载自:https://www.qikqiak.com/post/deploy-kafka-ha-on-k8s/ Apache Kafka 是目前最流行的分布式消息发布订阅系统,虽然 Kafka 非常 ...

  5. Kafka简介、基本原理、执行流程与使用场景

    一.简介 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于201 ...

  6. Kafka技术内幕 读书笔记之(六) 存储层——服务端处理读写请求、分区与副本

    如下图中分区到 日 志的虚线表示 : 业务逻辑层的一个分区对应物理存储层的一个日志 . 消息集到数据文件的虚线表示 : 客户端发送的消息集最终会写入日志分段对应的数据文件,存储到Kafka的消息代理节 ...

  7. job任务执行流程与分区机制

    job任务执行流程    1.run job阶段        ①收集整个job的环境信息(比如通过conf设定的参数,还有mapperClass,reducerClass,以及输出kv类型)     ...

  8. 二、kafka 中央控制器、主题、分区、副本

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

  9. 追源索骥:透过源码看懂Flink核心框架的执行流程

    li,ol.inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt, ...

随机推荐

  1. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

  2. PriorityBlockingQueue 原理分析

    PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始 ...

  3. websocket 二合一

    server from flask import Flask, request, render_template from geventwebsocket.handler import WebSock ...

  4. Hdu1241 Oil Deposits (DFS)

    Problem Description The GeoSurvComp geologic survey company is responsible for detecting underground ...

  5. 9个顶级开发IoT项目的开源物联网平台

    https://blog.csdn.net/shnbiot/article/details/80432017 物联网(IoT)是帮助人工智能(AI)以更好的方式控制和理解事物的未来技术. 我们收集了一 ...

  6. lvs 初始 第一章

    Linux Virtual Server 第一章  初识 一 . 介绍 LVS集群采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动 ...

  7. jQuery 自执行函数

    jQuery 自执行函数 // 为了避免三方名冲突可将全局变量封装在自执行函数内 (function (arg) { var status = 1; arg.extend({ 'xsk': funct ...

  8. cron笔记

    以前以为添加计划任务就是crontab -e来添加,知道今天偶然发现了/etc/cron.d目录,才发现事情没有那么简单.. crontab -e命令编辑的文件是保存在/var/spool/cron/ ...

  9. PHP快速排序(递归)

    日常的排序算法中,快速排序是其中一种.实现起来相对简单. 假设有一个数组,有若干(N)个元素(数字且无序),需要对其进行从小到大的排序. 快速排序的思路是怎么样的呢? 取一个中间值,然后,用其他数组元 ...

  10. npm 清理缓存

    npm cache clean -f 有些时候npm下载资源出错,再次下载的时候可能因为之前错误的缓存造成一直下载不成功. 此时可以清一下npm的缓存,然后尝试重新下载