はじめに
先日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をクリックします。
検索バーがあるのでapache http
と入力すると以下のようにフィルタされるので、表示されているApache HTTP Serverをクリックします。
右上のApache HTTP Server
をクリックします。
次の画面はクラスタ作成後に初めてIntegrationsを追加する人だけ表示されます
この画面が表示されたら、一番下のAdd integration only (skip agent installation)
をクリックします。
以下を設定します。
-
Collect metrics from Apache instances
のチェックを外す- 疑似ログなのでメトリクスは取れません
-
Collect logs from Apache instances
の横にあるChange defaults
をクリック- ここではログの場所を指定しています。疑似ログなので
/var
等は必要ありません。 -
Add row
をクリックして/<ログの場所>/apache*.log
を追加。これは実際にログのある場所を指定してください。(画面では/elastic/apache*.log
となっています) - 他の3つを消す(別にあってもよいですが)
- ここではログの場所を指定しています。疑似ログなので
最後に右下のSave and continue
をクリックします。
次にAdd Elastic Agent to your hosts
をクリックしてElastic Agentをインストールします。
少しスクロールダウンすると各環境におけるインストールコマンドが表示されていますので、これをコピー&ペーストしてインストールします。
問題なくインストールができて設定に問題がなければ以下のようになります。
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
をクリック
Outputs
にあるdefault
の横にある鉛筆マークをクリック
一番下にあるPerformance Tuning
からThroughput
を選び、右下のSave and apply settings
をクリック
確認ダイアログが立ち上がるので、Save and deploy
をクリック
取り込み開始
最初に作ったapache.log
をElastic Agentで指定した場所にコピーします
すると自動的に取り込みが始まります。
まずはLogsDB無しの状態で取り込みます。
以下の手順で確認できます。
3本線メニューから一番下のStack Management
をクリック
検索ボックスにapache
と入れて、右上にあるInclude hidden indices
のチェックをつける
Document Count
に投入した行数が表示されているので、これが作成した疑似ログの行数と同じになるまで待ちます。
実は投入自体はそこまで時間がかからなくても、ここの表示が追いつかないことはあります。RDBと違ってEventually Consistentなので、結果の表示は少し遅れます。
9854316行、2169571349バイトのApacheログを取り込むと以下のようになりました。容量が大きいのは、JSON化されていることと冗長化されていることによります。
LogsDBを有効にする
ではLogsDBを有効にしてから同じログを取り込みます。
Data Streamの設定を変更します。Data Streamについてはこちらの記事を参考にしてください。
https://qiita.com/takeo-furukubo/items/78de759b0d94e158e49b
Indexを表示しているページで、右端のlogs-apache.access-default
をクリック
Index templateの下のlogs-apache.access
をクリック
Index Templateの設定ページになるので、Index mode
のプルダウンメニューからLogsDB
を選ぶ
右上のReview Templates
をクリックして、Save templates
をクリックして保存します。
Index mode
がLogsDB
になっています。
遷移した画面でSettings
をクリックすると、logsdbが設定されているのがわかります。
Rolloverする
新しい設定が入ったIndexにデータを取り込むためにRolloverします。
3本線メニューからManagement
の下にあるDev Tools
をクリック
左側の画面に以下を入力して実行します。
POST logs-apache.access-default/_rollover
Stack Management
->Index Management
で新しいインデックス(.ds-logs-apache.access-default-2024.12.17-000002
)が作成されたことを確認します。
これ以降Elastic Agentからの取り込みはこの新しいインデックスに書き込まれます。
Apache HTTP Logを再投入
Elastic Agentで指定したディレクトリで一度apache.log
を消してコピーすると再度取り込んでくれます。
最終形
5.32GB -> 3.66GBに減っていますので、だいたい32%減となります。
これはApache Logの場合の数字ですので、ログの種類によっていどのぐらい減るかは是非テストしてみてください。
まとめ
Enterpriseライセンスを使用すると、本記事で紹介したLogsDBに加えてSearchable Snapshotも利用できます。これらを駆使することで、ログの種類によって最適な状態にできます。
監査ログはそこまで頻繁に検索しないのでLogsDB+Searchable Snapshot、メトリクスは1週間で廃棄、など自由に組み合わせることができます。
ただ、Synthetic _sourceによって_sourceを持ってくる場合はCPUの負荷が上がることもあります。
うまく組み合わせてコストとパフォーマンスの最適化を行ってみてください。