zoukankan      html  css  js  c++  java
  • kafka基础六

    kafka中的高可用HA

    1、replication副本

    同一个partition会有一个leader和多个副本,这些副本存储的内容与leader相同,可以通过 server.properties 配置中的 default.replication.factor=N进行配置。producer只和Leader进行交互,replication作为follower复制leader中的数据。
    kafka中分配replication的算法

    1、将n个待分配的broker和partition排序。
    2、将第i个partition分配到 i mod n个broker上。
    3、将第i个partition的第j个replica分配到第(i+j)mod n 个broker上。
    
    

    2、Leader的故障转移(Leader failover)

    当partition的leader宕机后,会在所有的follower中选举出一个新的Leader,这个新的Leader必须有旧Leader commit的所有的消息。
    kafka在zookeeper中的broker/.../state下维护了一个ISR(in-sync-replica),ISR中的所有replication的数据都与leader的数据是一致的。只有ISR中的replication才能选举成为Leader。对于一个partition有n+1个replication,并且n个replication失效的情况下保证消息不丢失。

    3、broker failover


    1、controller会在zookeeper的brokers/ids/brokerid下注册节点,如果broker宕机,zookeeper会fire watch。
    2、controller从brokers/ids下读取所有可用的broker
    3、controller从set_p读取宕机broker的所有的partition,set_p集合存储了宕机broker所有的partition。
    4、对于读取到的每个partition,都做以下操作:
    (1)从/brokers/topics/[topic]/partitions/[partition]/state 节点下读取ISR
    (2)选举出该partition新的Leader
    (3)将新 leader、ISR、controller_epoch 和 leader_epoch 等信息写入 state 节点
    5、通过RPC向相关的broker发出leaderAndISRRequest 命令。

    4、controller failover

    每个broker都会在/controller节点下注册watch,当controller宕机,zookeeper中controller临时节点就会消失,所有存活的broker收到fire的通知后都会尝试创建controller path,但是只会有一个竞选成功。

    当新的的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。
    
    

    引用:https://blog.csdn.net/Kim_Weir/article/details/79934095

  • 相关阅读:
    Java 中Timer和TimerTask 定时器和定时任务使用的例子
    PowerDesigner逆向工程导入MYSQL数据库总结
    Powerdesigner 连接mysql 在指定的DSN中,驱动程序和应用程序之间的体系结构不匹配 SQLSTATE = IM014
    关于web.xml中的<welcome-file-list>
    SQL查询四舍五入 解决方法
    HTML页面跳转的5种方法
    easyUI datagrid 列宽自适应(简单 图解)(转)
    navicat for mysql只导出数据表结构(转)
    每一位想有所成就的程序员都必须知道的15件事(走不一样的路,要去做,实践实践再实践,推销自己,关注市场)good
    2017除夕夜的感悟:学习工作不分家,工作生活不分家,读书用兵不分家
  • 原文地址:https://www.cnblogs.com/ozho/p/10587867.html
Copyright © 2011-2022 走看看