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は指定されたユーザーのデータベースビュークエリ権限を設定します

推薦する

MySQL のロックに関する問題

ロックの分類:データ操作の粒度から:テーブルロック:操作時にテーブル全体がロックされます。行ロック:...

OpenLayersはポイントフィーチャーレイヤーの集約表示方法を実現します

目次1. はじめに2. ポイントフィーチャーレイヤーの集約3. 重合の特殊処理4. 重合の特殊処理 ...

xshell を使用して VMware で Linux に接続する方法 (2 つの方法)

【序文】最近、ITOO の試験システムのストレステストを行いたいので、自分のコンピュータに Lin...

DOCTYPE要素詳細説明完全版

1. 概要この記事では、DOCTYPE要素を体系的に説明します。同時に、多くの情報を調べました。イン...

Ubuntu 18.04 は pyenv、pyenv-virtualenv、virtualenv、Numpy、SciPy、Pillow、Matplotlib をインストールします

1. 現在、Pythonのバージョン管理ツールは数多く存在します。その中でも比較的使いやすいのがPy...

JavaScript データ プロキシとイベントの詳細な分析

目次データブローカーとイベントObject.defineProperty メソッドのレビューデータブ...

ウェブページに埋め込まれた Flash と IE、FF、Maxthon の互換性の問題

いろいろ苦労した後、インターネットで検索したり、以前の会社のプロジェクトを探したり、他の人のプロジェ...

Linuxフラッシュのインストール方法

Linuxにフラッシュをインストールする方法1. Flashの公式サイトにアクセスし、ダウンロードを...

Vue+Vantはトップ検索バーを実装します

この記事では、参考までに、Vue+Vant のトップ検索バーを実装するための具体的なコードを紹介しま...

Vue ElementUI は非同期読み込みツリーを実装します

この記事の例では、vue ElementUI の非同期読み込みツリーを実装するための具体的なコードを...

MySQL 百万レベルのデータページングクエリ最適化ソリューション

データベースからクエリする必要があるテーブルに数万件のレコードがある場合、すべての結果を一度にクエリ...

CSSを使用して炎の効果を作成する方法

本文は以下から始まります。 123WORDPRESS.COM ダウンロード:純粋な CSS3 で超リ...

17の広告効果測定の解釈

1. 広告の 85% は未読です<br />解釈: 成功する広告の 15% にどうやって...

HTML 画像 img タグ_Powernode Java アカデミー

まとめプロジェクトの説明形式<img src="..."> H2+ ...