web-dev-qa-db-ja.com

Dockerコンテナーを使用した3ノードElastic Searchクラスターのブートストラップ

私は公式の 7.2. Dockerイメージを使用して、3つの個別のホストでテストElastic Searchクラスターをセットアップしようとしています

各コンテナーは、次のようなelasticsearch.ymlで構成されています

cluster.name: mytest
network.Host: "0.0.0.0"
node.name: mytest-10.131.105.90
discovery.seed_hosts:
  - "10.131.128.252:9300"
  - "10.131.129.28:9300"
  - "10.131.105.90:9300"
cluster.initial_master_nodes:
  - mytest-10.131.128.252
  - mytest-10.131.129.28
  - mytest-10.131.105.90

各ノードが起動すると、他のノードを検出できなくなり、これを報告します

{
  "type": "server",
  "timestamp": "2019-07-04T18:42:18,751+0000",
  "level": "WARN",
  "component": "o.e.c.c.ClusterFormationFailureHelper",
  "cluster.name": "mytest",
  "node.name": "mytest-10.131.105.90",
  "message": "master not discovered yet, this node has not previously joined a bootstrapped (v7+) cluster, and this node must discover master-eligible nodes [mytest-10.131.128.252, mytest-10.131.129.28, mytest-10.131.105.90] to bootstrap a cluster: have discovered []; discovery will continue using [10.131.128.252:9300, 10.131.129.28:9300, 10.131.105.90:9300] from hosts providers and [{mytest-10.131.105.90}{qZqV5-4RSduwKNYIOWVB9A}{_nCNwrToRoeNAiWBO1DbGg}{134.209.178.145}{134.209.178.145:9300}{ml.machine_memory=2090500096, xpack.installed=true, ml.max_open_jobs=20}] from last-known cluster state; node term 0, last-accepted version 0 in term 0"
}

Wordの折り返しでその長いエラーを繰り返すだけです...

マスターはまだ検出されていません。このノードは以前にブートストラップ(v7 +)クラスターに参加していないため、このノードはマスター適格ノード[mytest-10.131.128.252、mytest-10.131.129.28、mytest-10.131.105.90]をbootstrapクラスター:[]を検出しました;検出は、ホストプロバイダーからの[10.131.128.252:9300、10.131.129.28:9300、10.131.105.90:9300]と[{mytest-10.131.105.90} {qZqV5-4RSduwKNYIOWVB9A} {_ nCNwrToRoeNAiWBO1DbGg} {134.209.178.145} {145.145} {134。 .178.145:9300} {ml.machine_memory = 2090500096、xpack.installed = true、ml.max_open_jobs = 20}]最後の既知のクラスター状態から。ノード用語0、用語0の最後に受け入れられたバージョン0

ネットワークの問題ではないようです。コンテナー内から、curlを使用して他のノードのポート9200および9300へのアクセスを確認できます。

それがノード名について微妙なものであると思われ、この質問を書いているときに答えに出くわしたいと思っていました。ああ、そうではない。

補遺-docker run

私のdocker runはこのようになり、少し簡略化されています(${IP}はホストマシンのIPアドレスです)。

docker run --rm --name elasticsearch \
  -p ${IP}:9200:9200 -p ${IP}:9300:9300 \
  --network Host \
  my-elasticsearch:7.2.0 \
  /usr/local/bin/start-clustered-es.sh 

各コンテナは別々のマシンで実行されています。 start-clustered-es.shは、上記のようにelasticsearch.ymlファイルを書き込むだけなので、各ノードは同じ構成で開始されます。ファイルが書き込まれると、exec /usr/local/bin/docker-entrypoint.sh eswrapperを使用して基本コンテナの起動スクリプトを呼び出します

設定ではホストマシンのIPを使用しているため、--network Hostを試しました。コンテナーの内側から、他のマシンのポート9200/9300に到達できるので、ネットワークの問題であると見えません

どんなポインタでも大歓迎です...

3
Paul Dixon

1つのアイデアは、transport.profiles.default.portまたはtransport.portを制限するか、Dockerの実行時に-p9300-9400の完全なデフォルト範囲に設定することです。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-transport.htmltransport.profiles.default.portのドキュメントによると、デフォルトは9300-9400です。

さらにdiscovery.seed_hostsは、そのポートがtransport.profiles.default.portに関連していることを示しています。 https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery-settings.html

この提案が役に立てば幸いです。バージョン6.xを使用して最後のクラスターを形成したときに、Dockerでいくつかのdiscovery.zen値が必要になったためです。

1
hargut