0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[8.17.0] ログ量を大きく減らすLogsDBを試す

Last updated at Posted at 2024-12-18

はじめに

先日v8.17.0がリリースされましたが、その中にLogsDBという機能が含まれています。これはログをElasticsearchに取り込む際により効率的に保存することで、ログによるストレージ利用量を大きく削減する機能です。メトリクスではすでにTSDSとしてリリースしているもののログ版のような感じです。容量削減以外にも、近いデータ(host.name@timestamp)を同じ場所に置くという機能もあります。
正式なドキュメントとブログはこちらです。
https://www.elastic.co/guide/en/elasticsearch/reference/current/logs-data-stream.html
https://www.elastic.co/search-labs/blog/elasticsearch-logsdb-index-mode
大きくはsynthetic _sourceによる削減です。これはElasticsearchには_sourceというフィールドにそのドキュメントのすべてのデータが入っていたのですが、これを必要なときに組み立てるようにした機能です。
Dev Toolsでsearchクエリをかけると_sourceフィールドが表示されているのを見たことがあるかと思います。

{
  "took": 3454,
  "timed_out": false,
  "_shards": {
    "total": 6,
    "successful": 6,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 3.060212e-7,
    "hits": [
      {
        "_index": ".ds-elastic-cloud-logs-8-2024.12.13-000010",
        "_id": "NIb1zJMBR1m15PL7bWVj",
        "_score": 3.060212e-7,
        "_source": {
          "@timestamp": "2024-12-16T00:54:05.466Z",
          "ecs.version": "1.6.0",
          "state": "HEALTHY",
          "log.level": "info",
          "input": {
            "type": "log"
          },
          "host": {
            "name": "53a029ee4db3"
          },

synthetic _source以外にも圧縮方法を変更したりしています。ログにもよりますが、最大で65%削減という場合もあるようです。
本記事ではLogsDBの使い方に始まり、全く同じログデータを投入してLogsDBの有無でどのように変わるのかを説明いたします。

本機能を利用するためにはEnterpriseライセンスが必要です
LogsDB自体はBasicでも利用可能ですが、容量を削減させるSynthetic _sourceはEnterpriseライセンスのみです

準備

v8.17.0のElasticクラスタが必要です。クラウドもしくはオンプレで用意しましょう。
Elastic Agentを利用するので、オンプレの場合はFleet Serverも立ち上げます。
Elastic Cloudなら自動的にFleetも立ち上がります。
Elastic Cloudで新しくクラスタを作成する場合、v8.16.0以降で少し見た目が変わります。以下の記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/b041b2aff9cf068c21f1

手順

本記事はv8.17.0をベースに記載しています

Apache HTTP Logの準備

別に何でも良いのですが、コンテナでさっと疑似ログを作成できるApache HTTP Logで試します。
こちらを参考にしてください。
https://zenn.dev/not75743/articles/fb5be8a9ac838a
数秒で100MBを超えるログが用意されます。
今回は980万行で2.1GB程度のログを用意しました。
Ctrl-Cで止めないと作り続けるので注意してください。

$ docker compose exec apacheloggen apache-loggen > apache.log
$ ls -l apache.log
-rw-r--r--  1 takeofurukubo  staff  2169571349 12 18 01:43 apache.log
$ wc -l apache.log 
 9854316 apache.log

v8.17ではある程度のログ量(1GB程度)がないと効果が出ません

Apache HTTP Log Integrations

Integrationはログを自動的に整形して可視化のダッシュボードを作成するものです。
Ingest PipelineとKibana Lensが主な構成要素です。

まず3本線メニューからManagementの下にあるIntegrationsをクリックします。
https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2603229_305ca722-64b8-7de4-ab54-f9bd32e37d6d.png

検索バーがあるのでapache httpと入力すると以下のようにフィルタされるので、表示されているApache HTTP Serverをクリックします。
スクリーンショット 2024-12-16 10.08.52.png

右上のApache HTTP Serverをクリックします。
スクリーンショット 2024-12-16 10.11.57.png

次の画面はクラスタ作成後に初めてIntegrationsを追加する人だけ表示されます

この画面が表示されたら、一番下のAdd integration only (skip agent installation)をクリックします。
スクリーンショット 2024-11-27 17.28.34.png

以下を設定します。

  • Collect metrics from Apache instancesのチェックを外す
    • 疑似ログなのでメトリクスは取れません
  • Collect logs from Apache instancesの横にあるChange defaultsをクリック
    • ここではログの場所を指定しています。疑似ログなので/var等は必要ありません。
    • Add rowをクリックして/<ログの場所>/apache*.logを追加。これは実際にログのある場所を指定してください。(画面では/elastic/apache*.logとなっています)
    • 他の3つを消す(別にあってもよいですが)

最後に右下のSave and continueをクリックします。
スクリーンショット 2024-12-16 10.22.04.png

次にAdd Elastic Agent to your hostsをクリックしてElastic Agentをインストールします。
スクリーンショット 2024-12-16 9.38.11.png

少しスクロールダウンすると各環境におけるインストールコマンドが表示されていますので、これをコピー&ペーストしてインストールします。
スクリーンショット 2024-12-16 10.25.41.png

問題なくインストールができて設定に問題がなければ以下のようになります。
https___qiita-image-store.s3.ap-northeast-1.amazonaws.com_0_2603229_39f504ea-b6de-cfe7-4faf-0128bfff1d74.png

Apache HTTP Logを投入

そのままでも良いのですが、大きな疑似ファイルを作ってしまった場合だと、デフォルトだと時間がかかるので少し設定を変更します。

Elastic Agentの多重度変更

このページに有るOptimized for Throughputにします。
workerが4になるので、Elastic Agentを動作させている端末の負荷は大きく上がります。本番で使うときは気をつけましょう。
https://www.elastic.co/guide/en/fleet/current/es-output-settings.html#es-output-settings-performance-tuning-settings

まず3本線メニューからFleetをクリックして、Settingsをクリック
スクリーンショット 2024-12-16 10.43.22.png

Outputsにあるdefaultの横にある鉛筆マークをクリック
スクリーンショット 2024-12-16 10.45.33.png

一番下にあるPerformance TuningからThroughputを選び、右下のSave and apply settingsをクリック
スクリーンショット 2024-12-16 10.47.25.png

確認ダイアログが立ち上がるので、Save and deployをクリック
スクリーンショット 2024-12-16 10.49.04.png

取り込み開始

最初に作ったapache.logをElastic Agentで指定した場所にコピーします
すると自動的に取り込みが始まります。
まずはLogsDB無しの状態で取り込みます。

以下の手順で確認できます。

3本線メニューから一番下のStack Managementをクリック
スクリーンショット 2024-12-16 11.02.14.png

Index managementをクリック
スクリーンショット 2024-12-16 10.36.36.png

検索ボックスにapacheと入れて、右上にあるInclude hidden indicesのチェックをつける
スクリーンショット 2024-12-16 10.37.49.png

Document Countに投入した行数が表示されているので、これが作成した疑似ログの行数と同じになるまで待ちます。
実は投入自体はそこまで時間がかからなくても、ここの表示が追いつかないことはあります。RDBと違ってEventually Consistentなので、結果の表示は少し遅れます。
9854316行、2169571349バイトのApacheログを取り込むと以下のようになりました。容量が大きいのは、JSON化されていることと冗長化されていることによります。
スクリーンショット 2024-12-18 9.15.19.png

LogsDBを有効にする

ではLogsDBを有効にしてから同じログを取り込みます。
Data Streamの設定を変更します。Data Streamについてはこちらの記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/78de759b0d94e158e49b

Indexを表示しているページで、右端のlogs-apache.access-defaultをクリック
スクリーンショット 2024-12-16 11.09.44.png

Index templateの下のlogs-apache.accessをクリック
スクリーンショット 2024-12-16 11.15.53.png

右下のManageをクリックして、Editをクリック
スクリーンショット 2024-12-16 11.20.12.png

Index Templateの設定ページになるので、Index modeのプルダウンメニューからLogsDBを選ぶ
スクリーンショット 2024-12-18 9.19.17.png

右上のReview Templatesをクリックして、Save templatesをクリックして保存します。
Index modeLogsDBになっています。
スクリーンショット 2024-12-18 9.22.07.png

遷移した画面でSettingsをクリックすると、logsdbが設定されているのがわかります。
スクリーンショット 2024-12-16 11.29.55.png

Rolloverする

新しい設定が入ったIndexにデータを取り込むためにRolloverします。
3本線メニューからManagementの下にあるDev Toolsをクリック
スクリーンショット 2024-12-16 11.32.12.png

左側の画面に以下を入力して実行します。

POST logs-apache.access-default/_rollover

スクリーンショット 2024-12-16 11.35.03.png

Stack Management->Index Managementで新しいインデックス(.ds-logs-apache.access-default-2024.12.17-000002)が作成されたことを確認します。
スクリーンショット 2024-12-18 9.27.07.png

これ以降Elastic Agentからの取り込みはこの新しいインデックスに書き込まれます。

Apache HTTP Logを再投入

Elastic Agentで指定したディレクトリで一度apache.logを消してコピーすると再度取り込んでくれます。

最終形

最終的にこの様になりました。
スクリーンショット 2024-12-18 9.30.15.png

5.32GB -> 3.66GBに減っていますので、だいたい32%減となります。
これはApache Logの場合の数字ですので、ログの種類によっていどのぐらい減るかは是非テストしてみてください。

まとめ

Enterpriseライセンスを使用すると、本記事で紹介したLogsDBに加えてSearchable Snapshotも利用できます。これらを駆使することで、ログの種類によって最適な状態にできます。
監査ログはそこまで頻繁に検索しないのでLogsDB+Searchable Snapshot、メトリクスは1週間で廃棄、など自由に組み合わせることができます。
ただ、Synthetic _sourceによって_sourceを持ってくる場合はCPUの負荷が上がることもあります。

うまく組み合わせてコストとパフォーマンスの最適化を行ってみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?