我开始在docker上使用Spring Boot Kafka和kafka集群工作。我开始检查容错能力时就遇到了问题。通常,我在Spring Boot中通过Kafka Admin创建了一个主题(复制因子= 2)。我能够存储一些消息并从Kafka中使用它们。但是在停止了一个kafka容器(我有两个kafka实例和一个Zookeeper)之后,我的使用者无法传达剩下的一个。
我已经提供了bootstrap.servers属性:
SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka:9092,kafka2:9093
我创建主题的kafka admin bean如下:
@Bean
public NewTopic adviceTopic() {
return new NewTopic(topicName, 1, (short) 2);
}
当我仅使用一个实例(选择哪个实例都没有关系)时,它运行良好(因此,不会出现配置错误的Kafka监听器/主机的情况)。当我删除一个实例时,我的应用程序将无法使用第二个kafka实例。
我的docker compose看起来像:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
container_name: kafka
image: wurstmeister/kafka
expose:
- "9092"
environment:
KAFKA_LISTENERS: PLAINTEXT://kafka:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
kafka2:
container_name: kafka2
image: wurstmeister/kafka
expose:
- "9093"
environment:
KAFKA_LISTENERS: PLAINTEXT://kafka2:9093
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_AUTO_CREATE_TOPICS_ENABLE:
volumes:
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- zookeeper
kafka-service:
container_name: kafka_service
build: .
ports:
- "8080:8080"
environment:
SPRING_KAFKA_BOOTSTRAP_SERVERS: kafka:9092,kafka2:9093
depends_on:
- zookeeper
- kafka
- kafka2
使用“ docker stop kafka_container”时得到的结果:
2019-07-19 09:19:16.836警告1 --- [|消费者] org.apache.kafka.clients.NetworkClient:[消费者clientId = json-0,groupId = qpm-消费者]无法建立到节点1002的连接。经纪人可能不可用。
在那之后,我无法使用Spring Boot Example生成任何消息。您能否提供一些提示,为什么我的应用程序无法使用第二个kafka实例?即使我正确设置了复制因子?
答案 0 :(得分:0)
如果您的主题的复制因子为2,则至少需要运行两个节点,否则kafka会抱怨。要测试您可能需要说5个节点(a,b,c,d,e),然后设置一个复制因子为2的主题,并检查它正在使用的节点,然后杀死其中一个。
答案 1 :(得分:0)
我找到了解决方案。我需要添加到我的docker-compose for kafka: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:2 KAFKA_DEFAULT_REPLICATION_FACTOR:2
问题与哪个__consumer_offsets主题相关,该主题具有1个复制因子。因为我使用了两个kafka实例,所以我不得不将这些属性设置为2。
此问题的详细答案可以在这里找到