キーワードで検索

今日を知り、明日を変えるシステム運用メディア

「Grafana Lokiって何がすごいの?」ログ管理のコストを大幅削減できる理由

「Grafana Lokiって何がすごいの?」ログ管理のコストを大幅削減できる理由

システム運用において欠かせない要素である「ログ管理」。

使用するログ管理ツールの選択を誤ると、ストレージコストや処理負荷が増大してしまい、運用コストが高騰するリスクも……。

本記事では、コストパフォーマンスに優れたログ管理ツールである「Grafana Loki(グラファナ ロキ)」を紹介します。

前半では、Grafana Loki の特徴である「ログをラベルで管理する」というアプローチが、なぜコスト削減につながるのかを分かりやすく解説。後半では、Grafana Loki 導入のハンズオンもご紹介します。

Grafana Loki の基本をすべて抑えられるようにまとめましたので、ぜひ最後まで読んでみてください!

Grafana Loki のラベル管理とコスト削減の仕組み

Grafana Loki とは、ログの管理にラベルベースの管理方式を採用しているログ管理ツールの一つです。ラベルベースの管理方式は、従来式のインデックスベースの管理方式と比較して次のようなメリットがあります。

  • 必要なストレージ容量を削減できる
  • CPUやメモリなどの計算リソースの削減できる

結果として、大幅なコスト削減につながるのです。この仕組みについて詳しく解説していきます!

従来のログ管理ツールの方式とデメリット

ElasticSearch を始めとする、多くのログ管理ツールではインデックスベースの管理方式を採用しています。インデックスとは、大量のログデータの中から特定のログを検索するときに使用される辞書のようなものです。

インデックスベースの管理方式では、ログデータから特定のキー(タイムスタンプ、ホスト名 等)を抽出してインデックスを作成します。

ログデータからある特定の情報に基づいてログを検索したい時、このインデックスを参照します。
このようにして、ログの全文からデータを検索するより、効率的なデータ検索が可能になるのです。

一方で、インデックスベースの管理方式には次のようなデメリットがあります。これらの問題を解決するアイデアが、 Grafana Loki で採用されている、ラベルベースの管理方式なのです。

作成されたインデックスを保存するためのストレージ容量が必要となる

ログが増えると、インデックスのサイズも急激に増加してしまいます。
概ね50%弱の追加ストレージがインデックス用に必要と言われており1、ストレージにかかるコストは無視できません。

インデックスを作成するためにCPUやメモリに負荷がかかる

インデックスベースの管理方式では、ログを保存するたびにログを解析してインデックスを作成します。したがって、リアルタイムに大量のログが流れる環境では、ログ解析のためにCPUやメモリに大きな負荷がかかるのです。

Grafana Loki のラベル管理方式

Grafana Loki では、ラベルベースの管理方式が採用されています。この方式によって、インデックスベースの管理方式のデメリットを解消することができるのです。

ラベルベースの管理方式では、Key-Value の形式で表現される「ラベル」が各ログに対して付与されます。

ラベルに基づいてログデータは分類・保存されます。検索時にはラベルをフィルタリングし、保存先のデータブロック(chunk)を特定します。このように、ログが格納される chunk を絞りこむことでデータの取得を効率的に行うのです。

インデックスベースの管理方式とは異なり、インデックスを作成していないことがわかります。
つまり、インデックスの保存に必要なストレージ容量や、インデックス作成に必要なCPU・メモリを必要としないのです。

また、Grafana Loki は AWS の S3 や Google Cloud の GCS といった、オブジェクトストレージの使用を前提として設計されています。
オブジェクトストレージはデータを安価に保存でき、スケーラビリティにも優れるため、この点もメリットの一つです。

Grafana Loki を導入する方法 ─簡単なハンズオン

Grafana Loki の導入はとても簡単です。Docker を使用した、Grafana Lokiを導入する手順をご紹介します。

事前準備

本記事の手順で Grafana Loki を導入する場合、Docker のインストールが必須です。
公式サイトを参考に、Docker をインストールしてください。

docker-compose.yml の作成

このハンズオンでは、ログ管理ツールである「Loki」、ログ収集ツールである「Promtail」、ログ可視化ツールである「Grafana」の3つのコンテナを作成していきます。

これらのコンテナを動作させるための docker-compose.yml を作成しましょう。

次のコマンドで、loki-stack というプロジェクトディレクトリに移動します。

mkdir loki-stack && cd loki-stack

プロジェクトディレクトリ内に、docker-compose.yml を作成してください。

vi docker-compose.yml
  • docker-compose.yml
version: '3'

services:
  loki:
    image: grafana/loki:latest
    container_name: loki
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yml:/etc/loki/local-config.yaml
    command: -config.file=/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      - /var/log:/var/log
      - ./promtail-config.yml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin

volumes:
  grafana_data:

設定ファイルは、主に次のようなセクションで構成されます。

auth_enabled: falseLoki の認証機能を無効化する設定です。テスト用の設定ですので、本番環境では有効化しましょう。
serverLoki のサーバー設定です。今回の設定では、HTTPの3100番で接続を待ち受ける設定としています。
commonどのようにデータを保存するかや、クラスタリング(複数のサーバーを組み合わせること)の設定を行うセクションです。
今回はテスト用のため、ローカルサーバーにデータを保存し、クラスタリングは行わない設定としています。
schema_configログの保存方法や、ラベル情報の保存方法を設定するセクションです。
storage_configログの保存先を指定します。今回はローカルを指定していますが、AWS の S3 のようなリモートストレージを指定することも可能です。

Promtail の設定ファイルの作成

Loki がログの保存や検索を担当する部分とすると、Promtail はログの収集や送信を担当する部分と考えてください。メインテーマではないので詳しい説明は割愛しますが、Loki とセットで使われることが多いツールです。

promtail-config.yml を同様に作成してください。

vi promtail-config.yml
  • promtail-config.yml
server:
 http_listen_port: 9080
 grpc_listen_port: 0
positions:
 filename: /var/lib/positions.yaml
clients:
 - url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
 decompression:
   enabled: true
   initial_delay: 10s
   format: gz
 static_configs:
 - targets:
     - localhost
   labels:
     job: varlogs
     __path__: /var/log/**.gz

Loki の起動

次のコマンドを実行すれば、Loki が起動します。

docker-compose up -d

docker を使用して Loki を起動していますので、必要なコンテナが起動しているか確認します。
成功していれば、「loki」「promtail」「grafana」の3つのコンテナが起動しているはずです。
docker ps コマンドで確認してみましょう。

% docker ps
CONTAINER ID   IMAGE                     COMMAND                   CREATED          STATUS          PORTS                    NAMES
a0c4b2f9f6dc   grafana/loki:latest       "/usr/bin/loki -conf..."   18 minutes ago   Up 18 minutes   0.0.0.0:3100->3100/tcp   loki
bf25a1e98c7f   grafana/grafana:latest    "/run.sh"                 18 minutes ago   Up 18 minutes   0.0.0.0:3000->3000/tcp   grafana
25f8d0a35a53   grafana/promtail:latest   "/usr/bin/promtail -..."   18 minutes ago   Up 18 minutes                            promtail

Loki にはステータスを確認するためのエンドポイントが用意されています。
/ready のパスに対して curl コマンドを実行し、ready がレスポンスで返されれば、Loki は正常に起動しています。

% curl -s http://localhost:3100/ready
ready

Grafanaとの統合

続いて、Loki をログ可視化ツールである Grafana と統合して、実際にログを確認してみましょう。

ブラウザを開いて、http://localhost:3000 にアクセスします。ログイン画面が表示されるので、username と password にそれぞれ admin と入力すればログインできます。

ログイン後、新しいパスワードの設定が求められるので、任意のパスワードを設定してください。

左上の Grafana のロゴをクリックし、Connections 配下の 「Data source」 をクリックします。

「Add data source」をクリックし、Loki をデータソースとして追加します。

URL欄に http://loki:3100 と入力します。その他の値は変更せず、画面を下までスクロールして「Save & test」をクリックします。

成功すれば、「Save & test」をクリックすると、「Data source successfully connected.」のメッセージが表示されます。

Explore の画面からログが確認できます。クエリに {job=”varlogs”} |= “を指定してクエリを実行し、ログが表示されれば成功です!

Grafana の Data source を作成するタイミングによっては、ログが表示されない場合があります。
もしログが表示されない場合は、コンテナの再起動などを試してみてください。

まとめ

Grafana Loki の基本概念について、従来のログ管理ツールとの違いを踏まえて解説しました。Loki のラベルベースのログ管理方式による、コスト削減の仕組みがお分かりいただけたと思います。

Loki の実際の導入手順についてもハンズオン形式で解説しました。Docker を使用すれば簡単に Loki の導入ができます。Loki の導入を考えている方は、本記事の手順を参考にしていただけましたら幸いです。

インフラエンジニア歴6年。AWS・Google Cloud資格全冠。趣味はボルダリングと登山。

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録