[フレックス検索]クラスタ構成


Elastic Searchクラスタを構成して実行します.デフォルトでは、Elastic SearchはJavaベースであるため、実行環境を直接構成することが難しくてもカーネルイメージを利用しています.Elistic Searchバージョンは2022年2月に新たにリリースされた8.0に基づいている.

1.単一ノードの構成


まず、ノードを構成して実行しましょう.1つのノードとして実行すると、1つのノードにはプライマリノードとデータの両方の役割があります.

1.1 Config Files

# elasticsearch.yml
cluster.name: "es-cluster"
discovery.type: "single-node"
network.host: 0.0.0.0

xpack.security.enabled: true
プロファイルは次のとおりです.discover.typeの値が単一ノードに設定されている場合は、単一ノードでのみ実行できます.

1.2 Run


フレキシブルスタック間で共有ネットワークを作成し、キースロットに実行することを考慮します.
$> docker network create elastic
作成したネットワークを使用して、フレックスサーフェスイメージを実行します.Java Hipメモリは1 GBに設定されています.
$> docker run -d --name elasticsearch \
       --net elastic \
       -p 9200:9200 -p 9300:9300 \
       -e ES_JAVA_OPTS="-Xms1g -Xmx1g" \
       -v `pwd`/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
       docker.elastic.co/elasticsearch/elasticsearch:8.0.1

8.0.1: Pulling from elasticsearch/elasticsearch
4fb807caa40a: Pull complete
939e6d6de1cd: Pull complete
c6e272a692c1: Pull complete
c35cf7d81655: Extracting  127.6MB/573.9MB
00b951a3ddcb: Download complete
c1686887c5ec: Download complete
c9c4cd9d9e71: Download complete
ff28b3874cac: Download complete
d8fe9cb3f525: Download complete
8287b1c3b76d: Download complete

$> docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  ...
e775a4a0c6ef   docker.elastic.co/elasticsearch/elasticsearch:8.0.1   "/bin/tini -- /usr/l…"   ...

1.3 Check


コマンドラインでは、curlを使用してElastic Searchに直接リクエストを送信できます.
$> curl -XGET http://localhost:9200?pretty=true
{
  "error" : {
    "root_cause" : [
      {
        "type" : "security_exception",
        "reason" : "missing authentication credentials for REST request [/?pretty=true]",
        "header" : {
          "WWW-Authenticate" : [
            "Basic realm=\"security\" charset=\"UTF-8\"",
            "ApiKey"
          ]
        }
      }
    ],
    "type" : "security_exception",
    "reason" : "missing authentication credentials for REST request [/?pretty=true]",
    "header" : {
      "WWW-Authenticate" : [
        "Basic realm=\"security\" charset=\"UTF-8\"",
        "ApiKey"
      ]
    }
  },
  "status" : 401
}
しかし、エラーが発生します.クライアントのパスワードが設定されていないためです.実行中のElastic Searchのコンテナに入り、パスワードリセット操作を行います.
$> docker exec -it elasticsearch /usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive 

...
Changed password for user [elastic]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
パスワードの変更が完了したら、再度Elastic Searchを呼び出します.
$> curl -u elastic:<비밀번호> -XGET http://localhost:9200?pretty=true
{
  "name" : "6287fc9a063f",
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "KrVtgZ0tSR2Xyt2STj5-7Q",
  "version" : {
    "number" : "8.0.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "801d9ccc7c2ee0f2cb121bbe22ab5af77a902372",
    "build_date" : "2022-02-24T13:55:40.601285296Z",
    "build_snapshot" : false,
    "lucene_version" : "9.0.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}
応答が正常であることを確認します.

1.4 Kibana


モニタリングインタフェースを構成するためにキーを追加しました.
# kibana.yml
server.name: "kibana"
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
monitoring.ui.container.elasticsearch.enabled: true

elasticsearch.username: kibana_system
elasticsearch.password: ****
$> docker run -d --name kibana \
       --net elastic \
       -p 5601:5601 \
       -v `pwd`/kibana.yml:/usr/share/kibana/config/kibana.yml \
       docker.elastic.co/kibana/kibana:8.0.1

$> docker ps
CONTAINER ID   IMAGE                                                 COMMAND                  ...
d3be996ea7ea   docker.elastic.co/kibana/kibana:8.0.1                 "/bin/tini -- /usr/l…"   ...
e775a4a0c6ef   docker.elastic.co/elasticsearch/elasticsearch:8.0.1   "/bin/tini -- /usr/l…"   ...
Elastic SearchとKivaはいずれもdocker Networkを使用するため、elasticsearch.hostsを設定する場合は、「localhost」ではなく、指定したCONTAINER NAMEに設定する必要があります.

実行イメージのインスタンスIPまたはドメインの5601ポートに入ると、キーストロークまたは画面が表示されます.先ほど設定したパスワードを入力してログインします.デフォルトでは、ユーザー名は「フレックス」です.
さらに、Kindhub deviantony/docker-elkはdocker-composeスクリプトを提供します.この文書ではlogstashについては説明しないので、削除して実行するだけで簡単に構成できます.

2.クラスタ構成


2.1優先パラメータ


単一クラスタに設定した場合、ローカル環境で実行しても問題は発生しません.ただし、クラスタ構成には複数のインスタンスが必要であるため、ローカルでのみテストは限られています.AWSが提供するクラウドサービスを利用して、今回のElastic Searchクラスタ構成をテストします.
ノード構成は、1つのプライマリノード、3つのデータノード、合計4つのインスタンスのクラスタとして想定されます.すべてのインスタンスはEC 2 t 3である.mediumインスタンス(vCPU 2/mmory:4 GB)を使用し、各ノードは2 GBのhipメモリに設定します.
cluster.name: "es-cluster"  # 동일하게 설정
node.name: 노드 이름
node.roles: ["master"]  # 데이터 노드는 ["data"]
cluster.initial_master_nodes: [마스터 노드 리스트, ...]
discovery.seed_hosts: [클러스터링할 노드의 IP, ... ]
bootstrap.memory_lock: true
network.host: _site_
network.publish_host: 각 인스턴스의 IP
xpack.license.self_generated.type: trial
xpack.security.enabled: false
クラスタ・モードで実行する場合は、フレックス・サーチを使用します.ymlファイルは、通常、各ノードを個別に管理することを推奨します.cluster.nameは、ノードごとに同じ設定を設定する必要があります.クラスタを構成するノード間でcluster.nameが一致しない場合、クラスタは独立して構成され、クラスタは構成されません.node.nameは各ノードの一意の名前であり、「master-1」または「data-1」と明示的にマークすることを推奨します.discovery.seed_hostsは、クラスタノードのIPまたはドメインをリストとして設定する.クラスタを初期構成するときは、リスト内のノードを順に検索し、cluster.nameの値を比較し、一致する場合はクラスタにマージします.

2.2運転


インスタンスごとに弾性測定を実行
$> docker run -d \
       --name elasticsearch \
       -p 9200:9200 -p 9300:9300 \
       -e ES_JAVA_OPTS="-Xms2g -Xmx2g" \
       -v `pwd`/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
       docker.elastic.co/elasticsearch/elasticsearch:8.0.1
すべてのドッキングコンテナがアクティブな場合、Elastic Searchを呼び出してクラスタが正しく構成されているかどうかを確認します.
$> curl -XGET http://localhost:9200/
{
  "name" : "master-1",
  "cluster_name" : "es-cluster",
  "cluster_uuid" : "kwckKcp2SHugiFtr2tpbUw",
  "version" : {
    "number" : "8.0.1",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "801d9ccc7c2ee0f2cb121bbe22ab5af77a902372",
    "build_date" : "2022-02-24T13:55:40.601285296Z",
    "build_snapshot" : false,
    "lucene_version" : "9.0.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

$> curl -XGET http://localhost:9200/_cat/nodes?v=true
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
3.xxx.xxx.51            11          96   0    0.00    0.01     0.08 d         -      data-2
15.xxx.xxx.254          12          96   3    0.00    0.02     0.08 d         -      data-3
52.xxx.xxx.164          33          89  11    0.06    0.02     0.00 m         *      master-1
3.xxx.xxx.37            13          97   0    0.00    0.00     0.07 d         -      data-1
4台のサーバが接続され、クラスタが構成されていることがわかります.マスター-1ノードはプライマリノードとして機能します.

3 Retrospective


クラスタが単一のノードで構成されている場合、適用しやすい部分を解決するのは難しい.今回の記事では、クラスタのみを構成し、セキュリティ、負荷バランスなどの改善が必要です.

3.1 Network


コンテナ内でElastic Searchを実行する場合、ネットワーク設定は複雑であり、network.hostノード間の通信を実現するためにnetwork.publish_hostを設定する必要がある.

3.2メモリマッピング


次のエラーが発生することがあります.
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
デフォルトでは、Elastic Searchはメモリマッピング262144以降からのみ実行できます.各エッジのマッピング数が65536の場合、Elastic Searchは実行されず、上記のエラーが発生します.max map count値を手動で増加する必要があります.
$> cat /proc/sys/vm/max_map_count
65536
$> sysctl -w vm.max_map_count=262144
$> sudo sysctl -w vm.max_map_count=262144

3.3 Security


X-Packの場合、通常は動作モードで有効になります.また,動作モードでは転送SSLを設定する必要があるが,プロセスが煩雑であるため省略した.トライアルライセンスを使用して実行すると、操作モードでもX-Pack設定を回避できます.
References
  • フレキシブルマニュアル
  • Elastic 8.0のインストール
  • https://github.com/deviantony/docker-elk
  • Running the Elastic Stack ("ELK") on Docker
  • The RED:検索エンジンを構築するElasticsearch Master Class by鄭浩旭|快速キャンパス