博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kafka Partition Leader选主机制
阅读量:7278 次
发布时间:2019-06-30

本文共 1945 字,大约阅读时间需要 6 分钟。

hot3.png

Kafka Partition Leader选主机制

更多干货
分布式实战(干货)
spring cloud 实战(干货)
mybatis 实战(干货)
spring boot 实战(干货)
React 入门实战(干货)
构建中小型互联网企业架构(干货)
python 学习持续更新
ElasticSearch 笔记
kafka storm 实战 (干货)
一、概述
大数据常用的选主机制
常用选主机制的缺点
Kafka Partition选主机制
二、大数据常用的选主机制
Leader选举算法非常多,大数据领域常用的有 以下两种:

Zab(zookeeper使用);

Raft; ……
它们都是Paxos算法的变种。

Zab协议有四个阶段:

Leader election;

Discovery(或者epoch establish);
Synchronization(或者sync with followers)
Broadcast
比如3个节点选举leader,编号为1,2,3。1先启动,选择自己为leader,然后2启动首先也选择自己为 leader,由于1,2都没过半,选择编号大的为leader,所以1,2都选择2为leader,然后3启动发现1,2已经协商好且数量过半,于是3也选择2为leader,leader选举结束。

在Raft中,任何时候一个服务器可以扮演下面角色之一

Leader: 处理所有客户端交互,日志复制等,一般只有一个Leader;

Follower: 类似选民,完全被动
Candidate候选人: 可以被选为一个新的领导人
启动时在集群中指定一些机器为Candidate ,然后Candidate开始向其他机器(尤其是Follower)拉票,当某一个Candidate的票数超过半数,它就成为leader。

常用选主机制的缺点

由于Kafka集群依赖zookeeper集群,所以最简单最直观的方案是,所有Follower都在ZooKeeper上设置一个Watch,一旦Leader宕机,其对应的ephemeral znode会自动删除,此时所有Follower都尝试创建该节点,而创建成功者(ZooKeeper保证只有一个能创建成功)即是新的Leader,其它Replica即为Follower。

前面的方案有以下缺点:

split-brain (脑裂): 这是由ZooKeeper的特性引起的,虽然ZooKeeper能保证所有Watch按顺序触发,但并不能保证同一时刻所有Replica“看”到的状态是一样的,这就可能造成不同Replica的响应不一致 ;

herd effect (羊群效应): 如果宕机的那个Broker上的Partition比较多,会造成多个Watch被触发,造成集群内大量的调整;

ZooKeeper负载过重 : 每个Replica都要为此在ZooKeeper上注册一个Watch,当集群规模增加到几千个Partition时ZooKeeper负载会过重

三、Kafka Partition选主机制

Kafka 的Leader Election方案解决了上述问题,它在所有broker中选出一个controller,所有Partition的Leader选举都由controller决定。controller会将Leader的改变直接通过RPC的方式(比ZooKeeper Queue的方式更高效)通知需为此作为响应的Broker。

Kafka 集群controller的选举过程如下 :

每个Broker都会在Controller Path (/controller)上注册一个Watch。

当前Controller失败时,对应的Controller Path会自动消失(因为它是ephemeral Node),此时该Watch被fire,所有“活”着的Broker都会去竞选成为新的Controller(创建新的Controller Path),但是只会有一个竞选成功(这点由Zookeeper保证)。

竞选成功者即为新的Leader,竞选失败者则重新在新的Controller Path上注册Watch。因为Zookeeper的Watch是一次性的,被fire一次之后即失效,所以需要重新注册。

Kafka partition leader的选举过程如下 (由controller执行):

从Zookeeper中读取当前分区的所有ISR(in-sync replicas)集合

调用配置的分区选择算法选择分区的leader

转载于:https://my.oschina.net/tantexian/blog/2876302

你可能感兴趣的文章
单数据库,多数据库,单实例,多实例不同情况下的数据访问效率测试
查看>>
轻量级移动端日期选择器
查看>>
Advapi32.dll 函数接口说明
查看>>
POJ 1236 Network of Schools(强连通分量)
查看>>
异常处理汇总-后端系列
查看>>
SIM,PIN,PUK,IMEI,ICCID,Ki,IMSI,SMSP概念
查看>>
session,application,cookie,viewstate,Querystring等的作用域
查看>>
【LoadRunner】OSGI性能测试实例
查看>>
Windows phone 应用开发系列教程(更新中)
查看>>
Elasticsearch之sense插件安装之后的浏览详解
查看>>
CSS布局口诀 - CSS BUG顺口溜
查看>>
加强IIS安全机制 建立高安全性能Web服务器
查看>>
页面大小和页表项之间有必然的联系么?【转】
查看>>
iOS:Xcode中SVN不能提交CocoaPods中的.a文件的解决方法
查看>>
[ACM_模拟] ZJUT 1155 爱乐大街的门牌号 (规律 长为n的含k个逆序数的最小字典序)...
查看>>
采用dlopen、dlsym、dlclose加载动态链接库【转】
查看>>
iOS:抽屉侧滑动画两种形式(1、UIView侧滑 2、ViewController侧滑)
查看>>
[游戏模版13] Win32 透明贴图 主角移动
查看>>
保护SQL语句不被Sql Profiler / 事件探查器 捕获跟踪到<转>
查看>>
1.7. Synthesizer
查看>>