• 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

  • 相关阅读:
    第五次作业
    第四次作业
    第三次作业
    第二次作业
    2013551822第一次作业
    第八次作业
    第七次作业
    第六次作业
    第五次作业
    第四次作业
  • 原文地址:https://www.cnblogs.com/ozho/p/10587867.html
Copyright © 2020-2023  润新知