apache-kafka - 卡夫卡经纪人优先
问题描述
如果我有一个特定应用程序的 EMEA、APAC 和 NYC 实例的全局配置,我正在考虑拥有区域 Kafka 代理,所有这些都从一个中心单一主题复制,它们都用于输入,另一个用于输出数据。
不过,我想要的是,我的应用程序的每个区域实例都与其所在区域的代理进行通信——因为与伦敦代理交谈的 NYC 应用程序会增加很多延迟。
有没有办法通过 Kafka 配置来做到这一点?据我了解,如果您在三个区域中拥有三个具有单个主题的代理,则一个代理将是主要代理,其他代理将被复制。
1)这是否仍然意味着我只能连接到本地代理并读取数据而不必使用不同的区域代理,无论本地代理是领导者还是复制者?
2) 对于故障转移,假设 NYC 代理出现故障,我希望应用程序能够作为辅助手段,尝试其他区域之一 - 尽管如果它回来,它会想要切换回本地区域在线的。这可能吗?
非常感谢
解决方案
您可以创建一个具有 3 个分区的主题,并为每条消息使用不同的键(其中一个emea
、apac
、nyc
),以便根据应用程序的位置强制将消息放置在分区上。或者,您可以强制您的应用程序实例将消息推送到特定分区 - 例如,在纽约市运行的实例会将消息推送到分区 0 等。
现在要实现这一点,复制工具可能会很有用。在 Kafka 中创建新主题时,您只需要定义分区数量和复制因子,而 Kafka 会自动处理它们在集群中的分布。但是,您可以使用复制工具强制执行此分配;
2.2 创建主题
该工具有什么作用?
默认情况下,如果服务器上的“auto.create.topics.enable”设置为 true,Kafka 会自动创建主题。这将创建一个具有默认分区数、复制因子的主题,并使用 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 broker 出现故障时,另一个 broker 将成为 partition leader。这由 Kafka 自动处理:
日志的分区分布在 Kafka 集群中的服务器上,每个服务器处理数据和请求分区共享。每个分区都在可配置数量的服务器上复制以实现容错。
每个分区都有一个充当“领导者”的服务器和零个或多个充当“跟随者”的服务器。领导者处理分区的所有读写请求,而追随者被动地复制领导者。如果领导者失败,其中一个追随者将自动成为新的领导者。每个服务器充当其某些分区的领导者和其他分区的追随者,因此负载在集群内得到很好的平衡。
推荐阅读
- c# - 选择排序算法排序错误
- julia - Julia 字符串连接给出了一个数组,其中元素被分解为单个字符
- python - 使用 Panda 的错误数据帧结构
- k6 - 如何在loadimpact中按顺序运行测试?
- oauth-2.0 - 如何使用自动刷新令牌授予实现 OAuth2 代码流
- scala - 如何读取 CSV 文件,然后在 Spark Scala 中将其保存为 JSON?
- angular - 如果 CORS 标头“Access-Control-Allow-Origin”为“*”,则不支持凭据
- reactjs - 在未更新的道具更新上渲染组件
- canoe - CAN Busmaster DataField 解码报文
- php - Ajax 在下拉列表中发送相同的值但不同的选项