昆明java培训
达内昆明广州春城路

18487146383

热门课程

kafka知识点:kafka HA

  • 时间:2016-10-21
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训的老师今天给大家讲kafka HA。

5.1 replication

同一个partition可能会有多个replica(对应server.properties配置中的default.replication.factor=N)。没有replica的情况下,一旦broker宕机,其上所有patition的数据都不可被消费,同时producer也不能再将数据存于其上的patition。引入replication之后,同一个partition可能会有多个replica,而这时需要在这些replica之间选出一个leader,producer和consumer只与这个leader交互,其它replica作为follower从leader中复制数据。

Kafka分配Replica的算法如下:

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

2.将第i个partition分配到第(i mod n)个broker上

3.将第i个partition的第j个replica分配到第((i + j) mode n)个broker上

5.2 leader failover

当partition对应的leader宕机时,需要从follower中选举出新leader。在选举新leader时,一个基本的原则是,新的leader必须拥有旧leader commit过的所有消息。

kafka在zookeeper中(/brokers/.../state)动态维护了一个ISR(in-sync replicas),由3.3节的写入流程可知ISR里面的所有replica都跟上了leader,只有ISR里面的成员才能选为leader。对于f+1个replica,一个partition可以在容忍f个replica失效的情况下保证消息不丢失。

当所有replica都不工作时,有两种可行的方案:

1.等待ISR中的任一个replica活过来,并选它作为leader。可保障数据不丢失,但时间可能相对较长。

2.选择第一个活过来的replica(不一定是ISR成员)作为leader。无法保障数据不丢失,但相对不可用时间较短。

kafka 0.8.*使用第二种方式。

kafka通过Controller来选举leader,流程请参考5.3节。

5.3 broker failover

kafka broker failover序列

流程说明:

1. controller在zookeeper的/brokers/ids/[brokerId]节点注册Watcher,当broker宕机时zookeeper会fire watch

2. controller从/brokers/ids节点读取可用broker

3. controller决定set_p,该集合包含宕机broker上的所有partition

4.对set_p中的每一个partition

4.1从/brokers/topics/[topic]/partitions/[partition]/state节点读取ISR

4.2决定新leader(如4.3节所描述)

4.3将新leader、ISR、controller_epoch和leader_epoch等信息写入state节点

5.通过RPC向相关broker发送leaderAndISRRequest命令

5.4 controller failover

当controller宕机时会触发controller failover。每个broker都会在zookeeper的"/controller"节点注册watcher,当controller宕机时zookeeper中的临时节点消失,所有存活的broker收到fire的通知,每个broker都尝试创建新的controller path,只有一个竞选成功并当选为controller。

当新的controller当选时,会触发KafkaController.onControllerFailover方法,在该方法中完成如下操作:

1.读取并增加Controller Epoch。

2.在reassignedPartitions Patch(/admin/reassign_partitions)上注册watcher。

3.在preferredReplicaElection Path(/admin/preferred_replica_election)上注册watcher。

4.通过partitionStateMachine在broker Topics Patch(/brokers/topics)上注册watcher。

5.若delete.topic.enable=true(默认值是false),则partitionStateMachine在Delete Topic Patch(/admin/delete_topics)上注册watcher。

6.通过replicaStateMachine在Broker Ids Patch(/brokers/ids)上注册Watch。

7.初始化ControllerContext对象,设置当前所有topic,“活”着的broker列表,所有partition的leader及ISR等。

8.启动replicaStateMachine和partitionStateMachine。

9.将brokerState状态设置为RunningAsController。

10.将每个partition的Leadership信息发送给所有“活”着的broker。

11.若auto.leader.rebalance.enable=true(默认值是true),则启动partition-rebalance线程。

12.若delete.topic.enable=true且Delete Topic Patch(/admin/delete_topics)中有值,则删除相应的Topic。

昆明Java培训选昆明达内Java培训机构,昆明达内Java培训汇集Java培训行业专家!

上一篇:kafka知识点:broker保存消息
下一篇:kafka知识点:consumer消费消息

昆明java培训教你实现JSP页面跳转简易方法,120天后月薪过万

昆明Java培训告诉你java和大数据和互联网发展中起什么作用

昆明java培训:初学者学Java Script 5个小技巧

昆明java培训多久可以学会?120天教你成为java开发大神!

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货