kafka 分区和副本以及kafaka 执行流程,以及消息的高可用

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就会把它移除

时间: 2024-10-01 09:54:26

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

Kafka(五)Kafka分区与副本

Kafka分区和副本都是由副本管理器所管理的,引入副本就是为了提高可用性,整个集群中如何判断代理是否存活? 一个存活的代理必须与Zookeeper保持连接,通过Zookeeper的心跳机制来实现的 作为一个Follower副本,该副本不能落后Leader副本太久(怎么算太久?)replica.lag.max.messages配置项确定的,默认为10秒. 满足上面2个条件则认为该副本或者节点处于同步中(in sync).Leader副本会追中所有同步中的节点,一旦一个节点宕机或者落后太久,Lead

kafka分区及副本在broker的分配

部分内容参考自:http://blog.csdn.net/lizhitao/article/details/41778193 下面以一个Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication:数据Producer流动如图所示: (1) pic (2)当集群中新增2节点,Partition增加到6个时分布情况如下: 副本分配逻辑规则如下: 在Kafka集群中,每个Broker都有均等分配Partition的Leader机会. 上述图Broke

CLOUD 04:zookeeper,kafka,hadoop高可用

zookeeper 安装 1 禁用防火墙和 selinux2 设置 /etc/hosts ip 主机名对应关系3 安装 openjdk zookeeper 角色,选举leader 集群主节点follower 参与选举的附属节点observer 不参与选举的节点,同步 leader 的命名空间 1 拷贝配置文件/usr/local/zookeeper/conf/zoo_sample.cfg 到/usr/local/zookeeper/conf/zoo.cfg 2 修改配置文件vim /usr/lo

Kafka Topic Partition GroupId 及高可用

Topic主题用来区分不同类型的消息,实际也就是适用于不同的业务场景,默认消息保存一周时间: 同一个Topic主题下,默认是一个partition分区,也就是只能有一个消费者来消费,如果想提升消费能力,就需要增加分区: 同一个Topic的多个分区,可以有三种方式分派消息(key,value)到不同的分区,指定分区.HASH路由.默认,同一个分区内的消息ID唯一,并顺序: 消费者消费partition分区内的消息时,是通过offsert来标识消息的位置: GroupId用来解决同一个Topic主题

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

一.简介 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交日志服务. 几种分布式系统消息系统的对比: ##二.Kafka基本架构它的架构包括以下组件: 话题(Topic):是特定类型的消息流.消息是字节的有效负载(Payload),话

Kafka分区原理图

一个Topic的多个分区,被分布在kafka集群中的多个server上.每个分区都有一个server为"leader";leader负责所有的读写操作,如果leader失效,那么将会有其他follower来接管(成为新的leader);follower只是单调的和leader 跟进,同步消息即可.由此可见作为leader的server承载了全部的请求压力,因此从集群的整体考虑,有多少个partitions就意味着有多 少个"leader",kafka会将"

Android系统Recovery工作原理之使用update.zip升级过程---updater-script脚本语法简介以及执行流程(转)

目前update-script脚本格式是edify,其与amend有何区别,暂不讨论,我们只分析其中主要的语法,以及脚本的流程控制. 一.update-script脚本语法简介: 我们顺着所生成的脚本来看其中主要涉及的语法. 1.assert(condition):如果condition参数的计算结果为False,则停止脚本执行,否则继续执行脚本. 2.show_progress(frac,sec):frac表示进度完成的数值,sec表示整个过程的总秒数.主要用与显示UI上的进度条. 3.for

Hive SQL的执行流程

[为什么要了解hive执行流程] .当我们写了一个sql,但是执行起来很慢,这时如果我们知道这个sql的底层执行流程是怎样的,就会比较容易去优化 .如果我们在面试中被问及对hive的理解,如果说就是写sql会显得很片面,如果我们了解hive的执行流程,就会知道,虽然表面上是写sql,但是在从hive的sql,到最终出来执行结果,中间经历了MR流程,其中MR的map,combiner,shuffle,reduce具体是执行了hive的那个部分,这样就会比较全面. [分析基于hadoop之上的SQL

1-apache druid原理、执行流程

1.前言 从druid的0.11版本开始,我就开始关注它,每一次的版本的更新,druid都会使用户体验.性能更好,从以前手写配置文件到可视化的界面操作,从实时节点进行任务提交到现在的索引服务等 流处理: 日志监控(Flume/Airflow) ----> 消息中间件(kafka.MQ)  ----> 流处理(spark streaming/Flink) 为了使指标开发更加简单,我们一般不会直接采用Spark core或者Flink DataStream API进行计算,譬如很多时候都会通过样例