1、kafka的HA机制:副本机制+消息同步+leader选举。

  每个topic有多个partition,每个partition又有多个副本,这些副本当中也存在不同的角色,leader、follower。producer和consumer都只跟leader进行交互,leader进行读写操作。leader负责将消息写进本地log当中,follower去leader上pull拉取数据,将数据同步到本地log当中。当leader挂了的时候,就利用zookeeper重新选出一个leader即可。

  其中,kafka将所有的partition均匀分布在集群中的broker上,所有的Replica副本也均匀分布在集群中的broker上,这样做主要是保证负载均衡和容错能力。因为所有的分区和副本都在一个broker上,那样这个broker挂了,数据也就都丢失了。实现这个均匀分布,使用的是一种算法。主要就是用求余数的运算。

  Kafka分配Replica的算法如下:

  1.将所有Broker(假设共n个Broker)和待分配的Partition排序

  2.将第i个Partition分配到第(i mod n)个Broker上

  3.将第i个Partition的第j个Replica分配到第((i + j) mode n)个Broker上

总之,kafka的健壮性主要来源其强大的副本策略。

2、消息同步策略:producer发送消息到某个partition时,首先通过zookeeper获取这个partition的leader, producer只将消息发送给leader ,leader将该消息写入其本地log中,follower从leader上pull数据。为了提高性能,follower收到消息之后直接向leader返回Ack,follower将消息写进本地log中。一旦leader收到了ISR列表中的所有Replica的ack,该消息就被认为已经commit了,leader向producer发送ACK。

consumer读消息也只从leader读取,只有commit的消息才会暴露给consumer。

3、leader选举:所有的follower都在zookeeper上注册watch监听,一旦leader宕机,其对应的ephemeral znode临时节点会被删除,此时所有的follower都去尝试创建该节点,创建成功者,成为新的leader,其他的Replica就是follower。

leader选举本质上是分布式锁,有两种方式实现基于zookeeper的分布式锁。

节点名称唯一性:多个客户端创建一个节点,只有创建成功的才会获得锁。

临时顺序节点:所有的客户端在某个目录下创建自己的临时顺序节点,只有序号最小的才会获得锁。

参考博客:https://www.cnblogs.com/frankdeng/p/9310704.html

最新文章

  1. LeetCode刷题系列
  2. C#元组示例详解
  3. ubuntu14.04安装pycurl报错: __main__.ConfigurationError: Could not run curl-config: [Errno 2] No such file or directory
  4. 黄聪:PHP5.6+7代码性能加速-开启Zend OPcache-优化CPU
  5. C#中常用的排序算法的时间复杂度和空间复杂度
  6. JVM内存回收机制
  7. OpenStack core components CLI快速调用API
  8. IOS计划 分析
  9. ALAssetsLibrary 照片相关 浅析
  10. Effective Java 第三版——43.方法引用优于lambda表达式
  11. 图的深度优先遍历(DFS)—递归算法
  12. Babel 配置选项
  13. 01-JavaScript介绍
  14. centos6.5 Python.7 pip install PIL --allow-external PIL --allow-unverified PIL报错 no such option: --allow-external
  15. HTML5 CSS3 Transform 笔记 (scale不起作用)
  16. Python——列表、元祖、字典、集合的基本操作
  17. struts2:struts.properties配置文件介绍及常量加载顺序
  18. (转)Thread中yield方法
  19. 通过 ulimit 改善系统性能
  20. 【转】Phong和Blinn-Phong光照模型

热门文章

  1. 17 JQuery高级----学习笔记
  2. 长乐培训Day4
  3. Jenkins+Git+Maven+Tomcat详细安装步骤
  4. mybatis内置参数及foreach使用
  5. Java调用WebService方法总结(6)--XFire调用WebService
  6. PHP 结合 Bootstrap 实现学生列表以及添加学生功能实现(继上篇登录及注册功能之后)
  7. a标签中target属性为“_blank”时存在安全问题
  8. Jmeter学习笔记(十六)——HTTP请求之content-type
  9. java中将对象引用设置为null对于GC有没有帮助
  10. MySQL Backup--Xtrabackup备份限速问题