Dockerを使用してElasticsearchクラスターを素早くデプロイする方法

Dockerを使用してElasticsearchクラスターを素早くデプロイする方法

この記事では、 Dockerコンテナ ( docker-composeを使用してオーケストレーション) を使用して、開発環境 (単一マシンの複数インスタンス) または実稼働環境で使用できるElasticsearch 集群迅速にデプロイします。

6.xバージョンでは、 -Epath.configパラメータを使用して構成ファイルの読み込み場所を指定できなくなりました。ドキュメントには次のように記載されています。

アーカイブ配布の場合、config ディレクトリの場所はデフォルトで$ES_HOME/configになります。config ディレクトリの場所は、次のようにES_PATH_CONF環境変数を使用してcan be changed
ES_PATH_CONF=/path/to/my/config ./bin/elasticsearch
あるいは、コマンド ラインまたはシェル プロファイル経由で ES_PATH_CONF 環境変数をエクスポートすることもできます。

つまり、環境変数ES_PATH_CONF (公式ドキュメント) によって設定されます。1 台のマシンに複数のインスタンスを展開し、コンテナーを使用しない学生は、さらに注意する必要があります。

準備

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

ここでは、インストールを高速化するために daocloud の使用を推奨します。

#ドッカー
curl -sSL https://get.daocloud.io/docker | sh

#docker-compose
カール -L \
https://get.daocloud.io/docker/compose/releases/download/1.23.2/docker-compose-`uname -s`-`uname -m` \
> /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

#インストール結果を表示する docker-compose -v

データディレクトリ

#データ/ログディレクトリを作成する ここでは3つのノードをデプロイします mkdir /opt/elasticsearch/data/{node0,nod1,node2} -p
mkdir /opt/elasticsearch/logs/{node0,nod1,node2} -p
cd /opt/elasticsearch
#パーミッション 私も混乱しています。特権を与えてもうまくいかないので、0777 を使用します。chmod 0777 data/* -R && chmod 0777 logs/* -R

#JVM がエラーを報告しないようにする echo vm.max_map_count=262144 >> /etc/sysctl.conf
sysctl -p

docker-comse オーケストレーション サービス

オーケストレーションファイルを作成する

vim docker-compose.yml

パラメータの説明

- cluster.name=elasticsearch-cluster

クラスター名

- node.name=node0
- node.master=true
- node.data=true

ノード名、マスターノードとして使用できるかどうか、データを保存するかどうか

- bootstrap.memory_lock=true

プロセスの物理メモリアドレスをロックしてスワップ(スワップ)を回避し、パフォーマンスを向上させる

- http.cors.enabled=true
- http.cors.allow-origin=*

Headプラグインを使用するにはcorsを有効にする

- "ES_JAVA_OPTS=-Xms512m -Xmx512m"

JVM メモリ サイズの構成

- "discovery.zen.ping.unicast.hosts=elasticsearch_n0,elasticsearch_n1,elasticsearch_n2"
- "discovery.zen.minimum_master_nodes=2"

5.2.1以降のバージョンではマルチキャストがサポートされていないため、クラスター節點發現failoverのために、クラスター内の各ノードのtcpデータ交換アドレスを手動で指定する必要があります。デフォルトのポートは9300です。他のポートが設定されている場合は、個別に指定する必要があります。ここでは、コンテナー通信を直接使用するか、各ノードの9300ホストにマッピングして、ネットワーク ポートを介して通信することができます。

failover選択quorum = nodes/2 + 1を設定します

もちろん、独自の設定ファイルをマウントすることもできます。ES ESの設定ファイルは/usr/share/elasticsearch/config/elasticsearch.ymlで、次のようにマウントされます。

ボリューム:
 - パス/to/local/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro

ドッカーの作成

バージョン: '3'
サービス:
 エラスティックサーチ_n0:
  画像: elasticsearch:6.6.2
  コンテナ名: elasticsearch_n0
  特権: true
  環境:
   - クラスター名=elasticsearch-cluster
   - ノード名=ノード0
   - ノードマスター=true
   - ノードデータ=true
   - bootstrap.memory_lock=true
   - http.cors.enabled = true です
   - http.cors.allow-origin=*
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
   - 「discovery.zen.ping.unicast.hosts=elasticsearch_n0、elasticsearch_n1、elasticsearch_n2」
   - 「discovery.zen.minimum_master_nodes=2」
  ulimits:
   メモリロック:
    ソフト: -1
    難しい: -1
  ボリューム:
   - ./data/node0:/usr/share/elasticsearch/データ
   - ./logs/node0:/usr/share/elasticsearch/logs
  ポート:
   - 9200:9200
 エラスティックサーチ_n1:
  画像: elasticsearch:6.6.2
  コンテナ名: elasticsearch_n1
  特権: true
  環境:
   - クラスター名=elasticsearch-cluster
   - ノード名=ノード1
   - ノードマスター=true
   - ノードデータ=true
   - bootstrap.memory_lock=true
   - http.cors.enabled = true です
   - http.cors.allow-origin=*
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
   - 「discovery.zen.ping.unicast.hosts=elasticsearch_n0、elasticsearch_n1、elasticsearch_n2」
   - 「discovery.zen.minimum_master_nodes=2」
  ulimits:
   メモリロック:
    ソフト: -1
    難しい: -1
  ボリューム:
   - ./data/node1:/usr/share/elasticsearch/データ
   - ./logs/node1:/usr/share/elasticsearch/logs
  ポート:
   - 9201:9200
 エラスティックサーチ_n2:
  画像: elasticsearch:6.6.2
  コンテナ名: elasticsearch_n2
  特権: true
  環境:
   - クラスター名=elasticsearch-cluster
   - ノード名=ノード2
   - ノードマスター=true
   - ノードデータ=true
   - bootstrap.memory_lock=true
   - http.cors.enabled = true です
   - http.cors.allow-origin=*
   - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
   - 「discovery.zen.ping.unicast.hosts=elasticsearch_n0、elasticsearch_n1、elasticsearch_n2」
   - "discovery.zen.minimum_master_nodes=2"
  ulimits:
   メモリロック:
    ソフト: -1
    難しい: -1
  ボリューム:
   - ./data/node2:/usr/share/elasticsearch/データ
   ログファイル
  ポート:
   - 9202:9200

ここでは、ホストの9200/9201/9202それぞれnode0/node1/node2http服務端口として開き、各インスタンスのtcp數據傳輸はデフォルトの9300を使用してコンテナーを介した通信を管理します。

複数マシンの展開が必要な場合は、 ES transport.tcp.port: 9300ポートをホスト マシンのxxxxポートにマップし、 discovery.zen.ping.unicast.hosts各ホスト エージェントのアドレスを入力します。

#たとえば、ホストの1つは192.168.1.100です
  ...
  - 「discovery.zen.ping.unicast.hosts=192.168.1.100:9300,192.168.1.101:9300,192.168.1.102:9300」
  ...
ポート:
 ...
 - 9300:9300

サービスを作成して開始する

[root@localhost elasticsearch]# docker-compose up -d
[root@localhost elasticsearch]# docker-compose ps
   名前 コマンド 状態 ポート       
----------------------------------------------------------------------------------------------
elasticsearch_n0 /usr/local/bin/docker-entr ... 0.0.0.0:9200->9200/tcp、9300/tcp がアップ
elasticsearch_n1 /usr/local/bin/docker-entr ... 0.0.0.0:9201->9200/tcp、9300/tcp がアップ
elasticsearch_n2 /usr/local/bin/docker-entr ... 0.0.0.0:9202->9200/tcp、9300/tcp がアップ

#起動に失敗しましたエラーを表示できませんでした [root@localhost elasticsearch]# docker-compose ログ
#せいぜい、アクセス権/JVM vm.max_map_count 設定の問題です

クラスターのステータスを確認する

192.168.20.6 是我的服務器地址

クラスターのステータスを表示するには、 http://192.168.20.6:9200/_cat/nodes?v 9200/_cat/nodes?v にアクセスしてください。

ip ヒープ.パーセント ram.パーセント cpu load_1m load_5m load_15m node.role マスター名
172.25.0.3 36 98 79 3.43 0.88 0.54 mdi * ノード0
172.25.0.2 48 98 79 3.43 0.88 0.54 mdi - ノード2
172.25.0.4 42 98 51 3.43 0.88 0.54 mdi - ノード1

フェイルオーバーの検証

クラスタインターフェースを通じてステータスを確認する

マスター ノードがオフラインになることをシミュレートし、クラスターは新しいマスター ノードの選択を開始し、データを移行して再シャーディングします。

[root@localhost elasticsearch]# docker-compose stop elasticsearch_n0
elasticsearch_n0 を停止しています...完了

クラスターのステータス (http ポートを変更した後、元のマスター ノードはオフラインになっていることに注意してください)。ダウンしたノードはまだクラスター内にあり、回復せずに一定期間待機した後、削除されます。

ip ヒープ.パーセント ram.パーセント cpu load_1m load_5m load_15m node.role マスター名
172.25.0.2 57 84 5 0.46 0.65 0.50 mdi - ノード2
172.25.0.4 49 84 5 0.46 0.65 0.50 mdi * ノード1
172.25.0.3 mdi-node0

しばらくお待ちください

ip ヒープ.パーセント ram.パーセント cpu load_1m load_5m load_15m node.role マスター名
172.25.0.2 44 84 1 0.10 0.33 0.40 mdi - ノード2
172.25.0.4 34 84 1 0.10 0.33 0.40 mdi * ノード1

ノード node0 を復元する

[root@localhost elasticsearch]# docker-compose で elasticsearch_n0 を起動します
elasticsearch_n0 を開始しています...完了

しばらくお待ちください

ip ヒープ.パーセント ram.パーセント cpu load_1m load_5m load_15m node.role マスター名
172.25.0.2 52 98 25 0.67 0.43 0.43 mdi - ノード2
172.25.0.4 43 98 25 0.67 0.43 0.43 mdi * ノード1
172.25.0.3 40 98 46 0.67 0.43 0.43 mdi - ノード0

Headプラグインで観察する

git クローン git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npmインストール
npm 実行開始

クラスタステータスダイアグラムにより、自動データ移行のプロセスがわかりやすくなります。

1. クラスターの通常データは3つのノードに安全に分散されます

2. オフラインノード1のマスターノードクラスタがデータの移行を開始する

移行中

移行完了

3. ノード1を復元する

質問メモ

elasticsearch 透かし

デプロイ後、インデックスを作成すると、一部のシャードが未署名状態であることがわかりました。これは、elasticsearch ウォーターマーク: low、high、flood_stage 制限によるものです。デフォルトでは、ハードディスクの使用率が85%を超えるとアラームが発行されます。開発の場合は、手動でオフにすることをお勧めします。データは各ノードにシャーディングされ、本番環境では独自の判断が下されます。

curl -X PUT http://192.168.20.6:9201/_cluster/settings \
-H 'コンテンツタイプ':'application/json' \
-d '{"transient":{"cluster.routing.allocation.disk.threshold_enabled": false}}'

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

以下もご興味があるかもしれません:
  • ElasticSearch 6.4.0 クラスタ構築の詳細な説明
  • ElasticSearch のインデックス断片化の合理的な割り当て原則
  • Docker を使用した ElasticSearch:7.8.0 クラスターのインストールに関する詳細なチュートリアル
  • Elasticsearch のクラスター構築とデータシャーディングプロセスの詳細な説明

<<:  Vue2.0/3.0双方向データバインディングの実装原理の詳細説明

>>:  MySQLデータベースにパスワードを入力した後にフラッシュバックする問題の解決策

推薦する

SQL 面接の質問: 時間差の合計を求める (重複は無視)

ある会社の BI 職の面接を受けたとき、面接で SQL に関する質問がありました。一見すると非常に簡...

CSSアニメーションによるテーブルスクロールカルーセル効果の実装

前回の CSS 回転灯と同じ内容の CSS アニメーションの応用です。これは単なる別のアプリケーショ...

Linux で Nginx ロード バランシングを使用して複数の Tomcat を構成する方法

Linux に nginx と複数の tomcat をインストールする方法はここでは紹介しません。不...

Linux ファイル管理コマンド例の分析 [表示、閲覧、統計など]

この記事では、Linux ファイル管理コマンドについて例を挙げて説明します。ご参考までに、詳細は以下...

Linux環境にJDKとTomcatをインストールする詳細な手順

目次1. JDKをインストールする手動インストール2. トムキャット1. JDKをインストールする注...

HTML 5.1 学習: 14 の新機能とアプリケーション例

序文ご存知のとおり、HTML5 はインターネット コミュニティ全体に標準を提供する組織である Wor...

使用したコマンドを表示するLinuxコマンドメソッドの概要

システムでは多くのコマンドが使用されていますが、使用したコマンドをどのように確認すればよいでしょうか...

MySQL のフィールドに一意のインデックスを追加および削除する方法

1. PRIMARY KEY(主キーインデックス)を追加するmysql>ALTER TABLE...

ウェブサイト上のWeiboコンポーネントの再設計の詳細な紹介(写真とテキスト)

前面に書かれたWeibo コンポーネントは、サードパーティのアクセス ユーザーが開発を必要とせずに ...

HTMLページの文字セットを指定する2つの方法

1. HTMLページの文字セットを指定する2つの方法方法1: <メタ文字セット="u...

CSS3はブラウザのスクロールバーのスタイルを変更します

注意: この方法は、Webkit ベースのブラウザにのみ適用されます。ブラウザのスクロールバーが広す...

Vue のリスナーの基本的な使用例

目次序文1. リスナーの基本的な使い方2. リスナー形式3. ページに入るとすぐに監視とディープモニ...

MySQL 8.0.23 インストールの超詳細なチュートリアル

目次序文1. 公式サイトからMySQLをダウンロードする2. 解凍ファイルを設定する3. 初期化4....

Javascriptジェネレータの紹介と使用

ジェネレータとは何ですか?ジェネレーターは関数内で実行されるコードです。値を返した後、一時停止し、呼...

Nginx を使用してクロスドメイン Vue 開発環境を処理する方法

1. 需要正しい Cookie 配信と SSO テストを確実に実行できるように、ローカル テスト ド...