【问题标题】:Kafka broker precedence卡夫卡经纪人优先
【发布时间】:2019-03-19 16:43:57
【问题描述】:

如果我有一个特定应用程序的 EMEA、APAC 和 NYC 实例的全局配置,我正在考虑使用区域 Kafka 代理,所有这些都从一个中心单一主题复制,它们都用于输入,另一个用于输出数据。

不过,我希望我的应用程序的每个区域实例都与其所在区域的代理进行通信 - 因为纽约应用程序与伦敦代理通信会增加很多延迟。

有没有办法通过 Kafka 配置来做到这一点?据我了解,如果您在三个区域中拥有三个具有单个主题的代理,则一个代理将是主要代理,其他代理将被复制。

1) 这是否仍然意味着我只能连接到本地代理并读取数据而无需使用不同的区域代理,无论本地代理是领导者还是复制者?

2) 对于故障转移,假设 NYC 代理出现故障,我希望应用程序能够作为辅助手段,尝试其他区域之一 - 尽管它希望切换回本地区域,如果它重新上线了。这可能吗?

非常感谢

【问题讨论】:

    标签: apache-kafka


    【解决方案1】:

    您可以创建一个具有 3 个分区的主题,并为每条消息使用不同的键(emeaapacnyc 之一),以强制将消息放置在基于位置的分区上应用程序。或者,您可以强制您的应用程序实例将消息推送到特定分区 - 例如,在纽约市运行的实例会将消息推送到分区 0 等。

    现在要实现这一点,Replication Tools 可能会很有用。在 Kafka 中创建新主题时,您只需要定义分区数量和复制因子,而 Kafka 会自动处理它们在集群中的分布。但是,您可以使用复制工具强制执行此分配;

    2.2 创建主题
    该工具有什么作用?
    默认情况下,如果“auto.create.topics.enable”在 服务器。这将创建一个具有默认分区数的主题, 复制因子并使用 Kafka 的默认方案进行复制 任务。有时,我们可能需要 在创建主题时自定义主题。此工具有助于创建主题 并指定分区数、复制因子和 主题的副本分配列表。

    如何使用该工具?

    # Create topic with default settings
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic topic1
    
    # Create topic with specific number of partitions and/or replicas
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic topic1 --replication-factor 3 --partitions 3
    
    
    # Create topic with manual replica assignment
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic topic1 --replica-assignment 0:1:2,0:1:2,0:1:2
    
    # Create topic with configuration override
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic topic1 --config min.insync.replicas=1
    

    2.3 为主题添加分区
    该工具有什么作用?
    在 Kafka 中,分区充当并行单元:单个主题的消息是 分布到可以存储和服务的多个分区 不同的服务器。创建主题时,分区数 必须指定此主题。稍后可能会有更多分区 当这个话题的数量增加时,这个话题需要。这 工具有助于为特定主题添加更多分区,还允许 添加分区的手动副本分配。

    如何使用该工具?

    # Increase number of partitions for topic
    bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic topic1 --partitions 4
    
    # Increase number of partitions with specific replica assignment
    bin/kafka-topics.sh --alter --zookeeper localhost:2181 --topic topic1 --replica-assignment 0:1:2,0:1:2,0:1:2,2:1:0 --partitions 4
    

    现在回答您的问题;

    1) 如果--replication-factor 设置为 1,那么如果您定义了该代理的主机,您将能够从纽约的代理读取数据。如果您将--replication-factor 设置为 3,那么您将能够使用来自任何可用代理的消息。

    2) 当 NYC 代理失败时,另一个代理将成为分区领导者。 This is automatically handled by Kafka:

    日志的分区分布在 Kafka 集群,每个服务器处理数据和共享请求 的分区。每个分区都被复制到一个可配置的 容错服务器的数量。

    每个分区都有一个服务器作为“领导者”,零或 更多充当“追随者”的服务器。领导者处理所有读取和 在追随者被动的情况下写入分区请求 复制领导者。如果领导者失败,其中一个追随者将 自动成为新的领导者。每个服务器充当领导者 它的一些分区和其他分区的追随者,所以负载很好 在集群内保持平衡。

    【讨论】:

    • 感谢您的回复。是否有任何手动方法可以在运行时分配代理/分区?因此,假设每个分区都分配了一个键(不确定 EMEA/APAC/US 是否真的会散列到不同的分区,但让我们假设是这样)并且每个区域代理都被手动配置为该分区的领导者(什么是语法副本分配?上面你只是放了 0:1:2,0:1:2,0:1:2,这对于每个经纪人来说似乎都是一样的,那么这个数字与什么有关?)。但就这么说吧,然后一个经纪人倒闭了,zookeper 把你转到其他地区之一.....继续
    • NYC 然后回来了 - 我想我必须手动让一些观察者心跳进程以某种方式全局监听这个,然后在 NYC 备份后重新分配分区,以便正常顺序是恢复,人们再次与正确的经纪人交谈
    • 另外,我是否可以将其实现为每个区域的集群,每个区域都有相同的两个主题,在它们之间使用 Kafka Replicator 保持同步?
    • @NZJames 这将是最好的选择。设置 3 个不同的集群(每个区域一个)并使用 Kafka MirrorMaker 同步集群。
    • 好的,这是 Kafka Replicator 的首选工具吗?
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2020-07-21
    • 2018-04-07
    • 2021-02-12
    相关资源
    最近更新 更多