Zabbix 6.0 の新機能紹介 – Zabbix サーバの HA 機能

本記事では 2022 年 02 月 15 日にリリースされた Zabbix の最新メジャーバージョン 6.0 で新しく追加された Zabbix サーバの HA 機能を紹介します。

はじめに

監視を行う際に監視システム自体の障害による監視のダウンタイムを避けるためには、監視システムの HA クラスタ化を検討する必要があります。
Zabbix についても Zabbix サーバが障害によって停止した場合に備えて、Zabbix サーバの HA クラスタを構築することは有効です。
しかしながら今までは Zabbix サーバを HA クラスタ化するには、サードパーティ製のクラスタソフトウェアを利用する必要がありました。
これは Zabbix に加えてクラスタソフトウェアの専門知識、クラスタソフトウェア自体の保守や運用も必要ということであり、それだけ管理者のコストも必要でした。

これに対して Zabbix 6.0 では新たに Zabbix サーバの HA 機能が実装されました。
これによってサードパーティ製のクラスタソフトウェアを利用することなく、簡単に Zabbix サーバの HA クラスタを構築することが可能になりました。
管理者にとっても Zabbix の知識のみで運用でき、コストの削減も期待できます。
また、Zabbix サーバの HA クラスタが Zabbix によって公式にサポートされるということでもあります。

それでは、この Zabbix サーバの HA 機能について詳しく解説します。

HA 機能の仕組み

Zabbix サーバの HA 機能ではアクティブ – スタンバイタイプの HA クラスタを構築することができます。
HA クラスタ内の各 Zabbix サーバノードは 1 つのデータベースを共有します。
各 Zabbix サーバノードは定期的にデータベースへハートビートを送信し、各ノードのステータスはハートビートを介してデータベースで保存、管理されます。

アクティブノードからのハートビートが障害などで途切れた場合、自動的にフェイルオーバを実行し、スタンバイノードがアクティブに切り替わります。

もう少し詳しく HA 機能の仕組みについて見ていきましょう。

Zabbix 6.0 では HA 機能を管理するために Zabbix サーバに ha manager プロセスが追加されました。
アクティブの Zabbix サーバでは従来どおりの poller や history syncer プロセスに加えて ha_manager プロセスが起動し、スタンバイの Zabbix サーバでは ha manager プロセスのみが起動します。
ha_manager プロセスは 5 秒おきにデータベースとハートビートを送信し、自身のステータスの更新や他のノードのステータスを監視します。
各ノードのステータスはデータベースの ha_node テーブルで保存、管理されます。

zabbix=# SELECT * FROM ha_node;
         ha_nodeid         |       name       |     address     | port  | lastaccess | status |       ha_sessionid        
---------------------------+------------------+-----------------+-------+------------+--------+---------------------------
 ckvupihk70001z8mkpw5cg0u3 | Zabbix server #1 | 133.137.175.61  | 10051 | 1653964575 |      0 | cl3tjsx0d0000p0mkkof1b7c9
 ckvupsmeq0001egpvksl6c5ih | Zabbix server #2 | 133.137.175.28  | 10051 | 1653964578 |      3 | cl3tjscy60000znmnysggiatm
 cl3s9qntb0001d1nxhiyzm0v4 | Zabbix server #3 | 133.137.175.151 | 10051 | 1653959870 |      1 | cl3saak030000h0nxf4ngf26k

ha manager プロセスはハートビートによってアクセスした時刻を更新し、アクティブノードのアクセス時刻が規定時間 (デフォルト 1 分) 以上更新されていない場合は障害と判断し、フェイルオーバを実行します。

Zabbix サーバノードは HA 機能の監視のためにデータベースとのみ通信し、データベースとの接続が切れた場合にはスタンバイに切り替わるため、通信断によりスプリットブレインが発生する心配はありません。

HA クラスタの設定

Zabbix サーバの HA 機能を理解したところで、さっそく設定方法について解説します。

Zabbix サーバの HA 機能を有効にする方法は非常にシンプルです。
Zabbix サーバおよびフロントエンドの設定ファイルでいくつかのパラメータを設定するだけで簡単に HA クラスタを構築することができます。

Zabbix サーバの設定

Zabbix サーバでは設定ファイル (/etc/zabbix/zabbix_server.conf) に追加された以下の 2 つのパラメータを設定します。

  • HANodeName
  • NodeAddress

HANodeName には HA クラスタ内での Zabbix サーバのノード名を指定します。
このパラメータを指定することで Zabbix サーバは HA モードで動作するようになり、ha_manager プロセスが起動します。
注意点として、このノード名はクラスタ内で一意である必要があります。

## Option: HANodeName
#       The high availability cluster node name.
#       When empty, server is working in standalone mode; a node with empty name is registered with address for the frontend to connect to.
#
# Mandatory: no
# Default: 
# HANodeName=
HANodeName=Zabbix server #1

NodeAddress には Zabbix サーバの IP アドレスまたは DNS 名を指定します。
このパラメータは Zabbix のフロントエンドが現在のアクティブとして動作している Zabbix サーバを判別するために使用されます。

## Option: NodeAddress
#       IP or hostname with optional port to specify how frontend should connect to the server.
#       Format: <address>[:port]
#       This option can be overridden by address specified in frontend configuration.
# 
# Mandatory: no
# Default: NodeAddress=localhost:10051
NodeAddress=133.137.175.61

これら 2 つのパラメータを設定し Zabbix サーバを再起動することで、Zabbix サーバが HA クラスタに組み込まれます。
また、同じクラスタに組み込む Zabbix サーバは全て同じデータベースに接続するように設定する必要があることを忘れないでください。

Zabbix フロントエンドの設定

Zabbix フロントエンドでは設定ファイル (/etc/zabbix/web/zabbix.conf.php) の以下の 2 つのパラメータをコメントアウトします。

  • $ZBX_SERVER
  • $ZBX_SERVER_PORT
// Uncomment and set to desired values to override Zabbix hostname/IP and port.
// $ZBX_SERVER                  = '';
// $ZBX_SERVER_PORT             = '';

これによって、フロントエンドはアクティブの Zabbix サーバの情報をデータベースから取得し、通信を行うようになります。

Zabbix サーバノードのステータスと確認方法

HA クラスタ内の各 Zabbix サーバノードの状態の定義を以下に示します。

ステータス 説明
アクティブ 現在アクティブとして動作している Zabbix サーバノード
スタンバイ 現在スタンバイとして動作している Zabbix サーバノード
停止中 現在停止中の Zabbix サーバノード
利用不可 障害などでクラスタから切り離された Zabbix サーバノード

通常アクティブノードはクラスタ内に 1 台のみ、スタンバイノードは 1 台以上が存在します。
アクティブノードが停止または利用不可となった場合、スタンバイノードが自動的にアクティブとなり監視を引き継ぎます。
「停止中」は正常に Zabbix サーバが停止された状態、「利用不可」はネットワークの問題や Zabbix サーバの障害などでノードからのハートビートが途切れた状態です。

現在の HA クラスタや各ノードのステータスを確認する方法はいくつかあります。

システム情報

フロントエンドの「レポート」⇒「システム情報」ページでは HA クラスタの有効/無効、フェイルオーバが発生するまでの遅延時間、クラスタ内のノード一覧を確認することができます。
ノード一覧ではノード名、アドレス、ハートビートによる最終アクセスからの時間、現在のステータスが表示されます。

「システム情報」ウィジェットでは既存のシステム全体の情報にクラスタのステータスが追加されて表示されるようになりました。

また、ウィジェットの設定の「表示」で「HA ノード」を選択することでノード一覧を表示させることも可能です。

ha_status ランタイムコマンド

Zabbix server のランタイムコマンドに HA クラスタのステータスを返す ha_status コマンドが追加されました。
このコマンドを実行することにより、標準出力および Zabbix サーバのログに HA クラスタのステータスが表示されます。
表示される内容の例を以下に示します。

# zabbix_server -R ha_status
Failover delay: 60 seconds
Cluster status:
   #  ID                        Name                      Address                        Status      Last Access
   1. ckvupihk70001z8mkpw5cg0u3 Zabbix server #1          133.137.175.61:10051           active      3s
   2. ckvupsmeq0001egpvksl6c5ih Zabbix server #2          133.137.175.28:10051           standby     3s
   3. cl3s9qntb0001d1nxhiyzm0v4 Zabbix server #3          133.137.175.151:10051          stopped     1m 7s

ha_status ランタイムコマンドはアクティブノードでしか実行できないのでご注意ください。

zabbix[cluster,discovery,nodes] インターナルアイテム

Zabbix 6.0 より新しく追加された Zabbix インターナルタイプのアイテム zabbix[cluster,discovery,nodes] でも、各ノードの情報を取得することができます。
情報は JSON 形式で取得されます。
以下に取得される情報の例を示します。

[
  {
    "id":"ckvupihk70001z8mkpw5cg0u3",
    "name":"Zabbix server #1",
    "status":3,
    "lastaccess":1654749768,
    "address":"133.137.175.61:10051",
    "db_timestamp":1654749771,
    "lastaccess_age":3
  },
  ...
]

例えばこのアイテムをローレベルディスカバリで利用して、各ノードのステータスや最終アクセス時刻を監視することもできます。
各キーの意味を以下に示します。

キー 説明
id ノード ID
name ノード名
status ノードのステータス
– 0: スタンバイ
– 1: 停止中
– 2: 利用不可
– 3: アクティブ
lastaccess ハートビートによる最終アクセス時刻 (Unixtime 形式)
address ノードの IP アドレスまたは DNS 名とポート番号
db_timestamp 現在時刻 (Unixtime 形式)
lastaccess_age ハートビートによる最終アクセス時刻からの経過時間 (秒)

HA クラスタの操作

アクティブノードの手動切り替え

アクティブノードを手動で切り替えたい場合には、アクティブノードの Zabbix サーバを通常どおり停止させます。

# systemctl stop zabbix-server

これによって、スタンバイノードの内の 1 台が自動的にアクティブノードに切り替わります。
スタンバイノードが複数ある場合、アクティブに切り替わるノードを指定することはできません。
特定のノードをアクティブに切り替えたい場合は、そのノードのみをスタンバイ、その他のノードを停止状態にしてから、アクティブノードを停止させてください。

ノードの削除

ノードを HA クラスタから削除したい場合には、ha_remove_node ランタイムコマンドを削除したいノード名を指定して実行します。
削除するノードは予め Zabbix サーバを停止しておいてください。

# zabbix_server -R ha_remove_node="Zabbix server #3"
Removed node "Zabbix server #3" with ID "cl3s9qntb0001d1nxhiyzm0v4"

このランタイムコマンドもアクティブノードでのみ実行が可能です。

フェイルオーバ遅延時間の設定

アクティブノードからのハートビートが途切れてからフェイルオーバが発生するまでの遅延時間を、ha_set_failover_delay ランタイムコマンドにより設定することができます。

# zabbix_server -R ha_set_failover_delay=30s
HA failover delay set to 30 seconds

デフォルトは 1 分、設定できる範囲は 10 秒から 15 分です。
設定値はデータベースに保存され、全てのノードに即時かつ永続的に適用されます。

この「フェイルオーバの遅延時間」の設定は、アクティブノードの障害によりハートビートが確認できなくなった場合に適用されます。
手動でアクティブノードを停止させた場合には、遅延時間なく即座にフェイルオーバが発生します。

このランタイムコマンドもアクティブノードでのみ実行が可能です。

Zabbix エージェントおよびプロキシの設定

Zabbix エージェントの設定

Zabbix エージェントはクラスタ内のどの Zabbix サーバノードからの通信も受け入れられるように設定する必要があります。
そのために、Zabbix エージェントの設定ファイル (/etc/zabbix/zabbix_agentd.conf) の Server パラメータに、各 Zabbix サーバノードの IP アドレスまたは DNS 名をカンマ区切りで指定します。

Server=133.137.175.61,133.137.175.28,133.137.175.151

これで Zabbix エージェントは指定したどの Zabbix サーバノードがアクティブになったとしても、各ノードからの通信を受け入れることができます。

同様に、Zabbix エージェントから Zabbix サーバへのアクティブタイプの通信についても、全ての Zabbix サーバノードに送信するように設定する必要があります。
具体的には、ServerActive パラメータに各 Zabbix サーバノードをセミコロン区切りで指定します。

ServerActive=133.137.175.61;133.137.175.28;133.137.175.151

これによって、Zabbix エージェントは指定した各 Zabbix サーバノードから現在アクティブになっているノードを探索し、そのノードとのみ通信します。

注意点として、ServerActive パラメータでのセミコロン区切りによる設定は Zabbix エージェント 6.0 から有効です。
Zabbix サーバの HA 機能を利用してアクティブタイプの監視を行いたい場合には、監視対象の Zabbix エージェントも 6.0 へバージョンアップしてください。
それ以前のバージョンの Zabbix エージェントの場合、従来通りカンマ区切りで複数の Zabbix サーバへアクティブ通信を行うこともできますが、その場合 Zabbix エージェントは指定された各 Zabbix サーバを独立したサーバと認識し、それぞれ個別に監視結果を送信するため、Zabbix サーバの切り替わりの際に監視結果の重複などが発生します。

Zabbix プロキシの設定

Zabbix プロキシの設定についても、Zabbix エージェントの設定と同様です。
パッシブモードの Zabbix プロキシでは Zabbix プロキシの設定ファイル (/etc/zabbix/zabbix_proxy.conf) の Server パラメータに各 Zabbix サーバノードの IP アドレスまたは DNS 名をカンマ区切りで指定します。

Server=133.137.175.61,133.137.175.28,133.137.175.151

アクティブモードの Zabbix プロキシの場合は、Server パラメータにセミコロン区切りで指定します。

Server=133.137.175.61;133.137.175.28;133.137.175.151

Zabbix プロキシは Zabbix サーバと同一メジャーバージョンである必要があるため、Zabbix プロキシも 6.0 を利用してください。

その他の注意点

本機能には Zabbix サーバの利用するデータベースの HA は含まれていません。
データベースを HA クラスタ化したい場合には、従来通りサードパーティ製のクラスタソフトウェアなどを利用する必要があります。
もちろん Zabbix サーバについてもこれまで通りサードパーティ製のクラスタソフトウェアを利用して HA クラスタを構築することは可能です。

SNMP などの監視については、監視対象側で全ての Zabbix サーバノードと通信ができるように設定してください。

監視対象との間にあるファイアウォールについても、全ての Zabbix サーバノードとの通信ができるように設定してください。

まとめ

本記事では Zabbix 6.0 で実装された Zabbix サーバの HA 機能について解説しました。
この機能を利用することで、簡単に Zabbix サーバの HA クラスタを構築することができます。
現在は Zabbix サーバのみの対応ですが、今後リリースされるメジャーバージョンで Zabbix プロキシの HA 機能も実装される予定となっています。
Zabbix の HA クラスタを利用しているまたは利用を検討する際には、この Zabbix サーバの HA 機能を試してみてください。

 

【SRA OSS 主催】Zabbix 6.0新機能解説セミナー
~ 注目の機能 Zabbix HA を詳しく ~(Webinar)

Zabbix サーバの HA 機能については、2022年6月24 日(金)無料セミナーでも詳しく解説しますので、是非ご参加ください。

詳細は、こちら