本文介绍了 Kafka Topic 的体系结构,并讨论了如何使用分区进行故障转移和并行处理。

1. Kafka Topic, Log, Partition

Kafka Topic(主题) 是一个有名字的记录流,Kafka 把 Record(记录)存储在 log 日志文件中。

一个主题被分解为多个 Partition(分区)

Kafka 把 log 的多个分区分散到多个服务器中。

把一个 Topic 分解为多个分区,是为了速度、扩展性、存储量。

Topic 是天生的发布/订阅类型的消息传递方式,一个 Topic 可以有 0 个或者多个订阅者(consumer group 消费者组)。

Kafka Topic Partitions

一个 Topic 包含多个 Partition,一个 Partition 里面包含多条记录。

一条记录具体存储在那个分区呢?

如果记录有 key,那么就会根据 key 指定分区。

如果记录没有 key,默认使用轮询的方式指定分区。

Kafka 通过多分区的方式,使主题具有了扩展性,可以跨多个服务器,这样 producer 的写性能就提升了,多分区同样也提升了 consumer 的消费性能,因为可以并行消费,并行的上限就是分区的数量。

每个分区里面的记录是保证顺序的,如果是根据 key 指定分区的,那么相同 key 的记录都在同一个分区里,对于需要回放日志的场景非常有用。

Kafka 会对每个分区都进行复制,以保证高可用,便于做故障转移。

Kafka 记录的顺序

Kafka 只保证分区内的记录是有序的,不保证主题内的记录有序。

分区是一个有序的、不可变的记录序列。

Kafka 把分区作为一个结构化的提交日志,持续向分区中追加记录。

分区中每条记录都被指定一个序号,叫做 “offset”,offset 指定了每条记录在分区中的位置。

主题分区使 Kafka 日志可以扩展到超出单个服务器的大小。

分区必须适合其所在的服务器,但主题可以有多个分区,所以主题就可以跨越多个服务器。

一个分区是一个并行单元,一个分区一次只能由消费者组中的一个消费者操作。

如果消费者组中的一个消费者停止了,Kafka 会把其对应的分区再分配给组内其他消费者。

Kafka 主题分区复制

Kafka 可以对分区进行跨服务器复制,复制几份是可以配置的,复制分区是用于容错。

每个分区复制了多份,其中有一个是 leader,其他为 follower,leader 负责此分区的所有读写请求。

follower 从 leader 复制记录,并关注 leader 的存活状态。

2. 复制:分区的 Leader, Follower, and ISR

Kafka 通过 ZooKeeper 从多个分区中选举出一个 leader。

分区 leader 所在的服务器负责处理此分区的所有读写请求,写请求会从 leader 复制到 follower。

在所有 follower 当中,与 leader 保持同步复制的,称为 ISR(in-sync replica),如果 leader 故障了,会从 ISR 中选举出一个新的 leader。

被所有 ISR 都复制完成的记录才是 “committed 已提交” 的,只有已提交的记录才能被消费者读取。

3. 常见问题

ISR 是什么?

一个 ISR 是一个同步复制 leader 的 follower。

如果 leader 故障了,只有 ISR 有资格竞选 leader。

消费者与分区的对应关系

一个消费者可以对应多个分区,但一个分区一次只能被一个消费者组中的一个消费者使用。

如果一个主题只有一个分区,那么就只能有一个消费者。

Leader Follower 是什么?

leader 处理本分区的所有读写请求,follower 复制 leader。

kafka 如何做消费者的故障转移?

消费者组的一个消费者如果故障了,那么之前分配给这个消费者的分区会被重新分配给组内的其他消费者。

kafka 如何做 broker 的故障转移?

如果一个 broker 故障了,kafka 会将其持有的分区领导权重新分配给其他 broker。

内容翻译整理自:

https://dzone.com/articles/kafka-topic-architecture-replication-failover-and

推荐阅读:

Kafka Topic 体系结构 - 复制 故障转移 并行处理的更多相关文章

  1. Kafka主题体系架构-复制、故障转移和并行处理

    本文讨论了Kafka主题的体系架构,讨论了如何将分区用于故障转移和并行处理. Kafka主题,日志和分区 Kafka将主题存储在日志中.主题日志分为多个分区.Kafka将日志的分区分布在多个服务器或磁 ...

  2. mongoDB研究笔记:复制集故障转移机制

    上面的介绍的数据同步(http://www.cnblogs.com/guoyuanwei/p/3293668.html)相当于传统数据库中的备份策略,mongoDB在此基础还有自动故障转移的功能.在复 ...

  3. sqlserver2008 复制,镜像,日志传输及故障转移集群区别

    一, 数据库复制 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步, ...

  4. sql server 复制,镜像,日志传输及故障转移集群区别

    一, 数据库复制 SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步, ...

  5. MongoDb复制集实现故障转移,读写分离

    前言 数据库技术是信息系统的一个核心技术,发展很快,各种功能类型数据库层出不穷,之前工作中使用过关系型数据库(mysql.oracle等).面相对象数据库(db4o).key-value存储(Memc ...

  6. redis集群复制和故障转移

    #### 一.集群的问题- 1.当某个主节点宕机后,对应的槽位没有节点承担,整个集群处于失败状态,不可用,怎么办- 2.如何判断某个主节点是否真正的岩机?- 3.如果从某个主节点的所有从节点中选举出一 ...

  7. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  8. 第7章 性能和可靠性模式 Failover Cluster(故障转移群集)

    上下文 您已经决定在设计或修改基础结构层时使用群集以提供高度可用的服务. 问题 您应该如何设计一个高度可用的基础结构层,来防止因单台服务器或它所运行的软件出现故障而导致的服务丢失? 影响因素 在设计高 ...

  9. Kafka学习笔记(3)----Kafka的数据复制(Replica)与Failover

    1. CAP理论 1.1 Cosistency(一致性) 通过某个节点的写操作结果对后面通过其他节点的读操作可见. 如果更新数据后,并发访问的情况下可立即感知该更新,称为强一致性 如果允许之后部分或全 ...

随机推荐

  1. vue-cli起项目步骤

    1.全局安装 vue-cli 老版本:npm install -g vue-cli  (npm uninstall vue-cli -g 卸载) 新版本:npm install -g @vue/cli ...

  2. linux 禁止所有中断

    如果你需要禁止所有中断如何? 在 2.6 内核, 可能关闭在当前处理器上所有中断处理, 使用任一个下面 2 个函数(定义在 <asm/system.h>): void local_irq_ ...

  3. boostrap-非常好用但是容易让人忽略的地方【6】:role属性

    普通样式,鼠标hover没有任何效果 <span>content</span> 加上role属性的样式,鼠标hover会有cursor:pointer的效果 <span ...

  4. There is already an open DataReader associated with this Connection which must be closed first EF

    废话不多说,直接 上图,及解决办法.不过问题还不是太清楚到底为什么会出现这个情况..........  

  5. Avram Joel Spolsky给计算机系学生的建议

    Avram Joel Spolsky给计算机系的学生给了如下建议:     (1)毕业前练好写作     (2)毕业前学好C语言     (3)毕业前学好微观经济学     (4)不要因为枯燥就不选修 ...

  6. Struts2和Spring集成

    Spring是一个流行的Web框架,它提供易于集成与很多常见的网络任务.所以,问题是,为什么我们需要Spring,当我们有Struts2?Spring是超过一个MVC框架 - 它提供了许多其它好用的东 ...

  7. 序列化表单数据$("form").serializeArray()

    在做一个后台管理系统类似的项目中发现不能直接取得表单中的数值,于是想到先将表单数据转化为json,然后再用js从json中获取数据,那不就简单了吗? 于是我用了jquery的serializeArra ...

  8. 记一次linux磁盘清理 - 已经删除的文件占用了大量磁盘空间

    今天开发环境磁盘占满了,导致开发环境上的 nginx .redis 等组件总是报异常. 跳到系统根目录下 cd / 检查磁盘占用情况 df -h 哇,40G硬盘全用完了.看看是哪些文件占了那么多内存. ...

  9. vue递归组件 (树形控件 )

    首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出.那么,我们可以使用v-if=&qu ...

  10. 「2018-12-02模拟赛」T2 种树 解题报告

    2.种树(tree.pas/cpp/in/out) 问题描述: Fanvree 很聪明,解决难题时他总会把问题简单化. 例如,他就整天喜欢把图转化为树.但是他不会缩环,那他怎么转化呢? 这是一个有 n ...