zk+kafka+storm クラスターの docker-compose デプロイメントの実装

zk+kafka+storm クラスターの docker-compose デプロイメントの実装

クラスターの展開の概要

172.22.12.20 172.22.12.21 172.22.12.22 172.22.12.23 172.22.12.24
動物園1:2181動物園2:2182動物園3:2183 zkui:9090 (管理者/マネージャー)
カフカ1:9092カフカ2:9092カフカ3:9092カフドロップ:9000
インフルクスdb:8086 grafana:3000 (管理者/chanhu)
ストームニンバス1ストームニンバス2ストームニンバス3ポーター:9002(admin/chanhu@123)
ストームスーパーバイザー1ストームスーパーバイザー2ストームスーパーバイザー3
ストーム-UI:8080

Dockerのインストール

yum アップデート -y     
yum インストール -y yum-utils デバイスマッパー永続データ lvm2    
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo    
yum インストール docker-ce docker-ce-cli containerd.io   
systemctl ドッカーを起動する

docker-compose のインストール

yum で epel-release をインストールします   
python-pip をインストールします   
pip インストール --upgrade pip   
pip で docker-compose をインストールします

各ホストマシンのhostsファイルを変更する

vim /etc/hosts   
172.22.12.20 データクラウド0   
172.22.12.21 データクラウド1   
172.22.12.22 データクラウド2   
172.22.12.23 データクラウド3   
172.22.12.24 データクラウド4

飼育員クラスター

マシン20、21、22にzkクラスターをデプロイし、それぞれdocker-composeファイルを書き込みます。

クラスター内の 1 台のマシンのみが正常に動作している場合、クラスターは失敗します。

そのうちの 1 つを例に挙げます。

動物園:   
    画像: 動物園飼育係:3.4.14   
    再起動: 常に   
    ホスト名: zoo1   
    コンテナ名: zoo1   
    ポート:   
     - 2181:2181   
     -2888:2888   
     -3888:3888   
    ボリューム:   
     - 「./zoo/data:/data」   
     - 「./zoo/datalog:/datalog」   
    環境:   
     動物園ID: 1   
     ZOO_SERVERS: サーバー.1=0.0.0.0:2888:3888 サーバー.2=172.22.12.21:2888:3888 サーバー.3=172.22.12.22:2888:3888

「./zoo/data:/data」はデータディレクトリのマウントであり、設定する必要があります

環境変数の設定、ZOO_MY_ID はそれぞれ 1、2、3、ZOO_SERVERS はクラスタ アドレスで構成され、現在のマシンは 0.0.0.0 です。

カクファクラスター

マシン 20、21、22 に kafka クラスターをデプロイし、それぞれに docker-compose ファイルを作成します (zk docker-compose ファイルと一緒に作成することもできます)。

そのうちの 1 つを例に挙げます。

カフカ:   
    画像: wurstmeister/kafka:2.12-2.2.2   
    再起動: 常に   
    ホスト名: kafka1   
    コンテナ名: kafka1   
    ポート:   
     - 「9092:9092」   
    環境:   
     KAFKA_ADVERTISED_LISTENERS: プレーンテキスト://172.22.12.20:9092   
     KAFKA_ADVERTISED_HOST_NAME: 172.22.12.20   
     KAFKA_ADVERTISED_PORT: 9092   
     KAFKA_ZOOKEEPER_CONNECT: 172.22.12.20:2181、172.22.12.21:2181、172.22.12.22:2181   
    ボリューム:   
     - ./kafka/logs:/kafka

注目すべき点はあまりありません。KAFKA_ZOOKEEPER_CONNECT は zk クラスター アドレスで正しく構成されており、ADVERTISED 関連の構成は現在のコンテナー用です。

インフルクスDB

インフルエンスDB:   
    画像: influxdb:1.7   
    再起動: 常に   
    コンテナ名: influxdb   
    ポート:   
     - 「2003:2003」   
     - 「8086:8086」   
     - 「8089:8089」   
     - 「8091:8091」   
    ボリューム:   
     - 「./influxdb:/var/lib/influxdb」   
    環境:   
     - INFLUXDB_GRAPHITE_ENABLED = true  

「./influxdb:/var/lib/influxdb」はデータ ディレクトリのマウントであり、設定する必要があります。 INFLUXDB_GRAPHITE_ENABLED はグラファイト機能を有効にします。

Influxdb の簡​​単な操作:

  • docker exec -it influxdb インフラックス
  • データベースを表示
  • データベースXXを作成
  • XXを使用する
  • INSERT cpu、ホスト=serverA、リージョン=us_west、値=0.64
  • 「ホスト」、「リージョン」、「値」を「CPU」から選択します。

Docker-compose関連の操作

docker-compose [-f <ファイル名>] up -d   
docker-compose [-f <ファイル名>] ダウン

zkui/kafdrop/grafana

マシン 23 に、次の 3 つの Web インターフェースをデプロイします。

ズクイ:   
    画像: maauso/zkui   
    再起動: 常に   
    コンテナ名: zkui   
    ポート:   
     -9090:9090   
    環境:   
     ZKリスト: 172.22.12.20:2181,172.22.12.21:2181,172.22.12.22:2181   
   カフドロップ:   
    画像: obsidiandynamics/kafdrop:latest   
    再起動: 常に   
    コンテナ名: kafdrop   
    ポート:   
     - 「9000:9000」   
    環境:   
     KAFKA_BROKERCONNECT: 172.22.12.20:9092、172.22.12.20:9092、172.22.12.20:9092   
   グラファナ:   
    画像: grafana/grafana:master   
    再起動: 常に   
    コンテナ名: grafana   
    ポート:   
     - 「3000:3000」   
    ボリューム:   
     - 「./grafana:/var/lib/grafana」 

Webページなので、該当するサービスアドレスを設定して起動するだけです。

Grafana は、主にカスタム データ ソースやパネル構成などを記録するために、ディレクトリ マウントを使用して構成する必要があります (ここでは chmod -R 777 grafana/ が必要です)

ストームクラスター

ストームクラスターは、ニンバス、スーパーバイザー、UIの3つの部分で構成されています。

Nimbus はマスター ノードで、supervisor はスレーブ ノードです。前者は Zookeeper にタスクを送信し、後者は Zookeeper からタスクを取得します。 ui は Web ページです。

マシン 20、21、22 にそれぞれ 3 つの Nimbus ノードとスーパーバイザー ノードをデプロイし、別の docker-compose スクリプト ファイルを作成して、Zookeeper の起動後に実行することをお勧めします。

docker-compose スクリプトはおおよそ次のようになります。

ニンバス:
  画像: storm:2.2.0
  コンテナ名: nimbus1
  コマンド: ストームニンバス
  再起動: 常に
  ホスト名: nimbus1
  ポート:
   -6627:6627
  ボリューム:
   - 「./storm.yaml:/conf/storm.yaml」
   - 「./nimbus/data:/data」
   - 「./nimbus/logs:/logs」

 監督者:
  画像: storm:2.2.0
  コンテナ名: supervisor1
  指揮: 嵐の監督者
  ホスト名: supervisor1
  依存:
   -ニンバス
  リンク:
   - ニンバス:ニンバス
  再起動: 常に
  ボリューム:
   - 「./storm.yaml:/conf/storm.yaml」
   - 「./supervisor/data:/data」
   - 「./supervisor/logs:/logs」

Nimbus、supervisor、ui はすべて同じ storm イメージを使用しますが、起動時のコマンド パラメーターは異なります。

Nimbus と supervisor のホスト名をここで指定するのは、デフォルトでは、zookeeper に登録されるときのホストが docker コンテナによってランダムに生成される uuid であるためです。

Nimbus と supervisor を再起動すると、コンテナの uuid もリセットされ、zookeeper にすでに保存されている uuid と競合してエラーが発生します。

インターネット上の解決策は次のとおりです。1. ストーム クラスターを停止した後、Zookeeper 上のストーム ノードを削除し、Zookeeper + ストーム クラスターを再起動します。2. ストーム クラスター用に別のステートレス Zookeeper を構築します。

ここでの解決策は、NimbusとSupervisorが登録されているときにホストを指定することです。これは再起動しても変更されません。

起動時にいくつかの環境変数を指定する必要があります。ここでは、ローカル構成ファイル マッピングが使用されます。storm.yaml 構成は次のとおりです。

storm.zookeeper.servers: 
 - 「172.22.12.20」
 - 「172.22.12.21」
 - 「172.22.12.22」
ニンバスシード:
 - 「ニンバス1」
 - 「ニンバス2」
 - 「ニンバス3」
storm.log.dir: "/logs"
storm.local.dir: "/データ"
storm.cluster.mode: 分散

storm.zookeeper.servers は Zookeeper アドレスであり、デフォルトのポートは 2181 です。 nimbus.seeds は nimbus クラスターのアドレスであり、docker-compose でカスタマイズされたホスト名が使用されます。

Storm-ui は単一のインスタンスを起動でき、docker-compose 構成は次のようになります。

ストームUI:
  画像: storm:2.2.0
  コンテナ名: storm-ui
  コマンド: storm ui
  依存:
   -ニンバス
  リンク:
   - ニンバス:ニンバス
  再起動: 常に
  ポート:
   - 8080:8080
  ボリューム:
   - 「./storm.yaml:/conf/storm.yaml」
   - 「./ui/data:/data」
   - 「./ui/logs:/logs」 
  追加ホスト:
   - 「ニンバス1:172.22.12.20」
   - 「ニンバス2:172.22.12.21」
   - 「ニンバス3:172.22.12.22」
   - 「スーパーバイザー1:172.22.12.20」
   - 「スーパーバイザー2:172.22.12.21」
   - 「スーパーバイザー3:172.22.12.22」

このうち、extra_hosts はコンテナ起動後のカスタマイズされたホスト マッピングであり、UI ページの起動後に、登録されたエイリアス ホストを実際の IP アドレスに対応させることができます。

Docker コンテナをデプロイする場合、コンテナの再起動後に構成がリセットされないように、ホストの構成ファイルをコンテナにマップする必要があることがよくあります。

たとえば、storm の構成は、次のようになります: - "./storm.yaml:/conf/storm.yaml"。ただし、マッピング後に、正しい形式の storm.yaml がローカルに存在しない場合、起動は失敗します。公式 Web サイトからインストール パッケージをダウンロードして構成ファイルを取得するだけでなく、最初に一時コンテナーを起動して、その構成ファイルをホストにコピーすることもできます。

docker run -d --name nimbus-tmp storm:2.2.0 storm nimbus

docker cp nimbus-tmp:/conf/storm.yaml ローカルフォルダパス/

運河の展開

canal をデプロイする前に、接続先の MySQL を設定する必要があります。

[mysqld]
log-bin=mysql-bin # binlogを有効にする
binlog-format=ROW # ROWモードを選択 server_id=1 # MySQLの置き換えを構成するには定義が必要です。チャネルのスレーブIDを繰り返さないでください

canal の docker-compose 構成は次のとおりです。

運河サーバー:
  イメージ: canal/canal-server:v1.1.3
  コンテナ名: 運河サーバー
  ポート:
   - 11111:11111
  環境:
   - キャナルインスタンスmysql.スレーブID=12
   - キャナル自動スキャン=false
   - 運河の目的地=データクラウド
   - キャナルインスタンスマスターアドレス=10.23.16.32:3307
   - canal.instance.dbユーザー名=root
   - canal.instance.dbパスワード=chinaunicom@dengfy
   - canal.instance.filter.regex=river\\..*
  ボリューム:
   - ./canal-server/logs/:/admin/canal-server/logs/

slaveId は MySQL で設定されているものと異なる必要があり、destinations はカスタムインスタンス名であり、canal.instance.filter.regex は監視するデータベーステーブルフィルターです。

ポーテナーの展開

Portainer は Docker コンテナのビジュアル管理ツールです。上記マシンの Docker コンテナの管理、ログの表示、起動スクリプトの変更、コンテナの停止などを行うことができます。

まず、各マシンの docker API インターフェースを開く必要があります。

1.vim /usr/lib/systemd/system/docker.service
ExecStartスタートアップ項目に -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock を追加します。
2. dockerサービスを再起動します。systemctl daemon-reload systemctl restart docker

いずれかのマシンに portainer コンテナをデプロイします。

ポーター:
  画像: portainer/portainer:1.24.1
  再起動: 常に
  コンテナ名: portainer_datacloud
  ポート:
   - 「8000:8000」
   - 「9002:9000」
  ボリューム:
   - 「./portainer/data:/data」
   - "/var/run/docker.sock:/var/run/docker.sock"

"/var/run/docker.sock:/var/run/docker.sock" このマッピング関係はスタンドアロン モードで使用されます。リモート API 呼び出しを使用するため、省略できます。

ip:9002 を開いた後、ユーザーとして登録してログインし、設定 > エンドポイント > エンドポイントの追加 > docker を選択します。

エンドポイント URL にターゲット IP:2375 を入力し、パブリック IP にターゲット IP を追加します。送信すると、そのコンテナーの情報がすべて表示されます。

zk+kafka+storm クラスターの docker-compose デプロイメントの実装に関するこの記事はこれで終わりです。より関連性の高い docker compose デプロイメント クラスター コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker コンテナを使用して Kafka クラスターを構築する詳細なプロセス
  • Zookeeper&Kafka クラスターを構築するための Docker の実装
  • DockerでKafkaクラスターを構築する方法

<<:  Vue+Elementでページング効果を実現

>>:  MySqlは指定されたユーザーのデータベースビュークエリ権限を設定します

推薦する

Nginx + consul + upsync を使用して動的負荷分散を実現する方法の詳細な説明

目次前提条件DNSドメイン名解決プロセス外部ネットワークマッピングnginxコア知識nginxとはア...

Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

質問LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

MySQLのファジークエリの要約

1. 一般的な使用法: (1)%で使用する% は 1 つ以上の文字のワイルドカードを表します。たとえ...

MySQLに絵文字表現を保存する詳細な手順

原因: java.sql.SQLException: 列の文字列値が正しくありません: '\...

MySQL システム ユーザーが開くことができるファイルの最大数に関する簡単な説明

本から学ぶことは常に浅はかで、これがさらなるダウンタイムを引き起こすことには決して気づきません......

Vue2 キューブUI 時間セレクターの詳細な説明

目次序文1. 需要と効果必要効果2. コードの実装index.vue(html)日付方法テスト結果3...

DockerとFastDFSのインストールコマンドと使い方の詳しい説明

Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...

crontab 実行時間とシステム時間の不一致の解決方法

序文LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

HTML Webページ作成チュートリアル iframeタグを慎重に使用してください

iframe を使用すると、他の Web サイトのページを簡単に呼び出すことができますが、注意して使...

Jenkins初心者のためのDockerデプロイメントチュートリアルの詳細な説明

この記事では、docker 経由で Jenkins+Maven+SVN+Tomcat をデプロイし、...

Node はあいまい検索用の検索ボックスを実装します

この記事の例では、検索ボックスでファジークエリを実装するためのNodeの具体的なコードを参考までに共...

SQL Server コメントのショートカット キー操作

SQL Server のバッチコメントバッチ注釈Ctrl + (K, C): Ctrlキーを押しなが...

iframeノードの初期化の問題に関する議論

今日、ふとリッチテキストエディタの制作原理を見直してみようと思いました。それで、彼は何も言わずにそれ...

タブ効果を実現する js 開発プラグイン

この記事の例では、タブ効果を実現するためのjsプラグインの具体的なコードを参考までに共有しています。...