用于复制的 Kafka 设置策略?
Posted
技术标签:
【中文标题】用于复制的 Kafka 设置策略?【英文标题】:Kafka setup strategy for replication? 【发布时间】:2020-06-06 16:14:12 【问题描述】:我有两台 vm 服务器(比如 S1 和 S2),需要在集群模式下安装 kafka,其中只有一个分区和两个副本的主题(一个本身是领导者,另一个是跟随者)以提高可靠性。
从cluster setup 得到高级想法想确认以下策略是否正确。
-
首先在两个节点上将 zookeeper 设置为集群以实现高可用性 (HA)。如果我只在单个节点上设置 zk 然后该节点关闭,则完成集群
会下来。正确的 ?是否也必须在最新的 kafka 版本中使用 zk ?看起来它是旧版本必须的Is Zookeeper a must for Kafka?
在两个节点上启动 kafka 代理。它可以在同一个端口上,因为它托管在不同的节点上。
在分区 1 和副本为两个的任何节点上创建主题。
zookeeper 将选择一个节点上的任何代理作为领导者,另一个作为跟随者
生产者将连接到任何代理并开始发布消息。
如果leader宕机,zookeeper会自动选择另一个节点作为leader。不确定现在将如何维护 2 的副本,因为只有
现在有一个节点吗?
上述策略正确吗?
有用的资源
ISR
ISR vs replication factor
【问题讨论】:
【参考方案1】:是的 - Kafka 2.4 仍然需要 ZooKeeper,但您可以阅读有关 KIP-500 的信息,它计划在不久的将来移除对 ZooKeeper 的依赖并开始使用 Raft 算法来创建仲裁。
正如您已经了解的那样,如果您将 ZK 安装在单个节点上,它将以独立模式运行,并且您不会有任何弹性。经典的 ZK 集成由 3 nodes 组成,它允许您丢失 1 个 ZK 节点。
将您的 Kafka 代理指向右侧 ZK cluster 后,您可以启动代理,集群将启动并运行。
在您的示例中,我建议您创建另一个节点以获得更好的弹性并满足您想要的复制因子,同时仍然能够丢失一个节点而不会丢失数据。
请记住,使用单个分区意味着每个消费者组 you are bounded to 单个消费者。其余的消费者将处于空闲状态。
我建议你阅读这篇关于 Kafka Best Practices 和 how to choose the number of topics/partitions in a Kafka cluster 的博客。
【讨论】:
【参考方案2】:首先在两个节点上设置zookeeper作为集群高 可用性(HA)。如果我只在单个节点上设置 zk 然后 节点宕机,整个集群将宕机。正确的 ?是强制性的吗 在最新的 kafka 版本中也可以使用 zk 吗?看来是老年人必备 version Zookeeper 是 Kafka 的必备品吗?
回答:是的。 Zookeeper 仍然是必须的,直到KIP-500 被释放。 Zookeeper 负责选举控制器、存储有关 Kafka 集群的元数据和管理代理成员资格 (link)。理想情况下,Zookeeper 节点的数量应至少为 3。通过这种方式,您可以容忍一个节点故障。 (2 个健康的 Zookeeper 节点(集群中的大多数)仍然能够选择控制器))您还应该考虑在安装了 Kafka 的机器之外的不同机器上设置 Zookeeper 集群。因此服务器的故障不会导致 Zookeeper 和 Kafka 节点都丢失。
在两个节点上启动 kafka 代理。它可以在同一个端口上 托管在不同的节点上。
回答:你应该先启动 Zookeeper 集群,然后启动 Kafka 集群。不同节点上的相同端口是合适的。
在分区 1 和副本为两个的任何节点上创建主题。
答案: 分区用于水平扩展。如果你不需要这个,一个分区就可以了。通过具有复制因子 2,其中一个节点将成为领导者,而其中一个节点将随时成为追随者。但这不足以完全避免数据丢失以及提供 HA。您应该至少有 3 个 Kafka 代理,3 个主题复制因子,min.insync.replicas=2
作为代理配置,acks=all
作为生产者配置,这是在不影响 HA 的情况下避免数据丢失的理想配置。 (您可以查看this了解更多信息)
zookeeper 将选择一个节点上的任何代理作为领导者,另一个作为 追随者
答案: Controller broker 负责维护所有 partition 的 leader/follower 关系。一位经纪人将成为分区领导者,另一位经纪人将成为追随者。您可以使用此命令检查分区领导者/追随者。
bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic my-replicated-topic
生产者将连接到任何代理并开始发布消息。
回答:是的。仅将一个代理设置为 bootstrap.servers 就足以连接到 Kafka 集群。但是为了冗余,您应该在 bootstrap.servers 中提供多个代理。
bootstrap.servers:用于建立的主机/端口对列表 与 Kafka 集群的初始连接。客户将使用 的所有服务器,无论此处指定了哪些服务器 bootstrapping——这个列表只影响最初使用的主机 发现全套服务器。此列表应采用以下形式 host1:port1,host2:port2,.... 由于这些服务器仅用于 初始连接以发现完整的集群成员(可能 动态变化),这个列表不需要包含完整的 服务器(但您可能需要多个服务器,以防一台服务器 下)。
如果leader宕机,zookeeper会选择另一个节点作为leader 自动地 。不确定现在将如何维护 2 的副本 现在只有一个节点吗?
答案:如果Controller broker 宕机,Zookeeper 会选择另一个 broker 作为新的 Controller。如果作为您的分区的领导者的代理出现故障,同步副本之一将成为新的领导者。 (控制器代理对此负责)但是当然,如果您只有两个代理,那么复制将是不可能的。这就是为什么您的 Kafka 集群中应该至少有 3 个代理。
【讨论】:
你说But it is not enough for avoiding data loss completely....
我相信复制因子为 2 ,即使我将min.insync.replicas=2
作为代理配置,acks=all
在两个代理设置上(在两个不同的节点上),数据丢失可能是完全避免但是如果我的节点宕机了,因为min.insync.replicas=2
,custer 将无法运行。所以高可用性(HA)在这里受到损害?。
另一方面,如果我使用min.insync.replicas=1
配置和acks=all
保持复制因子为2,那么如果一台服务器出现故障但集群将继续运行,则可能会发生数据丢失。所以数据丢失在这里受到损害?所以我需要牺牲数据丢失或高可用性?
那你说That's why you should have at least 3 brokers in your Kafka cluster
关于3个brokers的限制是我只有两个节点/服务器,是否建议在两个节点上运行三个brokers?
@emilly 你对 HA 和数据丢失的关系是完全正确的。我编辑了这部分答案以使其更清楚。 --对于您的其他评论:我认为在一个节点中拥有两个代理不是在集群中拥有 3 个代理的推荐方式。因为当节点有两个代理关闭时,您将只有一个代理在运行。以上是关于用于复制的 Kafka 设置策略?的主要内容,如果未能解决你的问题,请参考以下文章
KafkaMM2同步Kafka集群时如何自定义复制策略(ReplicationPolicy)