9. Logstashの導入

この章では、Senju/QA 全文検索サーバーの稼働に必要なソフトウェアである、Logstashを導入するための手順について説明します。

9.1. Logstashの概要

Logstashは、サーバー間のデータを処理するための軽量パイプラインツールです。 商用利用可能なオープンソースライセンスであるApache 2.0 licenseで提供されています。

Senju/QAではLogstashを利用して、DBサーバーおよび全文検索サーバー間のデータの同期を行います。

9.2. 対象バージョン

Senju/QA 全文検索サーバーではLogstash 7.16.2 を使用します。 ここでは、Logstash 7.16.2を例として導入手順を説明します。

注釈

サポート対象となるLogstashのバージョンについては リリースノート を参照してください。

9.3. Logstashのインストール

Windows

  1. インストール用のzipファイルを入手して、インストールするサーバーの任意のフォルダに格納します。

    ダウンロードURL:
    対象ファイル:
    • logstash-7.16.2-windows-x86_64.zip

    (ここでは logstash-7.16.2-windows-x86_64.zipC:\Temp 配下に格納した場合の手順を例として説明します。ほかのフォルダに格納した場合は適宜各コマンドで指定するパスを変更してください。)

  2. インストールするサーバーに管理者権限のアカウントでログインします。

  3. zipファイルをCドライブ直下に展開します。
    PS C:\> Expand-Archive -Path C:\Temp\logstash-7.16.2-windows-x86_64.zip -Destination C:\
    PS C:\> Rename-Item C:\logstash-7.16.2 C:\logstash
    

    注釈

    C:\logstash フォルダが作成されます。

  4. タスクスケジューラに Logstash タスクを登録します。
    PS C:\> $action = New-ScheduledTaskAction -Execute "C:\logstash\bin\logstash.bat" -Argument "-f C:\logstash-senjuqa\conf\senjuqa_pages.conf"
    PS C:\> $user = "NT AUTHORITY\SYSTEM"
    PS C:\> $trigger = New-ScheduledTaskTrigger -AtStartup
    PS C:\> Register-ScheduledTask -TaskName Logstash -Action $action -Trigger $trigger -User $user
    
    TaskPath                                       TaskName                          State
    --------                                       --------                          -----
    \                                              Logstash                          Ready
    
    表 9.1 Register-ScheduledTask コマンドのパラメタ説明
    パラメーター
    説明
    指定値
    -TaskName <taskname>
    タスクの名前を指定します。
    -TaskName Logstash
    -Action <action>
    実行するコマンドを指定します。
    -Action $action
    -Trigger <trigger>
    スケジュールの種類を指定します。
    -Trigger $trigger
    -User <user>
    指定したアカウントのアクセス許可でタスクを実行します。
    -User $user

    注釈

    Windows管理ツール[タスクスケジューラ]から登録することもできます。
    1. [操作]-[タスクの作成]をクリックします。
    2. [タスクの作成]ダイアログが表示されます。
    3. [全般]タブで以下の内容を入力します。
    [名前(M):] Logstash
    4. [全般]タブで[ユーザーまたはグループの変更(U)]ボタンをクリックし、以下の内容を入力します。
    [選択するオブジェクト名を選択してください(E):] system
    [名前の確認(C)]ボタンをクリックします。
    [OK]ボタンをクリックします。
    5. [トリガー]タブで[新規(N)]ボタンをクリックし、以下の内容を入力します。
    [タスクの開始(G):] スタートアップ時
    6. [操作]タブで[新規(N)]ボタンをクリックし、以下の内容を入力します。
    [プログラム/スクリプト(P):] C:\logstash\bin\logstash.bat
    [引数の追加(オプション)(A):] -f C:\logstash-senjuqa\conf\senjuqa_pages.conf
  5. JDBC用のdriverを入手して、インストールするサーバーの任意のディレクトリに格納します。

    ダウンロードURL:
    対象ファイル:
    • postgresql-42.3.1.jar

    (ここでは postgresql-42.3.1.jarC:Temp 配下に格納した場合の手順を例として説明します。ほかのフォルダに格納した場合は適宜各コマンドで指定するパスを変更してください。)

  6. Logstashパイプライン定義ファイル格納用フォルダを作成します。
    PS C:\> New-Item C:\logstash-senjuqa\conf -ItemType Directory
    
  7. JDBC用のdriver格納用フォルダを作成します。
    PS C:\> New-Item C:\logstash-senjuqa\lib -ItemType Directory
    
  8. JDBC用のdriverを所定のフォルダ配下に格納します。
    PS C:\> Copy-Item -Path C:\Temp\postgresql-*.jar -Destination C:\logstash-senjuqa\lib\
    
  9. 設定ファイル C:\logstash\config\logstash.yml を以下の通り更新します。
    • queue.typememory から persisted に変更します。
      #queue.type: memory
      queue.type: persisted
      

      注釈

      この設定を変更しないと、異常発生時にLogstashのデータ登録イベントが抜けてしまう恐れがあります。

  10. Logstashのログ設定ファイルを編集します。
    対象ファイル:
    • C:\logstash\config\log4j2.properties

    1. 以下のように設定を変更します。
      #appender.rolling.strategy.max = 30
      appender.rolling.strategy.action.type = Delete
      appender.rolling.strategy.action.basepath = ${sys:ls.logs}
      appender.rolling.strategy.action.condition.type = IfFileName
      appender.rolling.strategy.action.condition.glob = logstash-${sys:ls.log.format}-*
      appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
      appender.rolling.strategy.action.condition.nested_condition.age = 7D
      

    注釈

    この設定を追加することで、7日間変更がない古いログを削除するようになります。
    ログ削除の設定を追加しない場合、デフォルトでは古いログファイルが残り続けるため C:logstash-7.16-1logs フォルダのディスク容量を圧迫してしまう可能性があります。

Linux

  1. インストール用のrpmファイルを入手して、インストールするサーバーの任意のディレクトリに格納します。
    対象ファイル:
    • logstash-7.16.2.rpm

    (ここでは logstash-7.16.2.rpm/tmp/ 配下に格納した場合の手順を例として説明します。ほかのディレクトリに格納した場合は適宜各コマンドで指定するパスを変更してください。)

  2. インストールするサーバーに管理者権限のアカウントでログインします。

  3. rpmコマンドを実行してパッケージをインストールします。
    # rpm -ivh /tmp/logstash-[0-9]*.rpm
    
  4. 自動起動の設定を行います。
    # systemctl daemon-reload
    # systemctl enable logstash
    
  5. Senju/QAのインストールメディアから、JDBC用のdriverを入手して、インストールするサーバーの任意のディレクトリに格納します。
    対象ファイル:
    • postgresql-42.3.1.jar

    (ここでは postgresql-42.3.1.jar/tmp/ 配下に格納した場合の手順を例として説明します。ほかのディレクトリに格納した場合は適宜各コマンドで指定するパスを変更してください。)

  6. JDBC用のdriver格納用ディレクトリーを作成します。
    # mkdir -p /opt/logstash/lib
    
  7. JDBC用のdriverを所定のディレクトリー配下に格納し、所有者およびグループをlogstashユーザーに変更します。
    # \cp -f /tmp/postgresql-*.jar /opt/logstash/lib/
    # chown -R logstash:logstash /opt/logstash
    
  8. 設定ファイル /etc/logstash/logstash.yml を以下の通り更新します。
    • queue.typememory から persisted に変更します。
      # sed -i 's/^queue.type:.*//g' /etc/logstash/logstash.yml
      # echo 'queue.type: persisted' >> /etc/logstash/logstash.yml
      

      注釈

      この設定を変更しないと、異常発生時にLogstashのデータ登録イベントが抜けてしまう恐れがあります。

  9. Logstashのログ設定ファイルを編集します。
    対象ファイル:
    • /etc/logstash/log4j2.properties

    1. 以下のように設定を変更します。
      #appender.rolling.strategy.max = 30
      appender.rolling.strategy.action.type = Delete
      appender.rolling.strategy.action.basepath = ${sys:ls.logs}
      appender.rolling.strategy.action.condition.type = IfFileName
      appender.rolling.strategy.action.condition.glob = logstash-${sys:ls.log.format}-*
      appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified
      appender.rolling.strategy.action.condition.nested_condition.age = 7D
      

      (コマンド例)

      # sed -i 's/^\(appender\.rolling\.strategy\.max\s*=.*\)/#\1\
      appender.rolling.strategy.action.type = Delete\
      appender.rolling.strategy.action.basepath = ${sys:ls.logs}\
      appender.rolling.strategy.action.condition.type = IfFileName\
      appender.rolling.strategy.action.condition.glob = logstash-${sys:ls.log.format}-*\
      appender.rolling.strategy.action.condition.nested_condition.type = IfLastModified\
      appender.rolling.strategy.action.condition.nested_condition.age = 7D/g' /etc/logstash/log4j2.properties
      

    注釈

    この設定を追加することで、7日間変更がない古いログを削除するようになります。ログ削除の設定を追加しない場合、デフォルトでは古いログファイルが残り続けるため /var/log/logstash ディレクトリのディスク容量を圧迫してしまう可能性があります。

9.4. データ収集用sqlファイルの導入

Windows

  1. データ収集用sqlファイル格納用フォルダを作成します。
    PS C:\> New-Item C:\logstash-senjuqa\sql -ItemType Directory
    
  2. データ収集用sqlファイルを所定のフォルダ配下に格納します。
    PS C:\> Copy-Item -Path C:\Temp\Senju_Quick_Assistant\conf\logstash\*.sql -Destination C:\logstash-senjuqa\sql\
    

Linux

  1. データ収集用sqlファイル格納用ディレクトリーを作成します。
    # mkdir -p /opt/logstash/sql
    
  2. データ収集用sqlファイルを所定のディレクトリー配下に格納し、所有者およびグループをlogstashユーザーに変更します。
    # \cp -f /tmp/Senju_Quick_Assistant/conf/logstash/*.sql /opt/logstash/sql/
    # chown -R logstash:logstash /opt/logstash
    

9.5. パイプライン定義ファイルの導入

各種サーバー間のデータを同期するためのパイプライン定義ファイルの導入手順を説明します。

  1. インストールするサーバーに管理者権限のアカウントでログインします。

  2. Logstashパイプライン定義ファイルを格納します。

    Windows

    PS C:\> Copy-Item -Path C:\Temp\Senju_Quick_Assistant\conf\logstash\senjuqa_pages.conf.template -Destination C:\logstash-senjuqa\conf\senjuqa_pages.conf
    

    Linux

    # \cp -f /tmp/Senju_Quick_Assistant/conf/logstash/senjuqa_pages.conf.template /etc/logstash/conf.d/senjuqa_pages.conf
    # chown -R logstash:logstash /etc/logstash/conf.d
    
  3. Logstashパイプライン定義ファイルを以下の通り更新します。
    対象ファイル:
    • Windows

      • C:\logstash-senjuqa\conf\senjuqa_pages.conf

    • Linux

      • /etc/logstash/conf.d/senjuqa_pages.conf

    1. jdbc_connection_string に記載されているPostgreSQLへの接続情報について、 [hostname]:[port]/[dbname] から、 Senju/QA DBサーバーホスト名:Senju/QA DBサーバーポート番号/Senju/QAデータベース名 に変更します。

      (Senju/QA DBサーバーホスト名を sdb00001 に、Senju/QA DBサーバーポート番号を 5432 に、Senju/QAデータベース名 senjuqa に変更する場合の例)

      jdbc_connection_string => "jdbc:postgresql://sdb00001:5432/senjuqa"
      
    2. jdbc_driver_library に記載されているJDBCライブラリファイルのパスについて、 [jdbc_driver_library_path] から、 実際に C:\logstash-senjuqa\lib (Windows) あるいは /opt/logstash/lib (Linux) 配下に格納されている postgresql-*.jar ファイルのパスに変更します。

      Windows

      jdbc_driver_library => "C:\logstash-senjuqa\lib\postgresql-42.3.1.jar"
      

      Linux

      jdbc_driver_library => "/opt/logstash/lib/postgresql-42.3.1.jar"
      

      注釈

      利用するjdbcライブラリのバージョンが異なるバージョンは実際のものに合わせてパスを指定してください。

    3. jdbc_user に記載されているSenju/QAデータベースユーザー名について、 [username] から、正しいユーザー名に変更します。

      (Senju/QAデータベースユーザー名を senjuqa に変更する場合の例)

      jdbc_user => "senjuqa"
      
    4. jdbc_password に記載されているSenju/QAデータベースパスワードについて、 [password] から、正しいパスワードに変更します。

      (Senju/QAデータベースパスワードを qapass に変更する場合の例)

      jdbc_password => "qapass"
      
    5. last_run_metadata_path に記載されているJDBCライブラリファイルのパスについて、 [last_run_metadata_path] から、 実際に C:\logstash-senjuqa\.senjuqa_pages_last_run_fil (Windows) あるいは /opt/logstash/.senjuqa_pages_last_run_fil (Linux) に変更します。

      Windows

      statement_filepath => "C:\logstash-senjuqa\.senjuqa_pages_last_run_fil"
      

      Linux

      statement_filepath => "/opt/logstash/.senjuqa_pages_last_run_fil"
      
    6. statement_filepath に記載されているJDBCライブラリファイルのパスについて、 [statement_filepath] から、 実際に C:\logstash\sql (Windows) あるいは /opt/logstash/sql (Linux) 配下に格納されている senjuqa_pages.sql ファイルのパスに変更します。

      Windows

      statement_filepath => "C:\logstash\sql\senjuqa_pages.sql"
      

      Linux

      statement_filepath => "/opt/logstash/sql/senjuqa_pages.sql"
      
    7. hosts に記載されているElasticsearchへの接続情報について、 [hostname]:[port] から、 Senju/QA 全文検索サーバーのホスト名:ElasticsearchのREST APIポート番号 に変更します。

      (Senju/QA 全文検索サーバーのホスト名を srec00001 に、ElasticsearchのREST APIポート番号を 9200 に変更する場合の例)

      hosts => [ "srec00001:9200" ]
      

      注釈

      ElasticsearchのREST APIポート番号のデフォルト値は9200です。

  4. Logstashを起動します。

    Windows

    PS C:\> Start-ScheduledTask -TaskName "Logstash"
    

    Linux

    # systemctl start logstash
    
  5. 以下のコマンドを実行して、logstashサービスが正常に動作していることを確認します。

    Windows

    PS C:\> $r = Invoke-RestMethod -Method Get -Uri 'http://localhost:9600/?pretty'
    PS C:\> $r | ConvertTO-JSON
    {
        "host":  "senjuqa01",
        "version":  "7.16.2",
        "http_address":  "127.0.0.1:9600",
        "id":  "7abbf9d9-c94c-4b95-abc2-ffbf6ba89ee0",
        "name":  "senjuqa01",
        "ephemeral_id":  "106da6ac-d44b-41fa-b2cf-471f0d67be5e",
        "status":  "green",
        "snapshot":  false,
        "pipeline":  {
                        "workers":  2,
                        "batch_size":  125,
                        "batch_delay":  50
                    },
        "build_date":  "2021-12-11T00:29:08Z",
        "build_sha":  "b2d1d11381460fce1fed2f88d8f5eef44a29306a",
        "build_snapshot":  false
    }
    

    Linux

    # curl -XGET 'http://localhost:9600/?pretty'
    {
    "host" : "sdb00001",
    "version" : "7.16.2",
    "http_address" : "127.0.0.1:9600",
    "id" : "2f157c48-8f02-41ab-995e-50c1d0440336",
    "name" : "sqaaio07",
    "ephemeral_id" : "a7647914-af98-4d62-bd70-0aeafc697ef7",
    "status" : "green",
    "snapshot" : false,
    "pipeline" : {
        "workers" : 1,
        "batch_size" : 125,
        "batch_delay" : 50
    },
    "build_date" : "2020-09-01T23:34:13+00:00",
    "build_sha" : "ffb96ff994a3669e94619451440add1514aa3391",
    "build_snapshot" : false
    }
    

    注釈

    レスポンスが確認できなかった場合はしばらく待ってから再度試してください。