Docker を使用した ELK7.3.0 ログ収集サービスの導入に関するベスト プラクティス

Docker を使用した ELK7.3.0 ログ収集サービスの導入に関するベスト プラクティス

最初に書く

この記事では、ELK 7.3.0 の展開についてのみ説明します。

展開環境:

システムセントOS7
ドッカーDocker バージョン 19.03.5
CPU 2コア
メモリ2.5G
ディスク30G (推奨設定、ディスクが不足するとエラーが報告される可能性があります)
ファイルビートv7.3.0、シングルノード
エラスティックサーチv7.3.0、2部
キバナv7.3.0、シングルノード
ログスタッシュv7.3.1、シングルノード

ELK 分散クラスタ展開ソリューション

ELK 分散クラスタ展開ソリューション

Linux の elasticsearch ユーザーのメモリ権限が小さすぎます。少なくとも 262144 が必要です。エラー メッセージが表示されます (最大仮想メモリ領域 vm.max_map_count [65530] が低すぎます。少なくとも [262144] に増やしてください)。したがって、まずシステム構成を変更します。

# sysctl.conf 設定を変更する
vi /etc/sysctl.conf
# 次の設定を追加します。
vm.max_map_count=262144
# リロード:
sysctl -p
# 最後に、elasticsearch を再起動して正常に起動します。

環境は Docker を使用してデプロイされます。Docker コマンドをより便利に使用するために、bash-completion 自動補完プラグインをインストールします。

# 依存ツールbash-completeをインストールします
yum インストール -y bash 補完
ソースは /usr/share/bash-completion/completions/docker です。
ソース /usr/share/bash-completion/bash_completion

デプロイ順序: ES --> Kibana --> Logstash --> Filebeat

ElasticSearch 7.3.0 のデプロイメント

マスターノードの展開

設定ファイルとデータ保存ディレクトリを作成する

mkdir -p }mnt/es1/master/data、/mnt/es1/master/logs}
vim /mnt/es1/master/conf/es-master.yml

es-master.yml 設定

# クラスター名 cluster.name: es-cluster
#ノード名node.name: es-master
# マスターノードになれるかどうかnode.master: true
# ノードがデータを保存できるようにするかどうか。デフォルトで有効です。node.data: false
# ネットワークバインディング network.host: 0.0.0.0
# 外部サービスのhttpポートを設定します http.port: 9200
# ノード間の通信用のTCPポートを設定します transport.port: 9300
# クラスター検出 discovery.seed_hosts:
 - 172.17.0.2:9300
 - 172.17.0.3:9301
# マスターノードになることができるすべてのノードの名前または IP アドレスを手動で指定します。これらの構成は最初の選出 cluster.initial_master_nodes で計算されます。
 - 172.17.0.2
# クロスドメインアクセスをサポートする http.cors.enabled: true
http.cors.allow-origin: "*"
# セキュリティ認証 xpack.security.enabled: false
#http.cors.allow-headers: 「認証」
bootstrap.memory_lock: 偽
bootstrap.system_call_filter: 偽

#クロスドメインの問題を解決する#http.cors.enabled: true
#http.cors.allow-origin: "*"
#http.cors.allow-methods: OPTIONS、HEAD、GET、POST、PUT、DELETE
#http.cors.allow-headers: "X-Requested-With、コンテンツ タイプ、コンテンツの長さ、X-User"

イメージをプルするときに少し遅くなりますので、しばらくお待ちください。

# イメージをプルします。コンテナを直接ビルドしてこの手順を無視することもできます。 docker pull elasticsearch:7.3.0

# コンテナをビルドする## 5601 を Kibanadocker 用に予約されたポートにマップする run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-p 9200:9200 -p 9300:9300 -p 5601:5601 \
-v /mnt/es1/master/conf/es-master.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mnt/es1/master/data:/usr/share/elasticsearch/data \
-v /mnt/es1/master/logs:/usr/share/elasticsearch/logs \
-v /etc/localtime:/etc/localtime \
--name es-master elasticsearch:7.3.0

/etc/localtime:/etc/localtime: ホストとコンテナの時刻が同期されます。

ノードからデプロイする

設定ファイルとデータ保存ディレクトリを作成する

mkdir -p }mnt/es1/slave1/data、/mnt/es1/slave1/logs}
vim /mnt/es1/slave1/conf/es-slave1.yml

es-slave1.yml 設定

# クラスター名 cluster.name: es-cluster
#ノード名node.name: es-slave1
# マスターノードになれるかどうかnode.master: true
# ノードがデータを保存できるようにするかどうか。デフォルトで有効です。node.data: true
# ネットワークバインディング network.host: 0.0.0.0
# 外部サービスのhttpポートを設定します http.port: 9201
# ノード間の通信用のTCPポートを設定します transport.port: 9301
# クラスター検出 discovery.seed_hosts:
 - 172.17.0.2:9300
 - 172.17.0.3:9301
# マスターノードになることができるすべてのノードの名前または IP アドレスを手動で指定します。これらの構成は最初の選出 cluster.initial_master_nodes で計算されます。
 - 172.17.0.2
# クロスドメインアクセスをサポートする http.cors.enabled: true
http.cors.allow-origin: "*"
# セキュリティ認証 xpack.security.enabled: false
#http.cors.allow-headers: 「認証」
bootstrap.memory_lock: 偽
bootstrap.system_call_filter: 偽

イメージをプルするときに少し遅くなりますので、しばらくお待ちください。

# イメージをプルします。コンテナを直接ビルドしてこの手順を無視することもできます。 docker pull elasticsearch:7.3.0

# コンテナをビルド docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" \
-p 9201:9200 -p 9301:9300 \
-v /mnt/es1/slave1/conf/es-slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mnt/es1/slave1/data:/usr/share/elasticsearch/data \
-v /mnt/es1/slave1/logs:/usr/share/elasticsearch/logs \
-v /etc/localtime:/etc/localtime \
--name es-slave1 elasticsearch:7.3.0

設定を変更してコンテナを再起動します

# マスターコンテナとスレーブコンテナのIPを表示する
docker の es-master を検査する
docker で es-slave1 を検査する

ES 構成ファイル es-master.yml および es-slave1.yml 内のdiscovery.seed_hostsおよびcluster.initial_master_nodesを対応する IP に変更します。コンテナを再起動します。

docker es-master を再起動します

docker es-slave1 を再起動します。

# es ログを表示する docker logs -f --tail 100f es-master

ES クラスターの情報を確認するには、http://IP:9200/_cat/nodes にアクセスしてください。マスター ノードとスレーブ ノードが正常にデプロイされていることがわかります。

ノードのデプロイメントによく使用される API:

API関数
http://IP:9200 ES バージョン情報を表示
http://IP:9200/_cat/nodes

すべての破片を表示

http://IP:9200/_cat/indicesすべてのインデックスを表示

Kibana 7.3.0 のデプロイメント

Kibana 設定ファイルを作成する

vim /mnt/kibana.yml
#
## ** これは自動生成されたファイルです **
##
#
## docker ターゲットのデフォルトの Kibana 構成
サーバー名: kibana
# Kibana のリモート アクセス サーバーを設定します。ホスト: "0.0.0.0"
#es アクセス アドレス elasticsearch.hosts を設定します: [ "http://127.0.0.1:9200" ]
#中国語インターフェース i18n.locale: "zh-CN"

#xpack.monitoring.ui.container.elasticsearch.enabled: true

es-masterコンテナIDを表示する

docker ps | grep es-master 

Kibanaをデプロイする

コマンド内の 40eff5876ffd を es-master コンテナ ID に変更し、イメージをプルして、しばらく待つ必要があることに注意してください

# イメージをプルします。コンテナを直接ビルドしてこの手順を無視することもできます。 docker pull docker.elastic.co/kibana/kibana:7.3.0

# コンテナをビルドする## --network=container はコンテナネットワークを共有することを意味します docker run -it -d \
kibana.yml を /usr/share/kibana/config/kibana.yml にコピーします。
-v /etc/localtime:/etc/localtime \
-e ELASTICSEARCH_URL=http://172.17.0.2:9200 \
--network=コンテナ:40eff5876ffd \
--name キバナ docker.elastic.co/kibana/kibana:7.3.0

Kibana コンテナのログを確認します。次の図に示すログが表示された場合、起動は成功しています。

docker ログ -f --tail 100f kibana 

http://IP:5601 にアクセスすると、503 が表示される場合があります。しばらく待つとアクセスできるようになります。 Kibana コンソールにアクセスできる場合は、Kibana が正常にインストールされ、es-master との接続が確立されていることを意味します。

Logstash 7.3.1 のデプロイメント

Logstash 構成ファイルの記述

vim /mnt/logstash-filebeat.conf

入力{
  # ソースビート
  ビート {
    # ポート port => "5044"
  }
}
# 分析およびフィルタリングプラグイン、複数のフィルタが可能 {
  理解する {
	# grok 式が保存される場所 patterns_dir => "/grok"
	
	# grok 式の書き換え # match => {"message" => "%{SYSLOGBASE} %{DATA:message}"}
	
	# ネイティブメッセージフィールドを削除します overwrite => ["message"]

  # 独自のフォーマットマッチを定義する => {
		"メッセージ" => "%{URIPATH:request} %{IP:clientip} %{NUMBER:response:int} \"%{WORD:sources}\" (?:%{URI:referrer}|-) \[%{GREEDYDATA:agent}\] ​​\{%{GREEDYDATA:params}\}"
	}
  }
 # クエリ分類プラグイン geoip {
    ソース => "メッセージ"
  }
}
出力{
	# elasticsearchを選択
	エラスティックサーチ
		# es クラスターホスト => ["http://172.17.0.2:9200"]
      #ユーザー名 => "root"
      #パスワード => "123456"

		# インデックス形式 index => "omc-block-server-%{[@metadata][version]}-%{+YYYY.MM.dd}"

		# trueに設定すると、logstashというカスタムテンプレートがある場合、カスタムテンプレートがデフォルトのテンプレートlogstashを上書きすることを示します。
		テンプレート上書き => true
	}
}

Logstashをデプロイする

# イメージをプルします。コンテナを直接ビルドしてこの手順を無視することもできます。docker pull logstash:7.3.1 

# コンテナをビルドします# xpack.monitoring.enabled は X-Pack のセキュリティと監視サービスをオンにします# xpack.monitoring.elasticsearch.hosts は ES アドレスを設定します。172.17.0.2 は es-master コンテナの IP です
# Docker では、コンテナの起動時にいくつかのコマンドを実行できます。logsatsh -f は、設定ファイルを指定して logstash を実行することを意味します。/usr/share/logstash/config/logstash-sample.conf は、コンテナ内のディレクトリ ファイルです。docker run -p 5044:5044 -d \
-v /mnt/logstash-filebeat.conf:/usr/share/logstash/config/logstash-sample.conf \
-v /etc/localtime:/etc/localtime \
-e elasticsearch.hosts=http://172.17.0.2:9200 \
-e xpack.monitoring.enabled=true \
-e xpack.monitoring.elasticsearch.hosts=http://172.17.0.2:9200 \
--name ログスタッシュ ログスタッシュ:7.3.1 -f /usr/share/ログスタッシュ/config/ログスタッシュ-sample.conf

ここでは、es クラスターのアドレスに注意する必要があります。ここでは、es-master IP (172.17.0.2) のみを設定します。詳細な Logstash 設定。 次のログが表示されれば、インストールは成功です。

Filebeat 7.3.0 の展開

Filebeat は必須コンポーネントではありません。Logstash を使用してログを転送することもできます。

たとえば、「20」で始まらないすべてのログをマージするには、次の Logstash 構成を使用できます。

入力{
  # ソースビート
  ビート {
    # ポート port => "5044"
  }
  ファイル {
    タイプ => "サーバーログ"
    パス => "/logs/*.log"
    start_position => "始まり"
    コーデック=>マルチライン{
        // 正規表現、プレフィックスが「20」のすべてのログ。ログに「[2020-06-15」のようなプレフィックスがある場合は、「^[」に置き換えることができます。
        パターン => "^20"
        // 通常のルールを否定するかどうか negate => true
        // previous は前の行にマージすることを意味し、next は次の行にマージすることを意味します what => "previous"
    }

  }
}

Filebeat はアプリケーションと同じサーバーにデプロイする必要があることに注意してください。ここでは、アプリケーションは docker を使用してデプロイされ、/mnt/omc-dev/logs はアプリケーション ログ ファイルのマッピング ディレクトリです。サービスも docker 経由でデプロイする場合は、[-v /mnt/omc-dev/logs:/app/logs] を使用してログ ファイルをマッピングすることを忘れないでください。

Filebeat設定ファイルを作成する

## /mnt/omc-dev/logs はアプリケーション ログ ディレクトリです。アプリケーション デプロイメント ディレクトリをマッピングする必要があります。mkdir -p {/mnt/omc-dev/logs,/mnt/filebeat/logs,/mnt/filebeat/data}
vim /mnt/filebeat/filebeat.yml
ファイルビート入力:
- タイプ: ログ
 有効: true
 パス:
  # 現在のディレクトリ内のすべての .log ファイル - /home/project/spring-boot-elasticsearch/logs/*.log
 複数行パターン: '^20'
 複数行否定: true
 複数行一致: 前

ログレベル: デバッグ

filebeat.config.モジュール:
 パス: ${path.config}/modules.d/*.yml
 リロードが有効: false

セットアップテンプレート設定:
 インデックスの破片の数: 1

セットアップダッシュボードが有効: false

セットアップ.kibana:
 ホスト: "http://172.17.0.2:5601"

# ESに直接転送されない
#出力.elasticsearch:
# ホスト: ["http://es-master:9200"]
# インデックス: "filebeat-%{[beat.version]}-%{+yyyy.MM.dd}"

出力.logstash:
 ホスト: ["172.17.0.5:5044"]

#スキャン頻度: 1秒
クローズ_非アクティブ: 12時間
バックオフ: 1秒
最大バックオフ: 1秒
バックオフ係数: 1
フラッシュタイムアウト: 1秒

プロセッサ:
 - ホストメタデータを追加: ~
 - クラウドメタデータを追加: ~

Logstash IP とポートを変更する必要があることに注意してください。

# イメージをプルします。コンテナを直接ビルドしてこのステップを無視することもできます。docker pull docker.elastic.co/beats/filebeat:7.3.0

# コンテナをビルド## --link logstash 指定されたコンテナを現在の接続に接続します。ip メソッドによる動的な変更によりコンテナを接続できない状況を回避するためにエイリアスを設定できます。logstash はコンテナ名です。docker run -d -v /mnt/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml \
-v /mnt/omc-dev/logs:/home/project/spring-boot-elasticsearch/logs \
-v /mnt/filebeat/logs:/usr/share/filebeat/logs \
ファイルビートデータ:/usr/share/ファイルビートデータ\
-v /etc/localtime:/etc/localtime \
--link logstash --name filebeat docker.elastic.co/beats/filebeat:7.3.0

ログを確認します。設定ファイルでFilebeatのログレベルをデバッグに設定しているので、収集された情報がすべて表示されます。

docker ログ -f --tail 100f ファイルビート

ES インデックスをクエリすると、さらに 3 つのインデックスが見つかることがわかります。設定した日次インデックス セグメンテーションにより、私の環境は 3 日間実行されているため、3 つの omc サービス インデックスがあります (omc はスケジュールされたタスク サービスです。テスト用に簡単なスケジュールされたタスクを記述することもできます)。

次に、Kibana インデックス パターンを作成し、ログ クエリを実行します。

インデックスが作成されると、 Discoverビューでインデックス パターン別にログをクエリできるようになります。

記事はここまでです。他に導入が必要なサービスがある場合は、ログを指定のディレクトリにマウントするだけで済みます。もちろん、他のサーバーにサービスを展開する場合は、サーバーにFilebeatを展開し、サーバー間のネットワーク接続を確保する必要があります~~

最後に、オープンソースの ELK 自動 Docker デプロイメント プロジェクトを紹介します: https://github.com/deviantony/docker-elk.git

--------------------------------------------------------

2020年6月28日更新

最近、Logstash による物理メモリの急増問題が発生しました。

主な問題について簡単に説明しましょう。

現在、単一サービスの1日のログ容量は2.2GB程度です。初期はLogstashのメモリに制限がなかったため、大量のデータが入ってくるとLogstashがメモリとIOをめちゃくちゃ占有してしまいます。

最近、同じサーバー上のアプリケーション サービスのトラフィックが増加し、最終的にメモリ不足と OutOfMemoryError の問題が発生しました。

その後、JVM メモリを最適化し (詳細は説明しません。インターネット上には多くの情報があります)、Logstash 応答メモリ構成を追加することで、以前のレガシー問題は解決されました。

最後に、監視のために Logstash を Kibana に追加します (もちろん、Logstash ログを ES に設定することもできます)。

https://blog.csdn.net/QiaoRui_/article/details/97667293

以下もご興味があるかもしれません:
  • Docker を使用してスタンドアロン Pulsar とクラスター化された Redis をデプロイする方法 (開発アーティファクト)
  • アイデアをDockerに接続してワンクリックでデプロイする方法
  • Docker を使用した war パッケージ プロジェクトのデプロイの実装
  • Dockerを使用してMySQL 8.0をデプロイする方法の例
  • Docker で onlyoffice をインストールして展開する詳細なプロセス

<<:  Vueはel-tableを使用して列と行を動的に結合します

>>:  MySQL での一時テーブルの使用例

推薦する

MySQL で数千万のテストデータを含むテストデータベースを作成する方法

場合によっては、MySQL が公式に提供しているテスト ライブラリに基づいてテスト データを作成し、...

CentOS 7のインストールと設定方法のグラフィックチュートリアル

この記事は、CentOS 7の詳細なインストールチュートリアルを参考のために記録します。具体的な内容...

ネガティブマージン関数の紹介と使用方法の概要

1998 年の CSS2 勧告の時点で、テーブルは徐々に舞台から消え、歴史の中に記録されるようになり...

XHTMLタグには終了タグがある

<br />オリジナルリンク: http://www.dudo.org/article....

MySQLアラームの詳細な分析と処理

最近、あるサービスにアラームが発生し、耐えられなくなっています。アラーム情報は次のとおりです。メトリ...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

JavaScriptは入力ボックスコンポーネントを実装します

この記事では、入力ボックスコンポーネントを手動で実装するための具体的なコードを参考までに紹介します。...

vue.js 動的コンポーネントの詳細な説明

:動的コンポーネントv-bind:is="component name" を使用...

写真のプレビューとアップロード機能を実現するhtml+css+js

はじめに: Web ページを作成するときに、画像をアップロードする必要がある場合がよくあります。画像...

マウスのドラッグ効果を実現するJavaScript

この記事では、マウスドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...

CSS3 でテキスト ストロークを実装する 2 つの方法 (要約)

質問最近、以下に示すように、テキストストローク効果を実現するという要件に遭遇しました。 解決策1まず...

この記事ではSQL CASE WHENの使い方を詳しく説明します

目次シンプルな CASEWHEN 関数:これは、CASEWHEN 条件式関数を使用するのと同じです。...

JavaScriptがDOMツリーの構築にどのように影響するかについて詳しく説明します。

目次ドキュメント オブジェクト モデル (DOM) DOM と JavaScript DOMツリーの...

Vue+Springbootでインターフェースシグネチャを実装するためのサンプルコード

1. 実装のアイデアインターフェース署名の目的は、リクエストパラメータが改ざんされていないか、リクエ...