dockerとdocker-composeを使用してスタンドアロンのkafkaをデプロイします

前提

  1. docker
  2. docker-compose

その中で、docker-composeは不要です。dockerを単独で使用することもできます。ここでは、主にdockerとdocker-composeを紹介します。

Dockerのデプロイ

KafkaのDockerデプロイメントは非常に簡単で、Kafkaサーバーのデプロイメントを完了するために必要なコマンドは2つだけです。

docker run -d --name zookeeper -p 2181:2181  wurstmeister/zookeeper
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --link zookeeper -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.60(机器IP):9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka

kafkaはzookeeperと連携する必要があるため、zookeeperをデプロイする必要がありますが、dockerを使用すると、デプロイが非常に簡単です。ここには表示されない2つのコンテナーのステータスを確認
できdocker psます。

次に、プロデューサーとコンシューマーを試すことができます

Kafka独自のツールを使用して、メッセージテストを作成および使用します

  1. まず、kafkaのdockerコンテナに入ります
    docker exec -it kafka sh
    
  2. コンシューマーを実行し、メッセージを監視する

    kafka-console-consumer.sh --bootstrap-server 192.168.1.60:9092 --topic kafeidou --from-beginning
    
  3. 新しいsshウィンドウを開き、kafkaコンテナも入力し、次のコマンドを実行してメッセージを生成します

    kafka-console-producer.sh --broker-list 192.168.1.60(机器IP):9092 --topic kafeidou
    

    このコマンドを入力した後、コンソールに入ります。送信したいメッセージを入力できます。ここに送信してください。hello

    >>
    >hello
    >
    >
    >
    
  4. ご覧のとおり、プロデューサーのコンソールにメッセージを入力すると、コンシューマーのコンソールはすぐにメッセージを確認しました。

これまでに、Kafkaの完全なHelloWorldが完成しました。Kafkaのデプロイメントとプロデューサーのコンシューマーテスト。

Javaコードでテストする

  1. 新しいMavenプロジェクトを作成し、次の依存関係を追加します
    <dependency>
       <groupId>org.apache.kafka</groupId>
       <artifactId>kafka-clients</artifactId>
       <version>2.1.1</version>
     </dependency>
     <dependency>
       <groupId>org.apache.kafka</groupId>
       <artifactId>kafka_2.11</artifactId>
       <version>0.11.0.2</version>
     </dependency>
    
  2. プロデューサーコード
    producer.java
import org.apache.kafka.clients.producer.*;

import java.util.Date;
import java.util.Properties;
import java.util.Random;

public class HelloWorldProducer {
  public static void main(String[] args) {
    long events = 30;
    Random rnd = new Random();

    Properties props = new Properties();
    props.put("bootstrap.servers", "192.168.1.60: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");
    props.put("message.timeout.ms", "3000");

    Producer<String, String> producer = new KafkaProducer<>(props);

    String topic = "kafeidou";

    for (long nEvents = 0; nEvents < events; nEvents++) {
      long runtime = new Date().getTime();
      String ip = "192.168.2." + rnd.nextInt(255);
      String msg = runtime + ",www.example.com," + ip;
      System.out.println(msg);
      ProducerRecord<String, String> data = new ProducerRecord<String, String>(topic, ip, msg);
      producer.send(data,
          new Callback() {
            public void onCompletion(RecordMetadata metadata, Exception e) {
              if(e != null) {
                e.printStackTrace();
              } else {
                System.out.println("The offset of the record we just sent is: " + metadata.offset());
              }
            }
          });
    }
    System.out.println("send message done");
    producer.close();
    System.exit(-1);
  }
}
  1. コンシューマーコード
    consumer.java
import java.util.Arrays;
import java.util.Properties;
import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;

public class HelloWorldConsumer2 {

  public static void main(String[] args) {
    Properties props = new Properties();

    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.1.60:9092");
    props.put(ConsumerConfig.GROUP_ID_CONFIG ,"kafeidou_group") ;
    props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");
    props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
    props.put("auto.offset.reset", "earliest");

    Consumer<String, String> consumer = new KafkaConsumer<>(props);
    consumer.subscribe(Arrays.asList("kafeidou"));

    while (true) {
      ConsumerRecords<String, String> records = consumer.poll(1000);
      for (ConsumerRecord<String, String> record : records) {
        System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
      }
    }
  }
}
  1. プロデューサーとコンシューマーを別々に実行して
    、メッセージ印刷します
    1581651496176,www.example.com,192.168.2.219
    1581651497299,www.example.com,192.168.2.112
    1581651497299,www.example.com,192.168.2.20
    
    消費者向け印刷メッセージ
    offset = 0, key = 192.168.2.202, value = 1581645295298,www.example.com,192.168.2.202
    offset = 1, key = 192.168.2.102, value = 1581645295848,www.example.com,192.168.2.102
    offset = 2, key = 192.168.2.63, value = 1581645295848,www.example.com,192.168.2.63
    
    源码地址:FISHStack/kafka-demo

docker-composeを介してKafkaをデプロイします

最初にdocker-compose.ymlファイルを作成します

version: '3.7'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    volumes:
      - ./data:/data
    ports:
      - 2182:2181

  kafka9094:
    image: wurstmeister/kafka
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 0
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.60:9092
      KAFKA_CREATE_TOPICS: "kafeidou:2:0"   #kafka启动后初始化一个有2个partition(分区)0个副本名叫kafeidou的topic 
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
    volumes:
      - ./kafka-logs:/kafka
    depends_on:
      - zookeeper

展開は非常に簡単で、docker-compose.ymlファイルディレクトリdocker-compose up -d実行するだけで、テスト方法は上記と同じです。
このdocker-composeは、上記のdockerメソッドよりも多くのことを実行します。

  1. データの永続性。現在のディレクトリには、zookeeperとkafkaのデータをそれぞれ格納するために、2つのディレクトリがハングしています。もちろんdocker run、コマンドを追加することで、-v 选项この効果を実現でき ます。
  2. Kafkaは、開始後にトピックをパーティションで初期化します。同様に、docker runその時点でトピックを追加すること-e KAFKA_CREATE_TOPICS=kafeidou:2:0もできます。

概要:docker-composeデプロイメントを最初に推奨します

どうして?

dockerを使用した単純なデプロイのため、変更があった場合(たとえば、外部に公開されているポート番号を変更する場合)、dockerはコンテナーを停止してからコンテナーdocker stop 容器ID/容器NAMEを削除し、docker rm 容器ID/容器NAME最後に新しいコンテナーを開始する必要があります。docker run ...

また、docker-composeデプロイメントの場合にコンテンツを変更する場合は、たとえば2181:2181改成2182:2182docker-compose.ymlファイルの対応する場所を変更してから、docker-composeに対応するディレクトリで再度実行するだけです。docker-compose up -d更新された効果実現するためのymlファイル。  

 

> 4つのコーヒー豆の リリースで始まります! 
>公式アカウントをフォロー-> [Four CoffeeBeans]最新のコンテンツを入手  
 

 

おすすめ

転載: blog.csdn.net/lypgcs/article/details/104326484