Implementierung von Docker zum Erstellen eines Zookeeper- und Kafka-Clusters

Implementierung von Docker zum Erstellen eines Zookeeper- und Kafka-Clusters

Ich habe vor Kurzem Kafka gelernt. Als ich mich darauf vorbereitete, den Clusterstatus zu testen, fand ich es zu mühsam, drei virtuelle Maschinen oder drei verschiedene Portnummern in einer virtuellen Maschine zu öffnen (na ja ... hauptsächlich, weil ich faul war).

Umgebungsvorbereitung

Ein Computer mit Internetzugang und einer virtuellen CentOS7-Maschine

Warum virtuelle Maschinen verwenden? Da ich einen Laptop verwende, ändert sich die IP bei jeder Verbindung mit dem Netzwerk und ich muss die Konfigurationsdatei ständig ändern, was zum Testen zu umständlich und unpraktisch ist. (Dieses Problem kann durch die Verwendung eines virtuellen Docker-Netzwerks vermieden werden, aber das wusste ich während des Experiments nicht.)

Docker-Installation

Wenn Sie Docker bereits installiert haben, ignorieren Sie diesen Schritt bitte.

  • Docker unterstützt die folgenden CentOS-Versionen:
  • CentOS 7 (64-Bit): Das System muss 64-Bit sein und die Kernelversion muss 3.10 oder höher sein.
  • CentOS 6.5 (64-Bit) oder höher: Das System muss 64-Bit sein und die Kernelversion muss 2.6.32-431 oder höher sein.
  • CentOS unterstützt Docker nur im in der Distribution enthaltenen Kernel.

Yum-Installation

Docker erfordert eine CentOS-Kernelversion höher als 3.10. Überprüfen Sie die oben genannten Voraussetzungen, um festzustellen, ob Ihre CentOS-Version Docker unterstützt.

# Überprüfen Sie die Kernelversion $ uname -a
#Docker installieren
$ yum -y Docker installieren
#Starten Sie den Docker-Hintergrunddienst$ service docker start
# Da lokal kein „Hallo-Welt“-Image vorhanden ist, wird ein „Hallo-Welt“-Image heruntergeladen und im Container ausgeführt.
$ Docker-Ausführung Hallo-Welt

Skriptinstallation

Melden Sie sich mit Sudo- oder Root-Berechtigungen bei CentOS an.

Stellen Sie sicher, dass das Yum-Paket auf die neueste Version aktualisiert ist.

$ sudo yum aktualisieren

Holen Sie sich das Docker-Installationsskript und führen Sie es aus.

$ curl -fsSL https://get.docker.com -o get-docker.sh
# Durch Ausführen dieses Skripts wird das Repository docker.repo hinzugefügt und Docker installiert.
$ sudo sh get-docker.sh

Starten Sie Docker

$ sudo systemctl Docker starten
# Überprüfen Sie, ob Docker erfolgreich installiert wurde, und führen Sie ein Testimage im Container aus.
$ sudo docker run hallo-welt
$ Docker ps

Spiegelbeschleunigung

Als ich zum ersten Mal aufgefordert wurde, eine inländische Spiegelquelle zu konfigurieren, lehnte ich ab. Nachdem ich sie jedoch verwendet hatte, stellte ich fest, dass die Downloadgeschwindigkeit duang~ zunahm. Es wird daher dringend empfohlen, eine inländische Spiegelquelle zu konfigurieren.

Öffnen/erstellen Sie die Datei /etc/docker/daemon.json und fügen Sie den folgenden Inhalt hinzu:

{
 "Registrierungsspiegel": ["http://hub-mirror.c.163.com"]
}

Zookeeper-Clusteraufbau

Zookeeper-Bild: zookeeper:3.4

Bildvorbereitung

$ docker pull zookeeper:3.4

Um Bilder zu finden, gehen Sie zu https://hub.docker.com/

docker pull images:TAG // stellt das Abrufen des image Images der TAG Version dar

Erstellen Sie einen separaten Zookeeper-Container

Wir erstellen zunächst auf einfachste Weise einen separaten Zookeeper Knoten und erstellen dann basierend auf diesem Beispiel weitere Knoten.

$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4

Standardmäßig ist die Konfigurationsdatei im Container /conf/zoo.cfg und die Daten- und Protokollverzeichnisse sind standardmäßig /data und /datalog . Bei Bedarf können die oben genannten Verzeichnisse dem Host zugeordnet werden.

Parameter Erklärung

--name: Geben Sie den Containernamen an
-p: Weisen Sie den vom Container freigegebenen Ports Portnummern zu.
-d: Führen Sie den Container im Hintergrund aus und drucken Sie die Container-ID

Clusteraufbau

Die Erstellungsmethode von Zookeeper -Containern für andere Knoten ähnelt der von unabhängigen Containern. Es ist zu beachten, dass die Knoten id und die Konfiguration mehrerer Knoten in der Änderungsdatei separat angegeben werden sollten. Die entsprechenden Erstellungsbefehle lauten wie folgt:

Erstellen Sie ein neues Docker-Netzwerk

$ Docker-Netzwerk erstellen zoo_kafka
$ Docker-Netzwerk ls

Tierpfleger-Container 1

$ docker run -d \
   --restart=immer \
   -v /opt/docker/zookeeper/zoo1/data:/data \
   -v /opt/docker/zookeeper/zoo1/datalog:/datalog \
   -e ZOO_MEINE_ID=1 \
   -p 2181:2181 \
   -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
   --name=zoo1 \
   --net=viemall-zookeeper \
   --privilegiert \
   tierpfleger:3.4

Zoowärter-Container 2

$ docker run -d \
   --restart=immer \
   -v /opt/docker/zookeeper/zoo2/data:/data \
   -v /opt/docker/zookeeper/zoo2/datalog:/datalog \
   -e ZOO_MEINE_ID=2 \
   -p 2182:2181 \
   -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
   --name=zoo2 \
   --net=viemall-zookeeper \
   --privilegiert \
   tierpfleger:3.4

Tierpfleger-Container 3

$ docker run -d \
   --restart=immer \
   -v /opt/docker/zookeeper/zoo3/data:/data \
   -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
   -e ZOO_MEINE_ID=3 \
   -p 2183:2181 \
   -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
   --name=zoo3 \
   --net=viemall-zookeeper \
   --privilegiert \
   tierpfleger:3.4

Obwohl diese Methode auch das gewünschte Ergebnis liefert, sind die Schritte zu umständlich und schwierig zu warten (spätes Stadium der Faulheit), sodass wir docker-compose verwenden, um dies zu erreichen.

Docker-Compose erstellt einen Zookeeper-Cluster

Erstellen Sie ein neues Docker-Netzwerk

$ Docker-Netzwerk erstellen viemall-zookeeper
$ Docker-Netzwerk ls

Schreiben Sie das Skript docker-compose.yml

Anwendung:

Installieren Sie docker-compose

# Holen Sie sich das Skript$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# Ausführungsberechtigungen erteilen $chmod +x /usr/local/bin/docker-compose

Erstellen Sie eine neue Datei docker-compose.yml in einem beliebigen Verzeichnis und kopieren Sie den folgenden Inhalt

Führen Sie den Befehl docker-compose up -d

Befehlsvergleich
|Befehl|Erklärung|
|-|-|
|docker-compose up|Alle Container starten|
|docker-compose up -d|Alle Container im Hintergrund starten und ausführen|
|docker-compose up --no-recreate -d|Gestoppte Container nicht neu erstellen|
|docker-compose up -d test2|Starten Sie nur den Test2-Container|
|docker-compose stop|Container stoppen|
|docker-compose start|Container starten|
|docker-compose down|Container stoppen und zerstören|

Downloadadresse für docker-compose.yml : https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml Details

Version: '2'
Leistungen:
 zoo1:
  Bild: zookeeper:3.4 # Bildname Neustart: immer # Automatischer Neustart, wenn ein Fehler auftritt Hostname: zoo1
  Containername: zoo1
  privilegiert: wahr
  Ports: #Port - 2181:2181
  Volumes: #Datenvolume mounten - ./zoo1/data:/data
   - ./zoo1/datalog:/datalog 
  Umfeld:
   TZ: Asien/Shanghai
   ZOO_MY_ID: 1 # Knoten-ID
   ZOO_PORT: 2181 # Zookeeper-Portnummer ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # Zookeeper-Knotenliste Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.11

 zoo2:
  Bild: zookeeper:3.4
  Neustart: immer
  Hostname: zoo2
  Containername: zoo2
  privilegiert: wahr
  Häfen:
   - 2182:2181
  Bände:
   - ./zoo2/data:/data
   - ./zoo2/datalog:/datalog
  Umfeld:
   TZ: Asien/Shanghai
   ZOO_MY_ID: 2
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.12

 zoo3:
  Bild: zookeeper:3.4
  Neustart: immer
  Hostname: zoo3
  Containername: zoo3
  privilegiert: wahr
  Häfen:
   - 2183:2181
  Bände:
   - ./zoo3/data:/data
   - ./zoo3/datalog:/datalog
  Umfeld:
   TZ: Asien/Shanghai
   ZOO_MY_ID: 3
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.13

Netzwerke:
 Standard:
  extern:
   Name: zoo_kafka

verifizieren

Aus der Abbildung können wir erkennen, dass es einen Leader und zwei Flower gibt. Bisher wurde unser Zookeeper Cluster erstellt.

Aufbau eines Kafka-Clusters

Ist es mit der oben genannten Grundlage immer noch ein Problem, einen Kafka -Cluster aufzubauen? Tatsächlich ist es lediglich so, dass die Werte mehrerer Variablen unterschiedlich sind.

Im obigen Beispiel müssen Sie sich nicht mit einem Kafka mit einem einzigen Knoten herumschlagen. Sie können die docker-compose -Methode direkt verwenden, um drei Knoten bereitzustellen. Tatsächlich sind die Methoden ähnlich. Wie oben erwähnt, handelt es sich lediglich um einige unterschiedliche Eigenschaften. Zu diesem Zeitpunkt müssen wir kein neues Docker-Netzwerk erstellen. Sie können das beim Erstellen des Zookeeper Clusters erstellte Netzwerk direkt verwenden!

Umgebungsvorbereitung

Kafka-Bild: wurstmeister/kafka
Kafka-Manager-Bild: sheepkiller/kafka-manager

# Wenn keine Version angegeben ist, wird standardmäßig die neueste Version des Images heruntergeladen. docker pull wurstmeister/kafka
Docker zieht Sheepkiller/Kafka-Manager

Schreiben Sie das Skript docker-compose.yml

Anwendung:

Installieren Sie docker-compose

# Holen Sie sich das Skript$ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# Ausführungsberechtigungen erteilen $chmod +x /usr/local/bin/docker-compose

Erstellen Sie eine neue Datei docker-compose.yml in einem beliebigen Verzeichnis und kopieren Sie den folgenden Inhalt

Führen Sie den Befehl docker-compose up -d

Befehlsvergleich
|Befehl|Erklärung|
|-|-|-|
|docker-compose up|Alle Container starten|
|docker-compose up -d|Alle Container im Hintergrund starten und ausführen|
|docker-compose up --no-recreate -d|Gestoppte Container nicht neu erstellen|
|docker-compose up -d test2|Starten Sie nur den Test2-Container|
|docker-compose stop|Container stoppen|
|docker-compose start|Container starten|
|docker-compose down|Container stoppen und zerstören|

Downloadadresse für docker-compose.yml : https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml Details

Version: '2'

Leistungen:
 Makler1:
  Bild: Wurstmeister/Kafka
  Neustart: immer
  Hostname: broker1
  Containername: Broker1
  privilegiert: wahr
  Häfen:
   - „9091:9092“
  Umfeld:
   KAFKA_BROKER_ID: 1
   KAFKA_LISTENERS: PLAINTEXT://broker1:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9092
   KAFKA_ADVERTISED_HOST_NAME: broker1
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  Bände:
   – /var/run/docker.sock:/var/run/docker.sock
   - ./broker1:/kafka/kafka\-logs\-broker1
  externe_links:
  - zoo1
  - zoo2
  - zoo3
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.14

 Makler2:
  Bild: Wurstmeister/Kafka
  Neustart: immer
  Hostname: broker2
  Containername: broker2
  privilegiert: wahr
  Häfen:
   - „9092:9092“
  Umfeld:
   KAFKA_BROKER_ID: 2
   KAFKA_LISTENERS: PLAINTEXT://broker2:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
   KAFKA_ADVERTISED_HOST_NAME: broker2
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  Bände:
   – /var/run/docker.sock:/var/run/docker.sock
   - ./broker2:/kafka/kafka\-logs\-broker2
  external_links: #Verbindung zu Containern außerhalb dieser Compose-Datei herstellen
  - zoo1
  - zoo2
  - zoo3
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.15

 Makler3:
  Bild: Wurstmeister/Kafka
  Neustart: immer
  Hostname: broker3
  Containername: Broker3
  privilegiert: wahr
  Häfen:
   - „9093:9092“
  Umfeld:
   KAFKA_BROKER_ID: 3
   KAFKA_LISTENERS: PLAINTEXT://broker3:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9092
   KAFKA_ADVERTISED_HOST_NAME: broker3
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  Bände:
   – /var/run/docker.sock:/var/run/docker.sock
   - ./broker3:/kafka/kafka\-logs\-broker3
  external_links: #Verbindung zu Containern außerhalb dieser Compose-Datei herstellen
  - zoo1
  - zoo2
  - zoo3
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.16

 Kafka-Manager:
  Bild: Sheepkiller/Kafka-Manager:latest
  Neustart: immer
  Containername: Kafka-Manager
  Hostname: Kafka-Manager
  Häfen:
   - "9000:9000"
  links: # Verbindung zum Container herstellen, der durch diese Compose-Datei erstellt wurde
   - Makler1
   - Makler2
   - Makler3
  external_links: #Verbindung zu Containern außerhalb dieser Compose-Datei herstellen
   - zoo1
   - zoo2
   - zoo3
  Umfeld:
   ZK_HOSTS: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   KAFKA_BROKERS: Broker1:9092, Broker2:9092, Broker3:9092
   APPLICATION_SECRET: letmein
   KM_ARGS: -Djava.net.preferIPv4Stack=true
  Netzwerke:
   Standard:
    IPv4-Adresse: 172.23.0.10

Netzwerke:
 Standard:
  extern: # Verwenden Sie den erstellten Netzwerknamen: zoo_kafka

verifizieren

Wir öffnen die Verwaltungsseite von kafka-manager , der Zugriffspfad lautet Host-IP:9000;


Geben Sie, falls angezeigt, die Adresse des Zookeeper Clusters ein, scrollen Sie nach unten und klicken Sie auf save

Klicken Sie auf den Cluster, den Sie gerade hinzugefügt haben. Sie sehen, dass der Cluster drei Knoten enthält.

Während des Bauprozesses aufgetretene Probleme

Das Mounten des Datenvolumens führt zu einem unendlichen Neustart. Beim Überprüfen log Protokollaufforderungen wird Folgendes angezeigt: chown: Ändern des Eigentümers von „/var/lib/mysql/...“: Berechtigung verweigert

Lösung:

  • Fügen Sie --privileged=true zu docker run hinzu, um dem Container bestimmte Berechtigungen zu erteilen
  • Selinux vorübergehend deaktivieren: setenforce 0
  • Fügen Sie Selinux-Regeln hinzu, um den Sicherheitstext des einzubindenden Verzeichnisses zu ändern

kafka-manager meldet JMX-bezogene Fehler,

Lösung:

  • Fügen Sie jedem Kafka-Knoten die Umgebungsvariable JMX_PORT=port hinzu
  • Nachdem ich es hinzugefügt hatte, stellte ich fest, dass ich keine Verbindung herstellen konnte und es sich um ein Netzwerkverbindungsproblem handelte. Also habe ich jeden JMX-Port freigegeben und dann die Firewall passieren lassen, wodurch das Problem gelöst wurde.
  • Am besten setzen Sie KAFKA_ADVERTISED_HOST_NAME auf die IP-Adresse des Host-Rechners. Code oder Tools außerhalb des Host-Rechners können sich damit verbinden, und der nachfolgende Port muss ebenfalls auf den freigegebenen Port gesetzt werden.

[Fehler] kmjKafkaJMX$ - Verbindung zum Dienst fehlgeschlagen: jmx:rmi:///jndi/rmi://9.11.8.48:-1/jmxrmi java.lang.IllegalArgumentException: Anforderung fehlgeschlagen: Kein JMX-Port, aber JMX-Polling aktiviert!

Beim Anzeigen topic im Container wird der folgende Fehler gemeldet (nicht nur beim Themenbefehl, es scheint, als würden alle Befehle schiefgehen):

$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
# Das Folgende ist ein Fehler: Vom Agenten ausgelöste Ausnahme: java.rmi.server.ExportException: Port wird bereits verwendet: 7203; verschachtelte Ausnahme ist:
    java.net.BindException: Adresse wird bereits verwendet

Lösung:

Fügen Sie vor dem Befehl den Befehl unset JMX_PORT; , und der obige Befehl wird wie folgt umgewandelt:

$ unset JMX_PORT;bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1

Anhang: Allgemeine Docker-Anweisungen

# Alle Docker-Images anzeigen
# Alle laufenden Container anzeigen docker ps
# Alle Container anzeigen docker ps -a
# Alle Container-IPs abrufen
$ docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# Die internen Protokolle des Containers anzeigen $ docker logs -f <Container-ID>
# Geben Sie den Container ein $ docker exec -it <Container-ID> /bin/basj
# Einen Container erstellen -d steht für den Start im Hintergrund docker run --name <Containername> -e <Parameter> -v <Datenvolume einbinden> <Container-ID>
# Starten Sie den Container neu docker restart <Container-ID>
#Container herunterfahren docker stop <Container-ID>
# Führen Sie den Container docker start <Container-ID> aus

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Installieren Sie Zookeeper unter Docker (Standalone und Cluster).
  • So erstellen Sie einen Zookeeper-Cluster mit Docker

<<:  So komprimieren Sie Bilder effektiv mit JS

>>:  Detaillierte Analyse des temporären JDBC- und MySQL-Tablespace

Artikel empfehlen

So verwenden Sie den Linux-Befehl „locate“

01. Befehlsübersicht Der Befehl „locate“ ist eige...

Zusammenfassung der Verwendung von JavaScript JSON.stringify()

Inhaltsverzeichnis 1. Nutzung 1. Grundlegende Ver...

Eine vollständige Anleitung zu CSS-Stilattributen css() und width() in jQuery

Inhaltsverzeichnis 1. Grundlegende Verwendung von...

Die Vorteile von Div+CSS und Web-Standardseiten

Das Div-Element wird verwendet, um Struktur und Hi...

Gründe, warum MySQL-Abfragen langsam sind

Inhaltsverzeichnis 1. Wo ist die Langsamkeit? 2. ...

IIS 7.5 verwendet das URL-Rewrite-Modul, um eine Webseitenumleitung zu erreichen

Wir alle wissen, dass Apache in der Konfiguration...

So schreiben Sie asynchrone Aufgaben in modernem JavaScript

Vorwort In diesem Artikel untersuchen wir die Ent...

So speichern Sie Bilder in MySQL

1 Einleitung Beim Gestalten einer Datenbank ist e...

Detaillierte Analyse der MySQL-Sperrblockierung

Bei der täglichen Wartung werden Threads häufig b...