我正在尝试优化3经纪人Kafka集群,但遇到了一个非常基本但尚不清楚的问题。
考虑我有以下配置:
kafka.topic.partitions.number=10
kafka.partition.replications.number=3
min.insync.replicas=2
这意味着:
- 每个主题10个分区。
- 每个分区都应在所有代理上复制
- 如果有2个同步副本,则分区运行良好(允许1个失败的代理)
问题是关于复制的必要性= 3,真的有必要吗?
值“ 2”还将允许:
- 1个经纪人失败
- 可能更快地收敛和恢复
- 如果有两个失败的代理,群集将始终无法运行。
顺便说一句-我的zookeeper安装在同一台kafka机器上。
谢谢。
答案 0 :(得分:0)
我与您拥有相同的集群,但是区别在于:
我的集群在过去几个月中运行良好,甚至在任何Kafka Brokers集群中都没有看到节点故障。
仅当您面对
时,复制因子“ 3”才是合理的否则,复制因子“ 2”几乎适用于所有用例。
答案 1 :(得分:0)
首先要弄清楚:
2个同步副本意味着您必须具有2个同步副本才能生成消息,否则您的生成者会收到NOT_ENOUGH_REPLICAS异常,并且无法生成消息。 (我想您在制作方设置了acks=all
)
为了使您的方案的主题与replication.factor = 2
:
假设您的经纪人ID为1,2,3。最初,您有3个健康经纪人,当您描述主题时,您会看到类似以下内容:
如果ID为2的代理崩溃了怎么办?然后,您将只有一个insy副本用于第1部分和第2部分,如下所示:
并且您的生产者无法产生消息,因为min.insync.replicas = 2
您当然可以在此时重新分配分区,但是您仍然发现这是个问题。
结果;最佳实践是如果您的replication.factor = 3
和集群中的代理数量为3,则设置min.insync.replicas = 2
。