ELKを使用したログ集中プラットフォームの構築


1.背景
現在、ますます多くの製品がマイクロサービスアーキテクチャを採用し、システム全体がいくつかのサービスに分割され、独立して異なるサーバに配置され、サービスが異なる環境に分散することで、チームの開発とメンテナンスに次のような一般的な問題が発生します.
  • 開発者は通常、生産環境サーバーの権限がなく、生産環境に障害が発生した場合、開発者は対応するサービスのログをタイムリーに表示することが難しい.
  • サービスログは複数のサーバに分散しており、クエリーが非常に不便です.
  • ログは通常ファイルの形式で各サーバに保存され、ログを迅速に検索するメカニズムが欠けている.
  • システムがますます膨大になると、ログファイルを分析処理し、インテリジェントなメンテナンスを実現することを望んでいますが、便利なログ取得メカニズムが欠けています.

  • ElK Stackは、上記のニーズを非常に低コストで満たすオープンソースの集中型ログソリューションです.ELKはソフトウェアではなく、ElasticSearch、LogStash、Kibana、そして新しく追加されたBeatsを含むツールセットです.
  • ElasticSearch:分散型検索エンジンで、Apache Luceneに基づいて構築され、大規模なデータを格納、検索、分析することができます.
  • Kibana:データ可視化プラットフォームは、通常ElasticSearchと統合され、ElasticSearchのデータの検索および可視化展示が可能である.
  • LogStash:データ処理パイプとして、異なるソースデータの収集、フィルタリング、分析処理などの操作をサポートし、その後、多種の異なる記憶媒体に出力して持続化を実現する.
  • Beats:軽量レベルの専用データ収集器で、宿主環境の資源消費をほとんど無視でき、Filebeat、Metricbeat、Packetbeat、Heartbeatなど、多種の異なるソースのデータ収集をサポートする.

  • 2.ELKアーキテクチャ
    最も簡単なELKアーキテクチャはLogStash,ElasticSearch,Kibanaを用いて構築でき,下図のようになる.このアーキテクチャは、LogStashを使用して、Stdinやログファイルなどのプラグインを入力してデータを取得し、データ処理後にElasticSearchに書き込んで格納し、最後にKibanaによってデータの表示を行う.このアーキテクチャでは、LogStashを環境内の各ビジネスノードに配備する必要があるが、LogStashコンポーネントの動作自体はCPUやメモリリソースを多く消費する必要があり、通常のビジネスに影響を与えやすいため、LogStashが占有するシステムリソースに対してほとんど考慮しない非常に軽量なデータ収集器Beatsが出現した.Beatsは現在、Filebeatがファイル内のデータを収集するために使用され、Packetbeatがネットワークストリーム内のデータを収集するために使用されるなど、多くのデータの収集をサポートしています.
    Beats導入後のアーキテクチャは,Beatsコンポーネントを用いてデータを収集し,LogStash流水ラインの入力プラグインをドッキングし,分析フィルタリング後に出力プラグインを介してElasticSearchに書き込み,最後にKibanaによりデータを示す.
    システムのトラフィック負荷が急激に大きくなると、大規模なログ・データ・ストリームが生成され、LogStashパイプライン内の各分析フィルタ・プラグインがボトルネックとなり、ブロックされることが多い.この場合、BeatsとLogStashの間にメッセージ・キューを導入して、ピークを削減して谷を埋める役割を果たすことができます.
    このときのELKアーキテクチャは、下図のように各サービスノードに分布するBeatsがデータを収集してメッセージキューに書き込むものであり、現在のBeatsがサポートするメッセージキューには、Kafka,RabbitMQ,Redisなどの一般的なものが含まれており、その後、LogStashは入力プラグインによってデータストリームを取得し、分析フィルタリングプラグイン処理を経てElasticSearchに書き込まれて記憶する最後にKibanaによりデータの可視化を実現する.
    3.快速構築
    ここではDockerを使用して、各Linuxシステム上にあるビジネスログを収集するためのELKシステムを迅速に構築します.ここでは便宜上、メッセージキュー占有時に導入しないため、具体的な導入方法は、公式ドキュメントを参照してプロファイルに対応するデータ入出力プラグインを導入すれば実現できる.ELKの各コンポーネントは公式にDockerミラーを提供しており、ここでdocker pullを表示してダウンロードすることができ、国内ではダウンロード速度が遅い可能性があります.
    3.1 ElasticSearch
    ElasticSearchをインストールする前に、/etc/sysctlでシステム設定を行う必要があります.confファイルの末尾にvm.max_map_count=655360を付け、コマンドsysctl -pを使用してリフレッシュします.そうしないと、ElasticSearchを起動するとmax virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]エラーが発生する可能性があります.
    システムディレクトリに/root/elasticsearch/dataと/root/elasticsearch/logsフォルダを作成し、それぞれElasticSearchのデータとログを永続化するために使用します.また、コマンドchmod 775 /root/elasticsearch/*を使用して2つのフォルダの読み書き権限を設定し、最後に次のコマンドを実行してElasticSearchサービスを開始します.
    # docker run -d --name elasticsearch --user root -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ELASTICSEARCH_USERNAME=admin -e ELASTICSEARCH_PASSWORD=admin@123  -v /root/elasticsearch/data/:/usr/share/elasticsearch/data/ -v /root/elasticsearch/logs/:/usr/share/elasticsearch/logs/ docker.elastic.co/elasticsearch/elasticsearch:6.5.2
    

    ElasticSearchサービスが開始されると、次のAPIにアクセスして、起動に成功したかどうかを確認できます.
    # curl -XGET http://192.168.1.6:9200/_search
    {"took":0,"timed_out":false,"_shards":{"total":0,"successful":0,"skipped":0,"failed":0},"hits":{"total":0,"max_score":0.0,"hits":[]}}
    

    3.2 Kibana
    サービス起動コマンドは次のとおりです.
    # docker run -d --name kibana -p 5601:5601 -e ELASTICSEARCH_URL=http://192.168.1.6:9200 docker.elastic.co/kibana/kibana:6.5.2
    

    Kibanaサービスが起動する前にElasticSearchを起動する必要があり、Kibanaを起動する際にElasticSearchデータベースアドレスを構成する必要があります.起動完了後に通過http://192.168.1.6:5601Kibanaインタフェースにアクセスできます.
    3.3 LogStash
    LogStashを起動する前にディレクトリ/root/logstashの下にlogstashを作成する.confファイルはLogStashサービスのプロファイルとして、以下の内容があります.
    input {
        beats {
            port => "5044"
        }
    }
    
    #filter {
    #    grok {
    #        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} %{LOGLEVEL:level} %{JAVALOGMESSAGE:msg}"
    #    }
    #}
    
    output {
        elasticsearch {
            hosts => ["192.168.1.6:9200"]
        }
    }
    

    次に、次のコマンドを実行してLogStashを起動します.
    # docker run -d --name logstash -p 5044:5044 --link elasticsearch -v /root/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf docker.elastic.co/logstash/logstash:6.5.2
    

    3.4 Filebeat
    /root/filebeatディレクトリの下に/dataフォルダとfilebeatを作成します.ymlファイルは、filebeatデータ収集状態およびfilebeatプロファイルを格納するために使用されます.ここにいるよymlファイルには、次の内容が追加されます.
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/test.log
    
    output.logstash:
      hosts: ["192.168.1.6:5044"]
    

    次に、次のコマンドを使用してFilebeatを起動してログデータ収集を行います.
    # docker run -d --name filebeat --user root -v /root/filebeat/data/:/usr/share/filebeat/data/ -v /root/filebeat/filebeat.yaml:/usr/share/filebeat/filebeat.yml -v /var/log/:/var/log/ docker.elastic.co/beats/filebeat:6.5.2
    

    4.簡単に使う
    すべてのサービスが構築されると、アクセスできます.http://kibana_host:5601Kibanaインタフェースです.具体的な使用説明は公式文書を参照してください.