簡體   English   中英

在Apache Kafka多節點集群中連接到Zookeeper

[英]Connecting to Zookeeper in a Apache Kafka Multi Node cluster

我按照以下說明設置了多節點kafka集群。 現在,如何連接到Zookeeper? 是否可以從JAVA的生產者/消費者端僅連接到一個Zookeeper,還是可以連接所有Zookeeper節點?

設置多節點Apache ZooKeeper集群

在集群的每個節點上,將以下行添加到文件kafka / config / zookeeper.properties中

    server.1=zNode01:2888:3888
    server.2=zNode02:2888:3888
    server.3=zNode03:2888:3888
    #add here more servers if you want
    initLimit=5
    syncLimit=2

在集群的每個節點上,在由dataDir屬性表示的文件夾中創建一個名為myid的文件(默認情況下,該文件夾為/ tmp / zookeeper)。 myid文件應僅包含znode的ID(對於zNode01,'1';對於ZNode02,'2',等等……)

設置多代理Apache Kafka集群

在集群的每個節點上,從文件kafka / config / server.properties修改屬性zookeeper.connect:

    zookeeper.connect=zNode01:2181,zNode02:2181,zNode03:2181

在集群的每個節點上,從文件kafka / config / server.properties修改屬性host.name:host.name = zNode0x

在集群的每個節點上,從文件kafka / config / server.properties修改屬性broker.id(集群中的每個代理都應具有唯一的ID)

您可以傳遞生產者或使用者中的所有節點。 Kafka足夠智能,它可以連接到具有基於復制因子或分區所需數據的節點

這是消費者代碼:

Properties props = new Properties();
     props.put("bootstrap.servers", "acbd.com:9092,defg.com:9092");
     props.put("group.id", "test");
     props.put("enable.auto.commit", "true");
     props.put("auto.commit.interval.ms", "1000");
     props.put("session.timeout.ms", "30000");
     props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
     props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
     KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
     consumer.subscribe(Arrays.asList("foo", "bar"));
     while (true) {
         ConsumerRecords<String, String> records = consumer.poll(100);
         for (ConsumerRecord<String, String> record : records)
             System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());
     }

您可以在這里找到更多信息

注意 :此方法的問題是它將打開多個連接以找出哪個節點保存了數據。 對於更健壯和可擴展的系統,您可以維護分區號和節點名的映射,這也將有助於負載平衡。

這是生產者樣品

Properties props = new Properties();
 props.put("bootstrap.servers", "acbd.com:9092,defg.com:9092");
 props.put("acks", "all");
 props.put("retries", 0);
 props.put("batch.size", 16384);
 props.put("linger.ms", 1);
 props.put("buffer.memory", 33554432);
 props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
 props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

 Producer<String, String> producer = new KafkaProducer<>(props);
 for(int i = 0; i < 100; i++)
     producer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i), Integer.toString(i)));

 producer.close();

更多信息在這里

無需在Kafka客戶端(生產者和消費者)中傳遞Zookeeper連接屬性。

從Kafka-v9及更高版本開始,Kafka Producer和Consumer不與Zookeeper通信。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM