ELKあなたの頭痛の問題は、ほとんど解決します

テストの数週間は、〜を共有するために、すべての乾燥品をまとめるために、数多くのピットを踏むました

、ELK実践的な知識の概要

図1に示すように、符号化変換の問題

問題、主に中国人が文字化け。

=>プレーンなトランスコーディング入力コーデック:

コーデック=>普通{

文字セット=> "GB2312"

}

GB2312のテキストエンコーディングは、のUTF-8エンコーディングに変換しました。

エンコーディング変換も(推奨)にfilebeatで達成することができます。

filebeat.prospectors:

- INPUT_TYPE:ログ

パス:

- C:UsersAdministratorDesktopperformanceTrace.txt

エンコード:GB2312

2、余分な行冗長ログを削除

削除されたドロップでlogstashフィルタ:

場合([メッセージ] =〜 "^ 20 * - タスク要求、*、*開始時間.."){冗長行と#nは削除する必要があります

ドロップ {}

}

例をログに記録します。

2018年3月20日10:44:01523 [33] DEBUGデバッグ - タスク要求、タスクID:1cbb72f1-a5ea-4e73-957c-6d20e9e12a7aは、開始時刻:削除する2018年3月20日午前10時43分59秒#行

- リクエスト文字列:

{ "ユーザー名": "15046699923"、 "Pwdの": "ZYjyh727"、 "DeviceTypeを":2、 "デバイスID": "PC-20170525SADY"、 "EquipmentNo":、 "SSID": "PC"、 "RegisterPhones": 、 "のAppKey": "ab09d78e3b2c40b789ddfc81674bc24deac"、 "バージョン": "2.0.5.3"} - エンド

- 応答文字列:

{ "のErrorCode":0、 "成功":真、 "ERRORMSG":、 "結果":、 "WaitInterval":30} - エンド

3、GROK多くの異なるログ行を扱います

例をログに記録します。

2018年3月20日10:44:01523 [33] DEBUGデバッグ - タスク要求、タスクID:1cbb72f1-a5ea-4e73-957c-6d20e9e12a7aは、開始時刻:2018年3月20日10時43分59秒

- リクエスト文字列:

{ "ユーザー名": "15046699923"、 "Pwdの": "ZYjyh727"、 "DeviceTypeを":2、 "デバイスID": "PC-20170525SADY"、 "EquipmentNo":、 "SSID": "PC"、 "RegisterPhones": 、 "のAppKey": "ab09d78e3b2c40b789ddfc81674bc24deac"、 "バージョン": "2.0.5.3"} - エンド

- 応答文字列:

{ "のErrorCode":0、 "成功":真、 "ERRORMSG":、 "結果":、 "WaitInterval":30} - エンド

GROKのlogstashフィルタライン3を処理しました:

マッチ=> {

"メッセージ" => " - :%{:たrequesttime TIMESTAMP_ISO8601} ^ 20 *タスク要求、*、開始時刻"

マッチ=> {

"メッセージ" => "^ - リクエスト文字列:{" ユーザー名 ":" %は{NUMBER:ユーザー名:INT}」、 "Pwdの": ""、 "DeviceTypeを":%{NUMBER(<Pwdの> *?)。 :DeviceTypeを:INT}、 "デバイスID": "(<デバイスID> *?。)"、 "EquipmentNo":(?<EquipmentNo> *)、 "SSID":(?<SSID> *)、 "RegisterPhones" : "のAppKey": "(<のAppKey> *?。)"、 "バージョン":(<RegisterPhones> *?。) "(?。<バージョン> *)"} - 終了*」。

}

マッチ=> {

"メッセージ" => "^ - 応答ストリング:{" のErrorCode ":%{NUMBER:のErrorCode:INT}、" 成功 "(<成功> [AZ] *?)" ERRORMSG」(<ERRORMSG>? 。*?)、 "結果":(<結果> *)、 "WaitInterval":%{NUMBER:WaitInterval:int型}。。} - 終了*」

}

...など複数行に

図4に示すように、複数行統合処理-multilineプラグ(キー)ログ

例:

①ログイン

2018年3月20日10:44:01523 [33] DEBUGデバッグ - タスク要求、タスクID:1cbb72f1-a5ea-4e73-957c-6d20e9e12a7aは、開始時刻:2018年3月20日10時43分59秒

- リクエスト文字列:

{ "ユーザー名": "15046699923"、 "Pwdの": "ZYjyh727"、 "DeviceTypeを":2、 "デバイスID": "PC-20170525SADY"、 "EquipmentNo":、 "SSID": "PC"、 "RegisterPhones": 、 "のAppKey": "ab09d78e3b2c40b789ddfc81674bc24deac"、 "バージョン": "2.0.5.3"} - エンド

- 応答文字列:

{ "のErrorCode":0、 "成功":真、 "ERRORMSG":、 "結果":、 "WaitInterval":30} - エンド

合併後の複数のラインの②logstashGROK処理。次のように組み合わせた複数の線は、同じ次のとおりです。

フィルタ{

{完全に理解

マッチ=> {

"message" => "^%{TIMESTAMP_ISO8601:InsertTime} .*- task request,.*,start time:%{TIMESTAMP_ISO8601:RequestTime} -- Request String : {"UserName":"%{NUMBER:UserName:int}","Pwd":"(?<Pwd>.*)","DeviceType":%{NUMBER:DeviceType:int},"DeviceId":"(?<DeviceId>.*)","EquipmentNo":(?<EquipmentNo>.*),"SSID":(?<SSID>.*),"RegisterPhones":(?<RegisterPhones>.*),"AppKey":"(?<AppKey>.*)","Version":"(?<Version>.*)"} -- End -- Response String : {"ErrorCode":%{NUMBER:ErrorCode:int},"Success":(?<Success>[a-z]*),"ErrorMsg":(?<ErrorMsg>.*),"Result":(?<Result>.*),"WaitInterval":%{NUMBER:WaitInterval:int}} -- End"

}

}

}

(推奨)に複数行プラグインfilebeatを使用します。

①はじめに、複数行

  • パターン:統合され、そこから定期的にマッチング。

  • 否定:真/偽、パターンマッチング部分をマージする、または値しないマージを開始します。

試合:前/後(自分の理解が必要です)

  • 後:マッチしたパターン部分を合わせ、注:この状況は、ログマッチング処理の最後の行ではありません。

  • 前:マージする一致パターン部の前に(推奨)。

②5.5バージョン(例えば、前)の後

filebeat.prospectors:

- INPUT_TYPE:ログ

パス:

- /ルート/ performanceTrace *

フィールド:

タイプ:zidonghualog

multiline.pattern: '* "WaitInterval":。* - エンド'

multiline.negate:真

multiline.match:前

③5.5バージョン(例えば、後)の前に

filebeat.prospectors:

- INPUT_TYPE:ログ

パス:

- /ルート/ performanceTrace *

INPUT_TYPE:ログ

複数行:

パターン: '^ 20. *'

否定:真

試合:後

(filebeatにはお勧めしません)で複数行プラグインlogstash入力を使用します。

①はじめに、複数行

  • パターン:統合され、そこから定期的にマッチング。

  • 否定:真/偽、パターンマッチング部分をマージする、または値しないマージを開始します。

何:前/次の(自分の理解されるように)

  • 前回:filebeat同等の後、

  • 次:filebeat前と同等。

②使い方

入力{

ファイル{

パス=> [ "/ルート/ログ/ LOG2"]

START_POSITION => "始まり"

コーデック=>マルチ{

パターン=> "^ 20 *"

真=>否定

何=>「前の」

}

}

}

在logstash filter中使用multiline插件(不推荐):

不推荐的原因:

  • filter设置multiline后,pipline worker会自动降为1;

  • 5.5 版本官方把multiline 去除了,要使用的话需下载,下载命令如下:

/usr/share/logstash/bin/logstash-plugin install logstash-filter-multiline

示例:

filter {

multiline {

pattern => "^20.*"

negate => true

what => "previous"

}

}

5、logstash filter中的date使用

日志示例:

2018-03-20 10:44:01 [33]DEBUG Debug - task request,task Id:1cbb72f1-a5ea-4e73-957c-6d20e9e12a7a,start time:2018-03-20 10:43:59

date使用:

date {

match => ["InsertTime","YYYY-MM-dd HH:mm:ss "]

remove_field => "InsertTime"

}

注:match => ["timestamp" ,"dd/MMM/YYYY H:m:s Z"]

匹配这个字段,字段的格式为:日日/月月月/年年年年 时/分/秒 时区,也可以写为:match => ["timestamp","ISO8601"](推荐)

date介绍:

就是将匹配日志中时间的key替换为@timestamp的时间,因为@timestamp的时间是日志送到logstash的时间,并不是日志中真正的时间。

6、对多类日志分类处理(重点)

filebeat構成でタイプ分類を追加します。

filebeat:

探鉱者:

-

パス:

# - /mnt/data/WebApiDebugLog.txt*

- /mnt/data_total/WebApiDebugLog.txt*

フィールド:

タイプ:WebApiDebugLog_total

-

パス:

- /mnt/data_request/WebApiDebugLog.txt*

# - /mnt/data/WebApiDebugLog.txt*

フィールド:

タイプ:WebApiDebugLog_request

-

パス:

- /mnt/data_report/WebApiDebugLog.txt*

# - /mnt/data/WebApiDebugLog.txt*

フィールド:

タイプ:WebApiDebugLog_report

logstashフィルタで使用される場合は、異なるクラスのプロセスのために異なる場合があります。

フィルタ{

ログに基づいて、[フィールド] [タイプ] ==「WebApiDebugLog_request」{#要求する場合

もし([メッセージ] =〜 "^ 20 * - 。タスクレポート、*、開始時間*。。"){#删除レポート行

ドロップ {}

}

{完全に理解

マッチ=> { "..."}

}

}

使用中のlogstash出力の場合:

[フィールド] [タイプ] == "WebApiDebugLog_total" {もし

elasticsearch {

ホスト=> [ "6.6.6.6:9200"]

インデックス=> "logstashl-WebApiDebugLog_total - %{+ YYYY.MM.DD}"

DOCUMENT_TYPE => "WebApiDebugLog_total_logs"

}

ELKの全体的なパフォーマンスの第二に、最適化

1、パフォーマンス分析

サーバーハードウェアのLinux:1cpu4GRAM

それぞれが250Byteをログに記録すると仮定すると。

分析:

①logstash-Linuxの場合:1CPU 4GRAM

  • ログあたり500;

  • ログごと削除660ルビー。

  • 第二データ1000 GROKを削除します。

②filebeat-Linuxの場合:1CPU 4GRAM

  • 秒あたりのデータのうち、2500-3500;

  • 各マシンは一日あたりに処理することができます:24時間* 60分* 60秒* 3000 * 250Byte = 64,800,000,000Bytesを、64Gについて。

、RedisのES格納されたデータから採取logstashのボトルネック第2のデータ処理あたり6000の周りに、logstashを開き、毎秒2 logstash、約10,000データ処理(CPUは基本的にオーバー実行)を開きます。

スクリプトリソースの消費を開始し、ジャワ、ルビーやその他の環境変数を確認するためには、通常の状態に戻りますので、logstashブートプロセスは、かなりのシステムリソースを取ります。

2ログを収集する方法を選択します。logstash /フィルタ

Filebeatは両方とも同じ荷主の機能として、原則またはlogstashを使用する必要がありません。

違いは、次のとおりです。

  • そのようなGROK、ルビー、比較ビートヘビーとしてプラグインの数を積算しlogstash。

  • logstashは、より多くのリソースを占有し始めた後、あなたは、両方の違いを考慮する必要がない場合は、ハードウェアリソースが十分です。

  • ベースのJVM、クロスプラットフォームのサポートをlogstash;およびgolangの書き込みを使用してビート、AIXがサポートされていません。

  • あなたは64ビットがサポートされていない、AIX 64ビット・プラットフォーム・JDK(JRE)1.7 32bit版にインストールする必要があります。

  • filebeatは、複合引き起こさ取得するインデックスの異なるタイプをもたらすであろう、ソースELS好ましく統一入力直接ESへの入力が、本システムの場合に直接ES logstash入力されてもよいです。

要約:

logstash /フィルター結論は異なっているが、私はオプションをお勧めします。各サーバーにログオンfilebeat設定を収集する必要があり、ログを収集するための軽量ので、統一出力がlogstashし、ログの取り扱いを行い、最後にlogstash出力で統一しますELSへ。

3、logstash最適化された構成

あなたのハードウェア構成に応じてパラメータを最適化することができ、最適化することができます。

①pipelineスレッドの数は、公式のアドバイスは、CPUコアの数に等しいです

  • デフォルトの設定---> pipeline.workers:2;

  • CPUコア数(または倍のCPUコアの数):---> pipeline.workers用に最適化することができます。

スレッド数際に実際の出力②

  • デフォルトの設定---> pipeline.output.workers:1;

  • ---> pipeline.output.workers用に最適化することができます:パイプラインは、スレッド数を超えていません。

③たびにイベントの数を送りました

  • デフォルトの設定---> pipeline.batch.size:125;

  • 1000年:---> pipeline.batch.size用に最適化することができます。

④送信遅延

  • デフォルトの設定---> pipeline.batch.delay:5;

  • 10:---> pipeline.batch.size用に最適化することができます。

要約:

パイプラインの労働者の数を設定することにより、-Wパラメータは、直接設定ファイルlogstash.ymlを変更することができます。これは、CPUコアの数が安全である数倍に設定することが必要な場合、スレッドは、I / Oの上にアイドル状態で、スレッド及び出力フィルタの数を増加させます

デフォルトのワーカースレッドパイプライン活動の各出力は、作業者は、出力設定された出力に設けられていてもよい、設定値は、パイプラインの労働者の数よりも大きくありません。

BATCH_SIZEはまた、例えば、出力ES一貫したバッチサイズのために、出力の数を設定することができます。

フィルタセットの複数行の後、piplineワーカーが自動的に1になるだろう、filebeat場合は、荷主としてlogstash使用している場合、ビートで使用する複数行に関する推奨事項は、複数行の入力を設定することが推奨され、フィルタに複数行を設定しないでください。

JVM設定ファイルをLogstash:

Logstash是一个基于Java开发的程序,需要运行在JVM中,可以通过配置jvm.options来针对JVM进行设定。比如内存的最大最小、垃圾清理机制等等。JVM的内存分配不能太大不能太小,太大会拖慢操作系统。太小导致无法启动。默认如下:

  • Xms256m#最小使用内存;

  • Xmx1g#最大使用内存。

4、引入Redis的相关问题

filebeat可以直接输入到logstash(indexer),但logstash没有存储功能,如果需要重启需要先停所有连入的beat,再停logstash,造成运维麻烦;另外如果logstash发生异常则会丢失数据;引入Redis作为数据缓冲池,当logstash异常停止后可以从Redis的客户端看到数据缓存在Redis中;

Redis可以使用list(最长支持4,294,967,295条)或发布订阅存储模式;

Redis做ELK缓冲队列的优化:

  • bind 0.0.0.0 #不要监听本地端口;

  • requirepass ilinux.io #加密码,为了安全运行;

  • 只做队列,没必要持久存储,把所有持久化功能关掉:

    快照(RDB文件)和追加式文件(AOF文件),性能更好;

    save "" 禁用快照;

    appendonly no 关闭RDB。

  • 把内存的淘汰策略关掉,把内存空间最大

    maxmemory 0 #maxmemory为0的时候表示我们对Redis的内存使用没有限制。

5、Elasticsearch节点优化配置

服务器硬件配置,OS参数:

1)/etc/sysctl.conf 配置

vim /etc/sysctl.conf

① vm.swappiness = 1 #ES 推荐将此参数设置为 1,大幅降低 swap 分区的大小,强制最大程度的使用内存,注意,这里不要设置为 0, 这会很可能会造成 OOM

② net.core.somaxconn = 65535 #定义了每个端口最大的监听队列的长度

③ vm.max_map_count= 262144 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。当VMA 的数量超过这个值,OOM

④ fs.file-max = 518144 #设置 Linux 内核分配的文件句柄的最大数量

[root@elasticsearch]# sysctl -p生效一下。

2)limits.conf 配置

vim /etc/security/limits.conf

elasticsearch soft nofile 65535

elasticsearch hard nofile 65535

elasticsearch soft memlock unlimited

elasticsearch hard memlock unlimited

3)为了使以上参数永久生效,还要设置两个地方:

vim /etc/pam.d/common-session-noninteractive

vim /etc/pam.d/common-session

添加如下属性:

session required pam_limits.so

可能需重启后生效。

Elasticsearch中的JVM配置文件

-Xms2g

-Xmx2g

  • 将最小堆大小(Xms)和最大堆大小(Xmx)设置为彼此相等。

  • Elasticsearch可用的堆越多,可用于缓存的内存就越多。但请注意,太多的堆可能会使您长时间垃圾收集暂停。

  • 设置Xmx为不超过物理RAM的50%,以确保有足够的物理内存留给内核文件系统缓存。

  • 不要设置Xmx为JVM用于压缩对象指针的临界值以上;确切的截止值有所不同,但接近32 GB。不要超过32G,如果空间大,多跑几个实例,不要让一个实例太大内存。

Elasticsearch配置文件优化参数:

1)vim elasticsearch.yml

bootstrap.memory_lock: true #锁住内存,不使用swap

#缓存、线程等优化如下

bootstrap.mlockall: true

transport.tcp.compress:真

indices.fielddata.cache.size:40%

indices.cache.filter.size:30%

indices.cache.filter.terms.size:1024メガバイト

スレッドプール:

サーチ:

タイプ:キャッシュされました

サイズ:100

queue_size:2000

2)環境変数を設定

物理メモリのVIM /etc/profile.d/elasticsearch.sh輸出ES_HE AP _size = 2グラム#Heapサイズは半分以上と32G未満noです。

クラスター(私はクラスタを使用していない)の最適化:

  • ESは、分散メモリは、自動的に検出され、クラスタセットに追加されるときに同じcluster.name。

  • マスターが再選のためにダウンした場合、クラスターは自動的に、マスターを選出します。

  • 「スプリットブレイン」を防止するために、クラスタの数は、好ましくは奇数です。

  • 【「IP1」、「IP2」、「IP3」]:効果的にノードを管理するために、閉じた放送発見zen.ping.multicast.enabled :. FALSEおよび配置されたユニキャストノードグループdiscovery.zen.ping.unicast.hostsであってもよいです。

6、性能検査

入力と出力の性能を確認してください:

走行速度Logstashおよびサービスは、接続された一致し、それは速く、入力と出力の速度とすることができます。

システム・パラメータを確認します。

1)CPU

  • CPUが過負荷になっているかどうかに注意してください。あなたは、Linux / Unixシステムだけでなく、合計でトップ-Hビュープロセスパラメータを使用することができます。

  • CPUの使用率が高すぎると、JVMのヒープセクションを確認し、設定Logstashワーカーをチェックするために直接ジャンプ。

2)メモリ

  • 注意Logstashは、Java仮想マシンで実行されているので、それは、それに割り当てられ、あなたの最大メモリを使用します。

  • Logstashハードディスクスワップになりますメモリの状況の多くを使用する他のアプリケーションをチェックし、この場合の範囲を超えて物理メモリは、アプリケーションでメモリを占有します。

。3)I / Oモニタ、ディスクI / Oのチェックディスクの飽和

  • ディスク飽和が発生する可能性があり(例えば、ファイルの出力を使用して)Logstashプラグインを使用します。

  • エラーの数が多いが、Logstashが飽和大きなエラーログを生成すると、ディスクが発生します。

  • Linuxでは、あなたはDSTAT、iostatの使用することができますまたは他のコマンドは、I / Oのディスクを監視するために、

4)監視ネットワークI / O

  • ときに、ネットワーク操作入力、出力、原因ネットワーク飽和の装置。

  • Linuxは、iftopのDSTATで使用されるか、ネットワークの状態を監視することができます。

JVMのヒープをチェックしてください:

  • JVMガベージコレクションのメカニズムが発生したため、あまりにも小さく設定ヒープは、高いCPU使用率を引き起こす可能性があります。

  • ヒープ方式の簡単なチェックを設定すると、検出性能とサイズの2倍を改善するために提供されます。ヒープの物理メモリサイズは、オペレーティングシステムおよび他のプロセスのために確保されたメモリの少なくとも1G、設定されている超えません。

  • あなたは、コマンドラインまたは類似jmapのVisualVMのより正確な計算JVMのヒープを使用することができます。

あなたはさらなる最適化の方法、または困難を解決する方法がありましたら、コメント欄に追加してください -

著者:alonghub

出典:

https://www.cnblogs.com/along21/p/8613115.html

おすすめ

転載: blog.csdn.net/u013322876/article/details/89852717