ElasticStack クラスターの構築と構成

著者: 禅とコンピュータープログラミングの芸術

1 はじめに

1999 年に、Elasticsearch 社の創設者である清水川ビート氏が ElasticSearch の最初のバージョンをリリースしました。その後、同社は 2010 年に ElasticStack (エンタープライズ検索および分析スイート) を立ち上げました。これは、Elasticsearch、Logstash、Kibana およびその他のソフトウェア コンポーネントを含む、Elasticsearch に基づいて開発されたソリューションの完全なセットです。このスイートは、今日オープンソースの検索とログ分析で最も人気のあるツールとなっています。ElasticStack は幅広い用途があるため、さまざまな技術者に愛用されており、Amazon、IBM、Microsoft、Google、Facebook などの多くの有名なインターネット企業や企業で採用されています。
2017 年には、ElasticStack の最新バージョン 5.x が AWS、Azure、Google Cloud 上でクラウド サービスを提供しました。現在、ElasticStack コミュニティが活発に活動しており、毎月新しいバージョンがリリースされており、ユーザーからのフィードバックも良く、更新速度も非常に速いです。現在、多数のオープンソースおよび商用 ElasticStack 製品、サービス、ソリューションが市場に登場し、ますます多くの開発者が ElasticStack コミュニティに参加するようになっています。
この記事では、ElasticStack クラスターのインストールと設定方法について詳しく説明します。まず、基本的な知識、概念、用語を紹介し、ElasticStack を使用して独自の検索機能を実装する方法を説明します。次に、Elasticsearch クラスターのセットアップ、Kibana ビジュアル インターフェイスのセットアップ、Logstash の統合によるデータ処理機能の向上、ElastAlert を使用したアラームの自動監視の方法に焦点を当てます。最後に、ElasticStack の今後の開発の方向性についても説明します。
この記事の主な読者は、テクノロジーに興味のある IT 実務者、運用保守エンジニア、技術担当者です。

2. 基本的な概念と用語の説明

2.1 検索エンジンとは何ですか?

検索プラットフォームまたは情報検索システムとも呼ばれる検索エンジンは、ユーザーが特定の情報を検索し、ソートされた一連の関連結果を返すのに使用される電子データベースです。大量の情報を発見して整理するために使用される対話型の情報検索ツールです。大規模ネットワークやその他のリポジトリに保存し、ユーザーが必要な情報に迅速かつ効率的にアクセスできるようにします。検索エンジンの目的は、ユーザーの検索用語、クエリ文、または情報分類を通じてユーザーが必要とするコンテンツを見つけ、この情報の関連性をランク付けし、ユーザーが迅速に見つけられるようにニーズに応じてユーザーが必要とする情報を提供することです。必要な情報を収集し、関連情報を入手します。

2.2 Elasticsearch の概要

Elasticsearch は、Lucene (Apache Lucene) に基づくオープンソースの検索サーバーです。全文検索をサポートする分散型のオープンソース検索エンジンを提供し、その目的は、シンプルで実用的な全文検索ソリューションを提供することです。ほぼリアルタイムでデータを保存、検索、分析できます。通常は大規模データのリアルタイム分析検索エンジンとして使用され、Web サイト検索、ビッグデータ分析、ログなどのさまざまなアプリケーション シナリオで広く使用されています。分析など

2.3 Kibana の概要

Kibana は、ElasticSearch に保存されたデータを簡単に参照し、インタラクティブなチャート、グラフ、レポートを生成できるオープンソースのデータ視覚化ツールです。Kibana は、Elasticsearch の公式データ視覚化プラットフォームです。Elasticsearch データの視覚化、分析、検索を提供するように設計されています。Kibana を使用すると、Elasticsearch に保存されているデータを検索、表示、分析、操作できます。複雑な検索やデータ視覚化のニーズに対応する、豊富なカスタマイズされたダッシュボードの作成が可能になります。

2.4 Logstash の概要

Logstash は、データをリアルタイムで変換、フィルタリング、処理し、最終的に Elasticsearch またはその他のログ アーカイブにインデックス付けできるオープン ソース データ収集エンジンです。さまざまなソースからのデータを結合し、ログ データの統一された入り口を提供し、その中でデータのクリーニング、処理、フィルタリングなどの操作を実行して、ログのリアルタイム分析と集計を実現できます。

2.5 Elastalert の概要

ElastAlert は、Elasticsearch 用のオープンソース アラート プラグインです。ユーザー定義のルールに従って、Elasticsearch のデータ監視と警告に基づいて、アラーム通知を送信したり、特定の操作 (API リクエストの実行など) を実行したりできます。ElastAlert は、導入、管理、拡張が驚くほど簡単です。ルールファイルを記述することでアラーム条件、時間範囲、トリガー頻度、アラーム通知方法などを設定でき、検知した異常を担当者やシステムに自動的に通知できます。

3. コアアルゴリズム原理、具体的な操作手順、数式の説明

3.1 Elasticsearchクラスターの構築

Elasticsearch は、クラウド環境内のすべてのノードで実行されるオープンソースの分散検索エンジンです。Elasticsearch クラスターの実行を改善するには、マスター/スレーブ ノード、シャード、レプリカをセットアップすることをお勧めします。この記事では、docker を使用してスタンドアロン Elasticsearch クラスターをデプロイします。

Dockerをインストールする

Linux に Docker をインストールする前に、最新バージョンの Docker Compose がインストールされていることを確認してください。インストールされていない場合は、次のコマンドを実行して、最初に最新バージョンの Docker Compose をインストールしてください。

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

イメージ アクセラレータの構成 (オプション)

mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
systemctl restart docker

ボリュームフォルダーを作成する

実際の状況に応じて、Elasticsearch データを保存するボリューム フォルダーを作成します。たとえば、現在のディレクトリにesdataという名前のフォルダーを作成します。

mkdir esdata
chmod 777 esdata

画像をダウンロード

最新バージョンの Elasticsearch イメージを Docker Hub からプルします。

docker pull elasticsearch:latest

クラスター構成ファイルをセットアップする

構成ファイル elasticsearch.yml を作成し、次の内容を追加します。

cluster.name: my-cluster 
node.name: node-1 
path.data: /usr/share/elasticsearch/data 
path.logs: /usr/share/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200 
transport.tcp.port: 9300 
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
xpack.security.enabled: false
xpack.monitoring.collection.enabled: true

コンテナの起動

次のコマンドを使用して、3 つのノードからなる Elasticsearch クラスターを開始します。

docker run \
--detach \
--publish 9200:9200 \
--publish 9300:9300 \
--volume $PWD/config:/usr/share/elasticsearch/config \
--volume $PWD/esdata:/usr/share/elasticsearch/data \
--env ES_JAVA_OPTS="-Xms512m -Xmx512m" \
--name elastic1 \
elasticsearch:latest

ここでは、3 つのノード elastic1、elastic2、elastic3 に異なる名前を付けています。その中で、-v $PWD/config:/usr/share/elasticsearch/config-v $PWD/esdata:/usr/share/elasticsearch/data-e ES_JAVA_OPTS="-Xms512m -Xmx512m"すべて Elasticsearch の追加パラメータを指定します。
次のコマンドを実行して、コンテナーのステータスを表示します。

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                            NAMES
0d3cf048e0b9        elasticsearch:latest   "/tini -- /usr/local…"   3 seconds ago       Up 2 seconds        0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elastic1

クラスターの健全性を確認するには、http://localhost:9200/_cat/health?v「クラスター ステータスの表示」にアクセスします。

コピーを追加

デフォルトでは、マスター ノードとレプリカが 1 つだけ存在し、データはマスター ノードにのみ保存されます。クラスターの耐障害性を強化するには、少なくとも 2 つのノードをレプリカとして設定し、1 つのノードがダウンした場合でも、もう 1 つのレプリカ ノードがデータのインデックス作成と検索の作業を引き継ぐことができるようにすることをお勧めします。
各ノードにレプリカを追加します。

docker exec elastic1 bin/elasticsearch-plugin install https://artifacts.elastic.co/downloads/elasticsearch-plugins/repository-hdfs/elasticsearch-repository-hdfs-5.6.10.zip
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.10.tar.gz && tar xf elasticsearch-5.6.10.tar.gz && cd elasticsearch-5.6.10/
sed -i's/"discovery\.zen\.ping\.multicast\.enabled" : false/"discovery.type" : "single-node"/g' config/elasticsearch.yml
echo "node.master=false" >> config/elasticsearch.yml
echo "node.data=true" >> config/elasticsearch.yml
nohup./bin/elasticsearch &
exit

docker exec... elasticsearch-plugin install...Elasticsearch HDFS プラグインをインストールするために使用されます。
各ノードを変更しconfig/elasticsearch.yml、以下を追加します。

cluster.routing.allocation.disk.threshold_enabled = false 
node.name: node-2
path.data: data
path.logs: logs
bootstrap.memory_lock: true
network.host: _eth0_,_localunixsocket_
http.port: 9201
transport.tcp.port: 9301
discovery.seed_hosts: [ "elastic1", "localhost","[::1]" ]
discovery.type: single-node
gateway.recover_after_nodes: 1
index.number_of_shards: 3
index.number_of_replicas: 1

別のレプリカノードの起動を実行しますnohup./bin/elasticsearch &
同様に、3 番目のノードを順番に追加します。
クラスタのステータスを問い合わせて実行しますhttp://localhost:9200/_cat/health?v

シャードとレプリカの数

上記の構成では、シャーディングとレプリカを有効にすることなく、1 つのノードをマスター ノードとして有効にするだけです。一般に、クラスターのパフォーマンスを効果的に向上させるには、シャードとレプリカの数を適切な範囲内に設定する必要があります。たとえば、各インデックスのシャード数が 5 に設定され、レプリカの数が 2 に設定されている場合、合計 10 個のシャードが存在します。インデックスが多いほど、シャードの数も増えます。レプリカの数が多いほど、クラスターの高可用性が向上します。
動的シャーディングを有効にする必要がある場合は、 elasticsearch の開始時にパラメーターを追加できますdiscovery.type=zenith

nohup./bin/elasticsearch -Des.discovery.type=zenith > logs/es.log 2>&1 &

-Des.discovery.type=zenithZenith ダイナミック シャーディング機能を有効にすることを示します。

3.2 Kibana のインストールと構成

Kibana は、データを視覚的に表示、理解、分析するのに役立つ Elastic Stack のデータ視覚化ツールです。

Kibana イメージをダウンロードして実行する

次に、docker を使用して Kibana を実行します。まず、Kibana イメージをプルします。

docker pull kibana:latest

次に、Kibana コンテナーを実行します。

docker run \
--link elastic1:es \
--detach \
--publish 5601:5601 \
--env ELASTICSEARCH_URL="http://es:9200" \
--name kibana \
kibana:latest

--link elastic1:esKibana を Elasticsearch コンテナ elastic1 に接続します。--env ELASTICSEARCH_URL="http://es:9200"Kibanaのデフォルトの接続アドレスを設定します。docker psコマンドを実行してkibanaの稼働状況を確認します。

キバナの構成

Kibana を初めて起動すると、ログイン資格情報を構成するように求められます。ログイン後、左側のナビゲーション バーで「管理」→「インデックス パターン」をクリックします。

「インデックスパターンの作成」を選択します。インデックス名を入力し、demo[次のステップ] ボタンをクリックします。

@timestamp などの時間フィールド名を選択し、「作成」ボタンをクリックします。
ホームページに戻り、ページを更新すると、作成したインデックスが表示されます。[検出] をクリックすると、現在インデックスが作成されているドキュメントのリストが表示されます。

3.3 Logstash のインストールと構成

Logstash は、リアルタイムでデータをフィルタリング、収集、解析、送信、保存できるオープンソースのデータ収集エンジンです。このセクションでは、Logstash をインストールして構成する方法を説明します。

Logstash をインストールする

wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.1.deb && sudo dpkg -i logstash-6.4.1.deb

Logstash の構成

次に、Kafka メッセージ キューからデータを読み取り、Elasticsearch にインポートする Logstash を構成します。

Logstash 入力の構成

/etc/logstash/conf.d/ディレクトリ内に という名前のファイルを作成しkafka.conf次の内容を追加します。

input {
kafka {
  codec => json
  consumer_threads => 2
  topics => ["test"]
  bootstrap_servers => "localhost:9092"
  max_message_bytes => 1000000
}
}

codec はデコーダのタイプを指定します。これはここで設定されますjson
Consumer_threads はコンシューマ スレッドの数を指定します。
topic は、サブスクライブするトピック名を指定します。
bootstrap_servers は、 Kafka のサーバー アドレスを指定します。
max_message_bytes は、 Kafka のメッセージの最大バイト サイズを指定します。

Logstash 出力の構成

同じディレクトリに同じ名前のファイルを作成しes.conf、次の内容を追加します。

output{
elasticsearch {
 hosts => ["localhost:9200"]
 index => "demo-%{+YYYY.MM.dd}"
}
}

Index にはインデックス名を指定します。%{+YYYY.MM.dd}インデックス名が年、月、日の時刻形式に従って生成されることを示します。

Logstash 構成のテスト
sudo systemctl start logstash.service
tail -f /var/log/logstash/logstash-plain.log | grep Received

Kafka コンソール プロデューサーを開き、テスト メッセージを生成します。

kafka-console-producer.sh --broker-list localhost:9092 --topic test
{
    
    "message":"hello world"}
^C

Elasticsearch のインデックスに対応するデータがあるかどうかを確認します。

curl -XGET http://localhost:9200/demo*/_search?pretty

データがあれば、設定は成功です。

3.4 Elastalert のインストールと構成

Elastalert は、Elasticsearch データ ストリームを受信し、指定されたルールに従ってアラーム イベントを生成し、早期警告通知をトリガーするオープン ソース アラーム モジュールです。このセクションでは、Elastalert をインストールして構成する方法を説明します。

Elastalertをインストールする

pip install elastalert

Elastalert の構成

次に、Elastalert を構成します。Elastalert は、Elasticsearch のデータ変更を監視し、電子メールまたは SMS リマインダーをトリガーします。

Elastalert ルールの構成

~/.elastalert/config.yamlファイルに次の内容を追加します。

rules_folder: /home/yourname/.elastalert/rules
run_every:
minutes: 1
buffer_time:
minutes: 10
writeback_es_index: elastalert_status
alert_time_limit:
days: 2
disabled: false
etag_generation: always
filters: []
rule_file: /home/yourname/.elastalert/rules/*.yaml
es_client_insecure: false
es_client_sniffer: true
es_host: localhost
es_password: ""
es_port: 9200
es_username: ""
writeback_index: elastalert_status
smtp_auth_file: null
from_addr: <EMAIL>
smtp_host: mail.example.com
smtp_port: 465
smtp_ssl: true
to_addr: <EMAIL>

構成オプションには次の意味があります。

  • run_every: Elastalert はデータを時々チェックし、デフォルトでは毎分実行されます。
  • buffer_time: データのクエリ範囲を設定します。デフォルトは 1 時間です。
  • writeback_es_index: Elastalert 実行ステータスのインデックス名を設定します。デフォルトは ですelastalert_status
  • rule_file: Elastalertが使用するルールファイルのパスを設定します。
  • disabled: Elastalert の実行を無効にするかどうか。デフォルトは no です。
  • filters: データを変更せずに前処理します。
  • es_client_*: Elasticsearch クライアント設定項目。変更は必要ありません。
  • smtp_*: SMTP サーバー構成アイテム。早期警告通知を送信するために使用されます。
Elastalert ルール ファイルを構成する

/home/yourname/.elastalert/rulesディレクトリの下にファイルを作成し.yaml次の内容を追加します。

---
type: frequency
timeframe:
minutes: 1
query_key: user
num_events: 1
blacklist: ['root']
filter:
- term:
status: success
email:
- "<EMAIL>"
message: "Free disk space less than 10%"
realert:
minutes: 0

構成オプションには次の意味があります。

  • type: 使用されるルールのタイプ。ここでは、frequency指定された期間内のイベントの数をカウントすることを意味します。
  • timeframe: 頻度を確認してください。ここでは 1 分です。
  • query_key: クエリする必要があるフィールドはここにありますuser
  • num_events: イベントが連続してトリガーされる回数。
  • blacklist: 計算に含まれないユーザーのリスト。ここにのみ含まれますroot
  • filter: 成功したリクエストのみがカウントされるようにデータをフィルターします。
  • email: アラーム電子メールのリスト。ここに含まれます<EMAIL>
  • message:アラームメッセージのテンプレートです。
  • realert: この時間間隔内に再度トリガーされるイベントに対してアラームは発行されません。ここを 0 に設定すると、イベントがトリガーされるたびにアラームが発行されることを示します。
Elastalertをテストする

Elastalert サービスを再起動し、ルールをテストします。

elastalert-test-rule /home/yourname/.elastalert/rules/test.yaml
WARNING:elasticsearch:GET http://localhost:9200/elastalert_status/elastalert [status:N/A request:0.015s]
INFO:urllib3.connectionpool:Starting new HTTP connection (1): localhost:9200
WARNING:elasticsearch:<urllib3.connectionpool.HTTPConnection object at 0x7fc42b171be0>: Failed to establish a new connection: [Errno 111] Connection refused
INFO:urllib3.connectionpool:http://localhost:9200 "GET /elastalert_status/elastalert HTTP/1.1" 404 None
INFO:root:Queried rule test from 2018-12-10 14:04 UTC to 2018-12-10 14:04 UTC: 0 / 0 hits
INFO:root:Ran test from 2018-12-10 14:04 UTC to 2018-12-10 14:04 UTC: 0 query hits (0 already seen), 0 matches, 0 alerts sent
WARNING: No queries matched

これは、ルール テストに合格し、警告メールは受信されないことを意味します。

3.5 弾性スタックの拡張と縮小

上記ではElasticsearchの単一マシンクラスタを構築する方法を説明しましたが、ビジネスが発展しデータ量が増加すると、クラスタの容量や負荷容量を増やすためにクラスタを複数マシンに拡張する必要があります。拡張と縮小には、シャーディング、レプリカの選択、ルーティングのスケジューリング、ノードを切り替えるかどうかなど、多くの詳細な問題が含まれます。このセクションでは、Elastic Stack の拡張と縮小のプロセスを詳しく紹介します。

クラスター計画

クラスターのサイズが大きすぎる場合、1 台のマシンですべてを構成することができない場合があるため、異なるマシンに分散することを検討する必要があります。
たとえば、クラスター サイズが 1,000 マシンで、各マシンのメモリが 16G の場合、各マシンに 2 つのノードを構成し、各ノードに 4GB のメモリを構成し、合計 800 ノードにすることを検討できます。さらに、ディスク容量を増やしたり、SSD ハードドライブにデータを保存したり、ストレージ容量不足によるパフォーマンスの低下を避けるために事前に十分なディスク容量を確保したりすることも検討できます。
これにより、単一障害点を回避し、高可用性を確保し、クラスターのパフォーマンスを向上させることができます。

シャーディングとレプリカの設定

シャードとレプリカの数の設定は、クラスターの負荷分散、クエリ効率、可用性に影響します。一般に、シャードの数が多いほど、クエリの効率は高くなります。同時に、クラスターはノードのダウンタイムによる損失に耐える可能性が高くなります。レプリカの数が多いほど、クラスターの可用性は高くなります。ただし、また、クラスターのメンテナンスの負担も増大します。

分散ルーティング

Elasticsearch クラスターでは、コンシステント ハッシュ アルゴリズムに基づいてデータの分散ルーティングが実装され、各シャードには一意のプライマリ シャードと複数のレプリカ シャードが割り当てられます。シャードが追加または削除されると、Elasticsearch はデータを新しいプライマリ シャードとレプリカ シャードに自動的に再配布します。

ノード切り替え

クラスタ内でノード障害やネットワーク障害などが発生した場合、レプリカシャードの増減やレプリカシャードの位置の移動などにより、スムーズにノードを切り替えることができます。

その他の注意事項

Elasticsearch クラスターを拡張および縮小する際には、パフォーマンスのチューニング、バックアップとリカバリ、データの移行など、注意すべき点が数多くあります。この記事では、1 つずつ詳しく説明しません。

4. 参考文献

[1] https://www.elastic.co/cn/what-is/elasticsearch
[2] https://blog.csdn.net/liumingzw/article/details/78769459
[3] https://www.elastic .co/guide/cn/elasticsearch/guide/current/deploying-elasticsearch.html
[4] https://www.elastic.co/guide/cn/elasticsearch/guide/current/_setting_up_a_distributed_elasticsearch_cluster.html
[5] https:/ /www.cnblogs.com/onepiece-andy/p/8957476.html

おすすめ

転載: blog.csdn.net/universsky2015/article/details/132002503