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

推薦する

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

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

Alibaba Cloud サーバーの購入とインストール方法

1. サーバーを購入するこの例では、購入したサーバーはAlibaba Cloudです。大学生はAli...

Debian ベースの Linux システム ソフトウェア インストール コマンドの詳細な説明 (推奨)

Debian の紹介Debian は、広い意味では、フリーなオペレーティング システムの作成に専念...

webpackコード断片化の実装

目次背景コモンズチャンクプラグイン分割チャンク構成リソースを非同期に読み込む要約する背景高性能なアプ...

テーブルセルの幅tdの設定は無効であり、内部コンテンツによって常に引き伸ばされます

テーブルページを作成するときに、td に設定された幅が無効になることがあります。td の幅は常に内部...

Dockerはコンテナに入るためにルートを使用する

まずdockerコンテナを実行しますルートユーザーとしてコマンドを実行する sudo docker ...

MySQL レプリケーションの利点と原則を詳しく説明します

レプリケーションとは、マスター データベースの DDL および DML 操作をバイナリ ログを介して...

HTML TextArea でのフォーマット保存の問題の解決方法

textarea の形式は保存時にデータベースに保存できますが、表示時には /n と相互に変換できな...

CSS3 引用のソースと出典をマークする方法

疫病のせいで家にこもりきりで、頭がおかしくなりそうなので、パソコンを起動して頭を働かせてみました。今...

MySQLデータベースのマスタースレーブレプリケーションの長い遅延に対する解決策

序文MySQL マスター スレーブ レプリケーションの遅延は、業界では長年の問題となっています。遅延...

Vueはユーザーログイン切り替えを実装します

この記事では、ユーザーのログイン切り替えを実現するためのVueの具体的なコードを例として紹介します。...

ヘッダーのチェックボックスをテキスト実装コードに変更するための選択テーブルを持つ要素

方法1: テーブル属性を使用する: header-cell-class-name テーブルインターフ...

MySQLイベント計画タスクに関する簡単な説明

1. イベントが有効になっているかどうかを確認する'%sche%' のような変数を表...

Zabbix は DingTalk のアラーム機能を画像付きで設定します

実装のアイデア:まず、アラーム情報にはitemidが必要です。これは前提条件です。情報に渡されるパラ...

インタビュアーはCSSで固定アスペクト比を実現する方法を尋ねました

この質問に関連するニーズはまだないかもしれませんし、面接でこの質問をされたことがないかもしれませんが...