ククログ

株式会社クリアコード > ククログ > 障害復旧機能を提供するcollectdプラグインの紹介(ローカル監視機能編)

障害復旧機能を提供するcollectdプラグインの紹介(ローカル監視機能編)

システムやアプリケーションのメトリクス情報をあつめるソフトウェアの1つにcollectdがあります。

今回は、株式会社セナネットワークス様からの発注を受けて開発した障害復旧機能を提供するcollectdプラグイン(lua-collectd-monitor)について紹介します。

lua-collectd-monitorは障害復旧機能を提供するcollectdプラグインです。 リモートからリカバリコマンドを受け取って実行したり、ローカルのメトリクスデータをもとにリカバリコマンドを実行できます。

まずはローカル監視機能の導入手順と使い方を説明します。

動作環境について

lua-collectd-monitorはcollectdのLuaプラグインに機能追加してあることを前提としています。 upstreamにはまだフィードバックした内容が取り込まれていないため、パッチをあてたcollectdが必要です。 CentOS 8であれば、パッチを適用済みのパッケージがあるのでそちらを使うのがおすすめです。

Ubuntuを使っている人のためにUbuntu 20.04の導入例を説明します。

  • 必要なパッケージをインストールする
  • lua-collectd-monitorをインストールする
  • 必要に応じてカスタマイズする

必要なパッケージをインストールする

$ sudo add-apt-repository ppa:kenhys/nightly
$ sudo apt-get update
$ sudo apt install lua5.3 liblua5.3-dev luarocks collectd-core libssl-dev make

これで collectd-core 5.9.2.g-1ubuntu5.1がインストールされます。

$ dpkg -l | grep collectd
ii  collectd-core                        5.9.2.g-1ubuntu5.1                amd64        statistics collection and monitoring daemon (core system)

lua-collectd-monitorをインストールする

$ git clone https://github.com/clear-code/lua-collectd-monitor
$ cd lua-collectd-monitor
$ sudo luarocks make

インストールできたら サンプルのcollectd.confをコピーします。

$ sudo cp /usr/share/doc/collectd-core/examples/collectd.conf /etc/collectd/

次に、/etc/collectd/collectd.conf.d/lua-monitor-local.conf を以下の内容で作成します。

LoadPlugin syslog
LoadPlugin memory

<LoadPlugin lua>
    Globals true
</LoadPlugin>

<Plugin syslog>
    LogLevel info
    NotifyLevel OKAY
</Plugin>

<Plugin lua>
    BasePath "/usr/local/share/lua/5.3"
    Script "collectd/monitor/local.lua"
    <Module "collectd/monitor/local.lua">
        MonitorConfigPath "/etc/collectd/monitor/config.json"

        # This option can be placed in above config.json too.
        # If there is same option in both files, config.json's one is applied.
        LocalMonitorConfigDir "/etc/collectd/monitor/local/"
    </Module>
</Plugin>

最後にローカル監視機能をカスタマイズするための設定とリカバリコマンドの雛形をコピーします。

$ sudo cp -r conf/collectd/monitor/ /etc/collectd/

あとはcollectdを再起動すればインストール完了です。

必要に応じてカスタマイズする

lua-collectd-monitorのカスタマイズは次の2つを修正することで行います。

  • 障害復旧対象のサービスの定義
  • メトリクスから障害を検知するためのしきい値を定義

前者は /etc/collectd/monitor/config.json で後者が /etc/collectd/monitor/local/example.lua です。

/etc/collectd/monitor/local以下のスクリプト名は拡張子が.luaであることを除いて任意です。

config.jsonは次のような内容です。

{
  "Host": "localhost:1883",
  "User": "test-user",
  "Password": "test-user",
  "Secure": false,
  "CleanSession": false,
  "ReconnectInterval": 5,
  "QoS": 2,
  "CommandTopic": "test-topic",
  "CommandResultTopic": "test-result-topic",
  "Services": {
    "nginx": {
      "commands" : {
        "restart": "/bin/systemctl restart nginx 2>&1"
      }
    },
    "hello": {
      "commands": {
        "exec": "/bin/echo \"Hello World!\""
      }
    }
  }
}

復旧対象のサービスとしてnginxhelloが登録されています。 また、nginxにはrestartコマンドが、helloにはexecコマンドが定義されていることがわかります。 Services 以外にもいろいろ項目がありますが、それらはリモート監視のための設定項目なので今回は関係ありません。

一方のexample.luaにはプラグインが受け取ったメトリクスを使って、どのサービスを実行するかという定義をしています。

例えば、メモリの空き容量が50MBを下回ったときにnginxを再起動するには次のような定義をします。

local metric_handlers = {
   memory_free_is_under_50MB = function(metric)
      if metric.plugin == "memory" and metric.type_instance == "free" then
         if metric.values[1] <= 50 * 1000 * 1000 then
            return { service = "nginx", command = "restart" }
         end
      end
      return nil
   end
}
local notification_handlers = {
  ...
}

return metric_handlers, notification_handlers

しきい値である50MBを下回った場合に実行するサービスとそのコマンドをペアで返すようになっています。 そうすることで、この場合はnginxというサービスのrestartコマンドが実行される仕組みになっています。

まとめ

今回は障害復旧機能を提供するcollectdプラグインにて、ローカル監視機能を使う方法について説明しました。 機会があれば、もうひとつのリモートコマンドを実行する機能についても解説したいと思います。