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データベースにパスワードを入力した後にフラッシュバックする問題の解決策

推薦する

vue-amap のインストールと使用手順

以前、Amap API を非同期にロードする方法を紹介しました。今回は、vue-amap の使用方法...

10分でCSS3グリッドレイアウトを理解する

基本的な紹介前回の記事では、CSS3 のフレックスボックスを紹介しました。今日は、CSS3 のもう ...

MySQLストアドプロシージャの原理と使用法の詳細な説明

この記事では、例を使用して、MySQL ストアド プロシージャの原理と使用方法を説明します。ご参考ま...

HTML に CSS を導入するいくつかの方法の紹介

目次1. HTMLタグ要素にCSSスタイルを直接埋め込む2. HTMLのheadセクションにおけるス...

MySQL 学習のまとめ: InnoDB ストレージ エンジンのアーキテクチャ設計の予備的な理解

1. ストレージエンジン前のセクションでは、SQL 実行プランは、エグゼキュータ コンポーネントがス...

MySQL で null を置き換える IFNULL() および COALESCE() 関数の詳細な説明

MySQLではisnull()関数をnull値の代わりとして使用することはできません。次のように:ま...

docker ベースの redis-sentinel クラスターの構築例

1. 概要Redis Cluster は、Redis ノードのグループ間での高可用性とシャーディング...

Vueはフィルターを使用して日付をフォーマットします

この記事では、フィルターを使用して日付をフォーマットするVueの具体的なコードを参考までに紹介します...

Vue における $router と $route の違いの詳細な説明

通常、vue プロジェクトではルーティングを使用します。vue-router は vue.js の公...

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...

Vueコンポーネントドキュメントを自動生成する方法を分析する

目次1. 現状2. コミュニティソリューション2.1 事業レビュー3. 技術的ソリューション3.1....

Dockerで作成したコンテナを削除する方法

Dockerで作成したコンテナを削除する方法1. まず、docker -s -aコマンドを使用してす...

HTML で js を使用してローカル システム時間を取得する

コードをコピーコードは次のとおりです。 <div id="名前"> ...

JavaScript 非同期プログラミングにおける Promise の初期の使用法の詳細な説明

1. 概要Promise オブジェクトは、ES6 で提案された非同期プログラミングの仕様です。非同期...