如果我有一个特定应用程序的EMEA,APAC和NYC实例的全局配置,我正在考虑使用区域Kafka代理,这些代理都是从一个中心单一主题复制的,它们都用于输入,另一个用于输出数据。
我想要的是,我的应用程序的每个区域实例都与该区域的代理进行通信 - 因为与伦敦经纪人交谈的纽约应用程序会增加很多延迟。
有没有办法用Kafka配置来做到这一点?据我所知,如果你有三个区域的三个经纪人只有一个主题,一个经纪人将成为主要经纪人,其他经纪人将被复制。
1)这是否仍然意味着我只能连接到本地代理并且无需使用其他区域代理就可以读取数据,无论本地代理是领导还是复制?
2)对于故障转移,如果纽约经纪人失败,我希望应用程序能够作为次要手段,尝试其他区域之一 - 尽管如果它回来,它会想要切换回本地区域线上。这可能吗?
非常感谢
您可以创建一个包含3个分区的主题,并为每个消息使用不同的密钥(emea
,apac
,nyc
之一),以便根据应用程序的位置强制将消息放置在分区上。或者,您可以强制应用程序实例将消息推送到特定分区 - 例如,在NYC中运行的实例会将消息推送到分区0等。
现在要实现这一目标,Replication Tools可能会有用。在Kafka中创建新主题时,您只需要定义分区数和复制因子,而Kafka会自动处理它们在群集中的分布。您可以使用复制工具强制执行此分配;
2.2创建主题 该工具有什么作用? 默认情况下,如果服务器上的“auto.create.topics.enable”设置为true,Kafka auto会创建主题。这将创建一个具有默认分区数,复制因子的主题,并使用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,那么如果您定义该代理的主机,您将能够从NYC中的代理读取数据。如果将--replication-factor
设置为3,那么您将能够使用来自任何可用代理的消息。
2)当NYC经纪人失败时,另一个经纪人将成为分区领导者。 This is automatically handled by Kafka:
日志的分区分布在Kafka集群中的服务器上,每个服务器处理数据并请求分区的共享。每个分区都在可配置数量的服务器上进行复制,以实现容错。
每个分区都有一个服务器充当“领导者”,零个或多个服务器充当“追随者”。领导者处理分区的所有读取和写入请求,而关注者被动地复制领导者。如果领导者失败,其中一个粉丝将自动成为新的领导者。每个服务器都充当其某些分区的领导者和其他服务器的追随者,因此负载在群集中很平衡。