原文地址:http://blog.csdn.net/honglei915/article/details/37565289

Kafka视频教程同步首发,欢迎观看!

Kafka允许topic的分区拥有若干副本,这个数量是可以配置的,你可以为每个topci配置副本的数量。Kafka会自动在每个个副本上备份数据,所以当一个节点down掉时数据依然是可用的。

Kafka的副本功能不是必须的,你可以配置只有一个副本,这样其实就相当于只有一份数据。

创建副本的单位是topic的分区,每个分区都有一个leader和零或多个followers.所有的读写操作都由leader处理,一般分区的数量都比broker的数量多的多,各分区的leader均匀的分布在brokers中。所有的followers都复制leader的日志,日志中的消息和顺序都和leader中的一致。flowers向普通的consumer那样从leader那里拉取消息并保存在自己的日志文件中。
许多分布式的消息系统自动的处理失败的请求,它们对一个节点是否
着(alive)”有着清晰的定义。Kafka判断一个节点是否活着有两个条件:

  1. 节点必须可以维护和ZooKeeper的连接,Zookeeper通过心跳机制检查每个节点的连接。
  2. 如果节点是个follower,他必须能及时的同步leader的写操作,延时不能太久。

符合以上条件的节点准确的说应该是“同步中的(in sync)”,而不是模糊的说是“活着的”或是“失败的”。Leader会追踪所有“同步中”的节点,一旦一个down掉了,或是卡住了,或是延时太久,leader就会把它移除。至于延时多久算是“太久”,是由参数replica.lag.max.messages决定的,怎样算是卡住了,怎是由参数replica.lag.time.max.ms决定的。 
只有当消息被所有的副本加入到日志中时,才算是“committed”,只有committed的消息才会发送给consumer,这样就不用担心一旦leader down掉了消息会丢失。Producer也可以选择是否等待消息被提交的通知,这个是由参数request.required.acks决定的。

Kafka保证只要有一个“同步中”的节点,“committed”的消息就不会丢失。

Leader的选择

Kafka的核心是日志文件,日志文件在集群中的同步是分布式数据系统最基础的要素。

如果leaders永远不会down的话我们就不需要followers了!一旦leader down掉了,需要在followers中选择一个新的leader.但是followers本身有可能延时太久或者crash,所以必须选择高质量的follower作为leader.必须保证,一旦一个消息被提交了,但是leader down掉了,新选出的leader必须可以提供这条消息。大部分的分布式系统采用了多数投票法则选择新的leader,对于多数投票法则,就是根据所有副本节点的状况动态的选择最适合的作为leader.Kafka并不是使用这种方法。

Kafaka动态维护了一个同步状态的副本的集合(a set of in-sync replicas),简称ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息必须被这个集合中的每个节点读取并追加到日志中了,才回通知外部这个消息已经被提交了。因此这个集合中的任何一个节点随时都可以被选为leader.ISR在ZooKeeper中维护。ISR中有f+1个节点,就可以允许在f个节点down掉的情况下不会丢失消息并正常提供服。ISR的成员是动态的,如果一个节点被淘汰了,当它重新达到“同步中”的状态时,他可以重新加入ISR.这种leader的选择方式是非常快速的,适合kafka的应用场景。

一个邪恶的想法:如果所有节点都down掉了怎么办?Kafka对于数据不会丢失的保证,是基于至少一个节点是存活的,一旦所有节点都down了,这个就不能保证了。
实际应用中,当所有的副本都down掉时,必须及时作出反应。可以有以下两种选择:

  1. 等待ISR中的任何一个节点恢复并担任leader。
  2. 选择所有节点中(不只是ISR)第一个恢复的节点作为leader.

这是一个在可用性和连续性之间的权衡。如果等待ISR中的节点恢复,一旦ISR中的节点起不起来或者数据都是了,那集群就永远恢复不了了。如果等待ISR意外的节点恢复,这个节点的数据就会被作为线上数据,有可能和真实的数据有所出入,因为有些数据它可能还没同步到。Kafka目前选择了第二种策略,在未来的版本中将使这个策略的选择可配置,可以根据场景灵活的选择。

这种窘境不只Kafka会遇到,几乎所有的分布式数据系统都会遇到。

副本管理

以上仅仅以一个topic一个分区为例子进行了讨论,但实际上一个Kafka将会管理成千上万的topic分区.Kafka尽量的使所有分区均匀的分布到集群所有的节点上而不是集中在某些节点上,另外主从关系也尽量均衡这样每个几点都会担任一定比例的分区的leader.

优化leader的选择过程也是很重要的,它决定了系统发生故障时的空窗期有多久。Kafka选择一个节点作为“controller”,当发现有节点down掉的时候它负责在游泳分区的所有节点中选择新的leader,这使得Kafka可以批量的高效的管理所有分区节点的主从关系。如果controller down掉了,活着的节点中的一个会备切换为新的controller.

漫游Kafka设计篇之主从同步相关推荐

  1. 漫游Kafka设计篇之Producer和Consumer

    原文地址:http://blog.csdn.net/honglei915/article/details/37564871 Kafka视频教程同步首发,欢迎观看! Kafka Producer 消息发 ...

  2. 漫游Kafka设计篇之性能优化

    原文地址:http://blog.csdn.net/honglei915/article/details/37564757 Kafka视频教程同步首发,欢迎观看! Kafka在提高效率方面做了很大努力 ...

  3. 漫游Kafka设计篇之数据持久化

    转载注明出处:http://blog.csdn.net/honglei915/article/details/37564595 Kafka视频教程同步首发,欢迎观看! 不要畏惧文件系统! Kafka大 ...

  4. 漫游Kafka设计篇之性能优化(7)

    Kafka在提高效率方面做了很大努力.Kafka的一个主要使用场景是处理网站活动日志,吞吐量是非常大的,每个页面都会产生好多次写操作.读方面,假设每个消息只被消费一次,读的量的也是很大的,Kafka也 ...

  5. 漫游Kafka设计篇之Producer和Consumer(4)

    Kafka Producer 消息发送 producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发.为了帮助producer做到这点,所有的Kafka节点都可以及时 ...

  6. 漫游Kafka设计篇之消息传输的事务定义

    原文地址:http://blog.csdn.net/honglei915/article/details/37565119 之前讨论了consumer和producer是怎么工作的,现在来讨论一下数据 ...

  7. 漫游Kafka入门篇之简单介绍

    原文地址:http://blog.csdn.net/honglei915/article/details/37564521 Kafka视频教程同步首发,欢迎观看! 介绍 Kafka是一个分布式的.可分 ...

  8. 漫游Kafka实现篇之分布式

    原文地址:http://blog.csdn.net/honglei915/article/details/37932819 Zookeeper节点标记 当路径中的元素包括在方括号里比如[xyz],则表 ...

  9. 漫游Kafka实现篇之消息和日志

    原文地址:http://blog.csdn.net/honglei915/article/details/37760631 Kafka视频教程同步首发,欢迎观看! 消息格式 日志 一个叫做" ...

最新文章

  1. 【Pyhon 3】: 170104:优品课堂: GUI -tkinter
  2. 关于button的自动刷新
  3. python爬虫beautifulsoup4系列4-子节点
  4. MySQL流浪记(四)—— DDL和DML区别与介绍
  5. 猎豹浏览器禁止跟踪怎么开启 禁止跟踪功能开启方法
  6. java strcpy,详解C语言中strcpy()函数与strncpy()函数的使用
  7. 中职计算机高考总分是多少,高考理科总分是多少分
  8. 分析数十年的ICS利用,确定漏洞修复优先级
  9. JavaScript:屏蔽浏览器右键点击事件
  10. html 图片查看 ie8,本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
  11. python表白代码大全简单-程序员python表白代码
  12. 升级Windows 10 正式版过程记录与经验
  13. Ubuntu 截图编辑_编辑截图工具
  14. 微信再次重大更新,同时支持5个浮窗展示,你怎么看?
  15. python中for ch in是什么意思_python中for是什么
  16. 如何写PRD文档[最全版]
  17. 高含金量国际计算机编程竞赛
  18. eclipse出现Parameter index out of range (1 number of parameters, which is 0)报错
  19. android4.4 电池管理
  20. 超好玩的模拟游戏:美国卡车模拟Mac中文版

热门文章

  1. Hello Python程序演练
  2. spring项目搭建-导包对象准备
  3. jvm_虚拟机参数讲解(三)
  4. java properties 属性,java 读取 properties 属性资料
  5. webflux系列--源码解析二
  6. 210317阶段三opencv
  7. 【SpringBoot零基础案例07】【IEDA 2021.1】多环境下.yml/.yaml配置文件的使用
  8. Trumb/ARM 指令模式
  9. 集训2--进程控制理论
  10. 试题 G: 外卖店优先级 第十届蓝桥杯