Zookeeper&Kafka クラスターを構築するための Docker の実装

Zookeeper&Kafka クラスターを構築するための Docker の実装

最近Kafka勉強しています。クラスタの状態をテストする準備をしていたときに、仮想マシンを 3 つ開いたり、1 つの仮想マシンに 3 つの異なるポート番号を開けたりするのは面倒だと感じました (まあ、主に私が怠け者だったからですが)。

環境の準備

インターネット接続と CentOS7 仮想マシンを備えたコンピューター

仮想マシンを使用する理由ノートパソコンを使用しているため、ネットワークに接続するたびに IP が変更され、構成ファイルを常に変更する必要があり、テストするには面倒で不便です。 (この問題はDocker仮想ネットワークを使用することで回避できますが、実験中にそれを知りませんでした)

Dockerのインストール

すでに Docker をインストールしている場合は、この手順を無視してください。

  • Docker は次の CentOS バージョンをサポートしています。
  • CentOS 7 (64 ビット): システムは 64 ビットであり、カーネル バージョンは 3.10 以降である必要があります。
  • CentOS 6.5 (64 ビット) 以降: システムは 64 ビットであり、カーネル バージョンは 2.6.32-431 以降である必要があります。
  • CentOS は、ディストリビューションに含まれるカーネル内の Docker のみをサポートします。

yumインストール

Docker を使用するには、CentOS カーネル バージョンが 3.10 以降である必要があります。上記の前提条件をチェックして、CentOS バージョンが Docker をサポートしているかどうかを確認してください。

# カーネルのバージョンを確認する $ uname -a
#Dockerをインストールする
$ yum -y dockerをインストール
#Dockerバックグラウンドサービスを開始します$ service docker start
# ローカルに hello-world イメージがないため、hello-world イメージがダウンロードされ、コンテナー内で実行されます。
$ docker run hello-world

スクリプトのインストール

sudo または root 権限を使用して CentOS にログインします。

yum パッケージが最新バージョンに更新されていることを確認してください。

$ sudo yum アップデート

Docker インストール スクリプトを取得して実行します。

$ curl -fsSL https://get.docker.com -o get-docker.sh
# このスクリプトを実行すると、docker.repo リポジトリが追加され、Docker がインストールされます。
$ sudo sh get-docker.sh

Dockerを起動する

$ sudo systemctl dockerを起動します
# Docker が正常にインストールされていることを確認し、コンテナ内でテストイメージを実行します。
$ sudo docker run hello-world
$ docker ps

ミラー加速

最初、国内のミラーソースの設定を求められたときは断りましたが、使ってみるとダウンロード速度がduang~上がりました。したがって、国内のミラー ソースを構成することを強くお勧めします。

/etc/docker/daemon.jsonファイルを開く/作成し、次のコンテンツを追加します。

{
 "レジストリミラー": ["http://hub-mirror.c.163.com"]
}

飼育員クラスターの構築

飼育係イメージ: zookeeper:3.4

画像の準備

$ docker pull zookeeper:3.4

イメージを見つけるには、https://hub.docker.com/ にアクセスしてください。

docker pull images:TAG // TAGバージョンのimageイメージをプルすることを表します

別のZookeeperコンテナを作成する

まず、最も簡単な方法で別のZookeeperノードを作成し、次にこの例に基づいて他のノードを作成します。

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

デフォルトでは、コンテナ内の設定ファイルは/conf/zoo.cfgで、データ ディレクトリとログ ディレクトリはデフォルトで/data/datalogです。必要に応じて、上記のディレクトリをホストにマップできます。

パラメータの説明

--name: コンテナ名を指定します
-p: コンテナによって公開されるポートにポート番号を割り当てる
-d: コンテナをバックグラウンドで実行し、コンテナIDを出力します

クラスター構築

他のノードのZookeeperコンテナの作成方法は、独立したコンテナの作成方法と同様です。変更ファイル内のノードidと複数ノードの設定は個別に指定する必要があることに注意してください。対応する作成コマンドは次のとおりです。

新しいDockerネットワークを作成する

$ dockerネットワークでzoo_kafkaを作成します
$ dockerネットワークls

飼育係コンテナ 1

$ docker run -d \
   --restart=常に\
   -v /opt/docker/zookeeper/zoo1/data:/data \
   -v /opt/docker/zookeeper/zoo1/datalog:/datalog \
   -e ZOO_MY_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 \
   --特権 \
   飼育係:3.4

飼育係コンテナ2

$ docker run -d \
   --restart=常に\
   -v /opt/docker/zookeeper/zoo2/data:/data \
   -v /opt/docker/zookeeper/zoo2/datalog:/datalog \
   -e ZOO_MY_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 \
   --特権 \
   飼育係:3.4

飼育係コンテナ3

$ docker run -d \
   --restart=常に\
   -v /opt/docker/zookeeper/zoo3/data:/data \
   -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
   -e ZOO_MY_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 \
   --特権 \
   飼育係:3.4

この方法でも目的を達成できますが、手順が面倒すぎて保守が困難 (怠惰の末期段階) なので、 docker-compose使用して実現します。

Docker-compose は Zookeeper クラスターを構築します

新しいDockerネットワークを作成する

$ docker ネットワーク作成 viemall-zookeeper
$ dockerネットワークls

docker-compose.ymlスクリプトを書く

方向:

docker-composeをインストールする

# スクリプトを取得します$ 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
# 実行権限を付与する $chmod +x /usr/local/bin/docker-compose

任意のディレクトリに新しいdocker-compose.ymlファイルを作成し、次の内容をコピーします。

コマンドdocker-compose up -dを実行します。

コマンド比較
|コマンド|説明|
|-|-|
|docker-compose up|すべてのコンテナを起動|
|docker-compose up -d|すべてのコンテナをバックグラウンドで起動して実行します|
|docker-compose up --no-recreate -d|停止したコンテナを再作成しない|
|docker-compose up -d test2|test2 コンテナのみを起動します|
|docker-compose stop|コンテナを停止します|
|docker-compose start|コンテナを起動します|
|docker-compose down|コンテナを停止して破棄します|

docker-compose.ymlダウンロード アドレス: https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml詳細

バージョン: '2'
サービス:
 動物園1:
  image: zookeeper:3.4 # イメージ名 restart: always # エラー発生時に自動的に再起動 hostname: zoo1
  コンテナ名: zoo1
  特権: true
  ポート: #ポート - 2181:2181
  volumes: #データボリュームをマウント - ./zoo1/data:/data
   - ./zoo1/データログ:/データログ 
  環境:
   TZ: アジア/上海
   ZOO_MY_ID: 1 # ノードID
   ZOO_PORT: 2181 # zookeeper ポート番号 ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper ノード リスト ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.11

 動物園2:
  画像: 動物園飼育係:3.4
  再起動: 常に
  ホスト名: zoo2
  コンテナ名: zoo2
  特権: true
  ポート:
   - 2182:2181
  ボリューム:
   - ./zoo2/データ:/データ
   - ./zoo2/データログ:/データログ
  環境:
   TZ: アジア/上海
   動物園_マイ_ID: 2
   動物園ポート: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.12

 動物園3:
  画像: 動物園飼育係:3.4
  再起動: 常に
  ホスト名: zoo3
  コンテナ名: zoo3
  特権: true
  ポート:
   - 2183:2181
  ボリューム:
   - ./zoo3/データ:/データ
   - ./zoo3/データログ:/データログ
  環境:
   TZ: アジア/上海
   動物園ID: 3
   動物園ポート: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.13

ネットワーク:
 デフォルト:
  外部の:
   名前: zoo_kafka

確認する

図から、 Leaderと 2 つのFlowerがあることがわかります。ここまでで、 Zookeeperクラスターが構築されました。

Kafka クラスターの構築

上記の基盤があれば、 Kafkaクラスターを構築するのにまだ問題がありますか?実際のところ、いくつかの変数の値が異なっているだけです。

上記の例では、単一ノードのKafkaを気にする必要はありません。docker docker-composeメソッドを直接使用して、3 つのノードをデプロイできます。実際、メソッドは似ています。前述のように、それらはいくつかの異なるプロパティにすぎません。この時点では、新しい Docker ネットワークを作成する必要はありません。Zookeeper Zookeeperの構築時に作成されたネットワークを直接使用できます。

環境の準備

カフカ画像: wurstmeister/kafka
Kafka-Manager イメージ: sheepkiller/kafka-manager

# バージョンが指定されていない場合は、デフォルトでイメージの最新バージョンがプルされます。 docker pull wurstmeister/kafka
docker pull sheepkiller/kafka-manager

docker-compose.ymlスクリプトを書く

方向:

docker-composeをインストールする

# スクリプトを取得します$ 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
# 実行権限を付与する $chmod +x /usr/local/bin/docker-compose

任意のディレクトリに新しいdocker-compose.ymlファイルを作成し、次の内容をコピーします。

コマンドdocker-compose up -dを実行します。

コマンド比較
|コマンド|説明|
|-|-|-|
|docker-compose up|すべてのコンテナを起動|
|docker-compose up -d|すべてのコンテナをバックグラウンドで起動して実行します|
|docker-compose up --no-recreate -d|停止したコンテナを再作成しない|
|docker-compose up -d test2|test2 コンテナのみを起動します|
|docker-compose stop|コンテナを停止します|
|docker-compose start|コンテナを起動します|
|docker-compose down|コンテナを停止して破棄します|

docker-compose.ymlダウンロード アドレス: https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml詳細

バージョン: '2'

サービス:
 ブローカー1:
  画像: wurstmeister/kafka
  再起動: 常に
  ホスト名: broker1
  コンテナ名: ブローカー1
  特権: true
  ポート:
   - 「9091:9092」
  環境:
   KAFKA_ブローカーID: 1
   KAFKA_LISTENERS: プレーンテキスト://ブローカー1:9092
   KAFKA_ADVERTISED_LISTENERS: プレーンテキスト://ブローカー1:9092
   KAFKA_ADVERTISED_HOST_NAME: ブローカー1
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1
   ポート: 9988
  ボリューム:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker1:/kafka/kafka\-logs\-broker1
  外部リンク:
  - 動物園1
  - 動物園2
  - 動物園3
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.14

 ブローカー2:
  画像: wurstmeister/kafka
  再起動: 常に
  ホスト名: broker2
  コンテナ名: ブローカー2
  特権: true
  ポート:
   - 「9092:9092」
  環境:
   KAFKA_ブローカーID: 2
   KAFKA_LISTENERS: プレーンテキスト://broker2:9092
   KAFKA_ADVERTISED_LISTENERS: プレーンテキスト://broker2:9092
   KAFKA_ADVERTISED_HOST_NAME: ブローカー2
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1
   ポート: 9988
  ボリューム:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker2:/kafka/kafka\-logs\-broker2
  external_links: #この Compose ファイル外のコンテナに接続します
  - 動物園1
  - 動物園2
  - 動物園3
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.15

 ブローカー3:
  画像: wurstmeister/kafka
  再起動: 常に
  ホスト名: broker3
  コンテナ名: ブローカー3
  特権: true
  ポート:
   - 「9093:9092」
  環境:
   KAFKA_ブローカーID: 3
   KAFKA_LISTENERS: プレーンテキスト://broker3:9092
   KAFKA_ADVERTISED_LISTENERS: プレーンテキスト://broker3:9092
   KAFKA_ADVERTISED_HOST_NAME: ブローカー3
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1
   ポート: 9988
  ボリューム:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker3:/kafka/kafka\-logs\-broker3
  external_links: #この Compose ファイル外のコンテナに接続します
  - 動物園1
  - 動物園2
  - 動物園3
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.16

 kafka マネージャー:
  イメージ: sheepkiller/kafka-manager:latest
  再起動: 常に
  コンテナ名: kafka-manager
  ホスト名: kafka-manager
  ポート:
   - 「9000:9000」
  links: # このComposeファイルによって作成されたコンテナに接続します
   - ブローカー1
   - ブローカー2
   - ブローカー3
  external_links: #この Compose ファイル外のコンテナに接続します
   - 動物園1
   - 動物園2
   - 動物園3
  環境:
   ZK_HOSTS: zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1
   KAFKA_BROKERS: ブローカー1:9092、ブローカー2:9092、ブローカー3:9092
   アプリケーションシークレット: letmein
   KM_ARGS: -Djava.net.preferIPv4Stack=true
  ネットワーク:
   デフォルト:
    ipv4_アドレス: 172.23.0.10

ネットワーク:
 デフォルト:
  external: # 作成されたネットワーク名を使用する: zoo_kafka

確認する

kafka-managerの管理ページを開くと、アクセス パスは host ip:9000 です。


表示されている場合、 Zookeeperクラスターのアドレスを入力し、一番下までスクロールしてsave

追加したクラスターをクリックすると、クラスター内に 3 つのノードがあることがわかります。

建設プロセス中に発生した問題

データ ボリュームをマウントすると、無限に再起動します。 logプロンプトを確認すると、chown: '/var/lib/mysql/....' の所有権を変更しています: 権限が拒否されました

解決:

  • コンテナに特定の権限を与えるには、docker runに--privileged=trueを追加します。
  • selinux を一時的に無効にする: setenforce 0
  • マウントするディレクトリのセキュリティテキストを変更するには、selinuxルールを追加します。

kafka-managerはjmx関連のエラーを報告します。

解決:

  • 各kafkaノードに環境変数JMX_PORT=portを追加します。
  • 追加した後、接続できないことがわかりました。ネットワーク接続の問題でした。そこで、各 jmx ポートを公開し、ファイアウォールを通過させたところ、問題は解決しました。
  • KAFKA_ADVERTISED_HOST_NAME をホスト マシンの IP アドレスに設定するのが最適です。ホスト マシン外部のコードやツールが接続できるため、後続のポートも公開ポートに設定する必要があります。

[エラー] kmjKafkaJMX$ - サービスへの接続に失敗しました:jmx:rmi:///jndi/rmi://9.11.8.48:-1/jmxrmi java.lang.IllegalArgumentException: 要件が失敗しました: jmx ポートがありませんが、jmx ポーリングは有効になっています!

コンテナ内のtopicを表示すると、次のエラーが報告されます(トピックコマンドだけでなく、すべてのコマンドがエラーになるようです)

$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1
# 以下はエラーです。エラー: エージェントによってスローされた例外: java.rmi.server.ExportException: ポートは既に使用中です: 7203; ネストされた例外:
    java.net.BindException: アドレスはすでに使用されています

解決:

コマンドの前にunset JMX_PORT;コマンドを追加すると、上記のコマンドは次のように変換されます。

$ JMX_PORT を設定解除します。bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1、zoo2:2181/kafka1、zoo3:2181/kafka1

付録: 一般的な Docker の手順

# すべての Docker イメージを表示
# 実行中のコンテナをすべて表示 docker ps
# すべてのコンテナを表示 docker ps -a
# すべてのコンテナの IP を取得する
$ docker examine --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
# コンテナの内部ログを表示します $ docker logs -f <コンテナID>
# コンテナに入る $ docker exec -it <コンテナID> /bin/basj
# コンテナを作成します -d はバックグラウンド起動を表します docker run --name <コンテナ名> -e <パラメータ> -v <マウントデータボリューム> <コンテナID>
# コンテナを再起動します docker restart <コンテナID>
#コンテナをシャットダウンする docker stop <コンテナID>
# コンテナを実行します docker start <コンテナID>

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker で Zookeeper をインストールする (スタンドアロンおよびクラスター)
  • docker で Zookeeper クラスターを構築する方法

<<:  JSを使用して画像を効果的に圧縮する方法

>>:  JDBC および MySQL 一時テーブルスペースの詳細な分析

推薦する

CentOS7 で MySQL 5.7.24 をコンパイルしてインストールする詳細なチュートリアル

目次依存関係をインストールするブーストをインストールMySQLをコンパイルしてインストールする構成依...

ふるい抽選を実施するミニプログラム

この記事の例では、ふるい抽選を実装するためのミニプログラムの具体的なコードを参考までに共有しています...

innerHTML アプリケーション

ブランクのブログ: http://www.planabc.net/ innerHTML プロパティは...

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

MySQL監視グループレプリケーションについて簡単に説明します

元のテキスト: https://dev.mysql.com/doc/refman/8.0/en/gr...

CSSはインラインブロックのずれの問題を解決します

もうナンセンスじゃない、郵便番号HTML部分 <div class="positio...

el-table カプセル化に基づくドラッグ可能な行と列、および選択列コンポーネントの実装

効果環境が必要ビュー要素UIドラッグアンドドロッププラグインSortable.js必要な構成プロパテ...

Vue3のレスポンシブ原則の詳細な説明

目次Vue2 レスポンシブ原則のレビューVue3 レスポンシブ原則の分析ネストされたオブジェクトの応...

MySQL 文字セットの変更に関する実践的なチュートリアル

序文: MySQL では、システムが多くの文字セットをサポートしており、異なる文字セット間にはわずか...

Docker デプロイメント MySQL8 クラスター (マスター 1 台とスレーブ 2 台) の実装手順

目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...

ElementUI el-select の過剰なデータに対する解決策についての簡単な説明

目次1. シナリオの説明2. 解決策オプションが多すぎる el-select コンポーネントの解決策...

Vue ページ監視ユーザープレビュー時間機能実装コード

最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...

Centos 7 64 ビット デスクトップ バージョンのインストール グラフィック チュートリアル

システムが遅いと感じてソースを変更したい場合は、別の記事で整理しました https://blog.c...

MySQL 8.0.13 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

MySQL 8.0.13 のインストールと設定方法を皆さんと共有したいと思います。お役に立てれば幸...

Vueはチャットインターフェースを実装する

この記事の例では、チャットインターフェースの表示を実現するためのVueの具体的なコードを参考までに共...