Kafka基本知识回顾及复制
Producers发布记录到集群,集群维护这些记录并且将记录分发给Consumers。

在Kafka中,最关键的抽象是topic。Producers发布记录到一个topic,Consumers订阅一个或多个topic。Topic是一个分片的写优先的log。Producers追加记录到这些logs,Consumers订阅logs的改变。每条记录都是一个key/value对。根据key来指定记录到哪个日志分区(除非发布者直接指定分区)。
下面是一个简单的例子,在这个例子中,有一个生产者和一个消费者,它们读写一个有两个分区的topic:

这张图显示了一个生产者进程追加记录到两个分区日志。日志中的每条记录有有一个offset。Consumer用这个offset来描述它在每个日志中的位置。
Partitions是分布在集群的机器之上的。(PS:一堆机器组成一个集群,集群之上是topic,而topic是由多个partitions组成)
不想其它的消息系统那样,Kafka的log总是持久化的。消息在到达kafka的时候立刻被写到文件系统。消息被消费以后不会被删除,至于保留多长时间取决于配置。这使得kafka能够支持高效的发布订阅,因为不管有多少消费者它们都共享一个log。
为了容错,kafka也复制logs到多个服务器。
当Producers发布一个消息的时候,它会得到一个确认,这个确认中包含了这条记录的offset。第一个被发布到分区的记录的offset是0,第二条记录是1,以此递增。Consumers从指定offset处开始消费,并且定期保存它们的位置在log中:保存这个offset是为了以防万一消费者实例崩溃了,另一个实例可以继续从这个位置开始消费。
Replication
Kafka根据配置的服务器数量来复制每个分区的日志。默认情况下,kafka是开启复制的,事实上,未复制的主题和复制的主题是一样的,只不过它们的复制因子是1。
复制是以分区为单位的(The unit of replication is the topic partition)。Kafka中,每个分区都有一个leader和0个或多个followers。副本的总数量包括leader。所有的读和写都指向分区的leader。通常,分区的数量比broker要多,而且分区分布在broker中。
Followers就像正常的kafka消费者那样从leader那里消费消息,并且把它们应用到自己的log中。
想大多数分布式系统自动处理失败那样,关于一个节点"alive"需要有一个明确的定义,kafka中结点存活有两个条件:
1、一个节点必须能够在Zookeeper上维护它自己的会话(通过Zookeeper的心跳机制)
2、如果这个节点是一个slave,那么它必须复制leader上发送的写操作,而且不能落后太多
为了避免同"alive"和"fail"混淆,我们把满足这两个条件的结点状态称之为"in sync"。leader维持对"in sync"结点的跟踪。如果一个follower死了,或者卡了,或者失败了,leader会将其从同步副本列表中删除。
我们现在可以更明确的定义,当这个分区的所有in sync副本都应用了这个log时一个消息才能算是提交完成。只有提交完成的消息才能分发给消费者。这就意味着消费者不需要担心会看到一个可能丢失的消息。另一方面,生产者有一些选项可以控制到底是等待这个消息提交完成还是不等待,当然这取决于它们在持久化和延迟之间的这种的性能。这个性能有生产者的acks设置来控制。注意,topic关于in-sync副本有一个设置叫"minimum number",当生产者请求一个已经被写到所有in-sync副本上的消息的确认的时候会检查这个设置。如果生产者确认请求不那么严格,那么这个消息仍然可以被提交,被消费,即使in-sync副本的数量比minimum小。
Kafka保证在任何时候,只有有一个in sync副本还活着,已经提交的消息就不会丢失。
We can now more precisely define that a message is considered committed when all in sync replicas for that partition have applied it to their log. Only committed messages are ever given out to the consumer. This means that the consumer need not worry about potentially seeing a message that could be lost if the leader fails. Producers, on the other hand, have the option of either waiting for the message to be committed or not, depending on their preference for tradeoff between latency and durability. This preference is controlled by the acks setting that the producer uses. Note that topics have a setting for the "minimum number" of in-sync replicas that is checked when the producer requests acknowledgment that a message has been written to the full set of in-sync replicas. If a less stringent acknowledgement is requested by the producer, then the message can be committed, and consumed, even if the number of in-sync replicas is lower than the minimum (e.g. it can be as low as just the leader).
The guarantee that Kafka offers is that a committed message will not be lost, as long as there is at least one in sync replica alive, at all times.
参考
http://kafka.apache.org/documentation/#design
https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines
Kafka基本知识回顾及复制的更多相关文章
- [C#] C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃> ...
- Java基础知识回顾之七 ----- 总结篇
前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...
- [C#] C# 知识回顾 - 装箱与拆箱
装箱与拆箱 目录 生活中的装箱与拆箱 C# 的装箱与拆箱 值类型和引用类型 装箱 拆箱 读者见解 生活中的装箱与拆箱 我们习惯了在网上购物,这次你想买本编程书 -- <C 语言从入门到放弃 ...
- python 全栈开发,Day32(知识回顾,网络编程基础)
一.知识回顾 正则模块 正则表达式 元字符 : . 匹配除了回车以外的所有字符 \w 数字字母下划线 \d 数字 \n \s \t 回车 空格 和 tab ^ 必须出现在一个正则表达式的最开始,匹配开 ...
- python---基础知识回顾(六)网络编程
python---基础知识回顾(十)进程和线程(进程) python---基础知识回顾(十)进程和线程(多线程) python---基础知识回顾(十)进程和线程(自定义线程池) 一:Socket (一 ...
- C# 知识回顾 - 表达式树 Expression Trees
C# 知识回顾 - 表达式树 Expression Trees 目录 简介 Lambda 表达式创建表达式树 API 创建表达式树 解析表达式树 表达式树的永久性 编译表达式树 执行表达式树 修改表达 ...
- 【Java】数组知识回顾
package another; import java.util.Arrays; import java.util.List; /** * 数组知识回顾 * @author ChristineBas ...
- Kafka的知识总结
前言 转自(https://www.cnblogs.com/zhuifeng523/p/12081204.html) Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partit ...
随机推荐
- 了解前端中的SPA
单页Web应用(single page web application,SPA),就是只有一张Web页面的应用,是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序. 单页W ...
- 原生JavaScript常用的DOM操作
之前项目一直都是用JQuery或者Vue来做的,确实好用,毕竟帮我们解决了很多浏览器兼容问题,但是后面发现大公司面试题都是要原生Javascript来做,然后我就一脸懵逼哈哈哈,毕竟大公司需要的框架或 ...
- 工作小结(关于webpack)
今天在工作中遇到了一个新问题,是关于webpack的. 是这样的,我在项目中添加了一个新页面,修改完配置文件后,开始运行,刚开始并没有什么问题,很顺利,后来我又添加了一个页面,然后修改配置文件,然后运 ...
- 算法-java代码实现快速排序
快速排序 对于一个int数组,请编写一个快速排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- 从零开始学习前端JAVASCRIPT — 4、JavaScript基础Math和Date对象的介绍
Math对象的介绍 1:Math对象 Math 对象用于执行数学任务.并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math().您无需创建它,通过把 Math 作为对象使用就 ...
- 织梦CMS首页调用分类信息栏目及列表方法
不懂代码,搜索学习一晚上,都是说调用特定栏目分类信息列表的,用这个代码 {dede:arclistsg row='10' titlelen='24' orderby='pubdate' channel ...
- webzip怎么用 如何用webzip下载整个网站?
相信很多站长对webzip这款软件都并不感到陌生,它功能强大,能够完整下载网站的内容,或者你也可以选择自行设置下载的层数.文件类型.网页与媒体文件的定位等等.具体详情你可以在百度上去搜一下.由于web ...
- python简单词频统计
任务 简单统计一个小说中哪些个汉字出现的频率最高 知识点 文件操作 字典 排序 lambda 代码 import codecs import matplotlib.pyplot as plt from ...
- es7重点笔记
1,函数绑定运算符,用来取代call,apply,bind调用,写法:并排的双冒号(::),左边是对象,右边是函数 foo :: bar; // 等同于bar.bind(foo); 双冒号返回的还是原 ...
- JS 中的事件设计
看懂此文,不再困惑于 JS 中的事件设计 原文出处: aitangyong 抽空学习了下javascript和jquery的事件设计,收获颇大,总结此贴,和大家分享. (一)事件绑定的几种方式 ...