【Zabbix】Zabbixサーバの構築_06_サービスの起動と停止

Keepalived

はじめに

前回までの記事で構築までの一連の手順を記載しました。あとは起動するだけですが、サービスの起動の順番を間違えると正常にサービス起動が出来ません。今回構築したZabbixはすべて手動起動を想定しているので、構成を理解していない人が触ると、トラブルにつながることでしょう。
本記事で紹介したZabbixサーバの構成での起動手順を紹介したいと思います。起動した後は、正常に停止する方法も紹介したいと思います。

※本手順にはどのサーバで実施するか記載していませんが、本番稼働用の手順書を作る場合は記載しておくと良いでしょう。

構成図

ホスト名:zabbix-ap01
IP:172.16.1.101
構成:AlmaLinux 9、Zabbix6.0

ホスト名:zabbix-ap02
IP:172.16.1.102
構成:AlmaLinux 9、Zabbix6.0

ホスト名:zabbix-db01
IP:172.16.1.104
構成:AlmaLinux 9、PostgreSQL 13

ホスト名:zabbix-db02
IP:172.16.1.105
構成:AlmaLinux 9、PostgreSQL 13

起動手順

起動の順序は以下の通りです。

1. DBの起動
2. Zabbix関連サービスの起動
3. Keepalivedサービスの起動

それぞれのサービス起動手順を確認します。それぞれのサービス起動時に正常に起動していないと、後続の起動に影響があるので、その都度サービスの起動状況の確認も行います。

DBの起動

DBを起動する場合、Pacemakerのサービスを起動します。直接DBの起動させないよう注意します。
レプリケーションされているか不明な場合、主系からコピーしてから起動させます。本手順では主系から副系にコピーする手順から記載しています。

主系DBの起動確認

主系DBを手動で起動します。当たり前ですが、この時点で起動しなければ、Pacemakerで起動しても失敗します。失敗時に切り分けしやすくするためにも、事前に確認することをおすすめします。

# su - postgres
$ pg_ctl start
done
server started

副系DBへのデータコピー

次に副系にDBをコピーします。すでに同期されている場合は不要ですが、障害発生時から復旧する場合などにはこの手順が必要となります。なお、予め$PGDATAのファイルは削除している必要があるので、実施前に削除しておきましょう。rootユーザで実行しないように注意してください。$PGDATAの所有者がrootになっている場合、DBの起動に失敗します。

# su - postgres
$ pg_basebackup  -D /var/lib/pgsql/13/data -h 172.16.1.104

PacemakerでDBを起動させるため、問題なく副系がコピーされた後に、主系のDBを停止させておきます。

$ pg_ctl stop
waiting for server to shut down.... done
server stopped

なお、このときに副系DBの起動確認は行いません。Pacemakerで起動させてVIPを持たせるため、あくまでも手動で実施するのは「主系のDB起動確認」と「副系へのデータコピー」にとどめます。

PacemakerによるDBの起動

DBのコピーが完了したあと、PacemakerでDBを起動させます。先に起動させた方が主系となるため、起動の順番は運用方針に従って起動させてください。

$ exit
logout
# pcs cluster start
Starting Cluster...

DBの正常性確認

主系を起動した後、副系を起動する前に正常性確認をしておきましょう。主系DBが起動していない状況で副系のみが問題なく起動した場合、主副が逆になります。ポリシーに合わせるために主副を入れ替える必要が出た場合は、余計な作業が出来てしまうので、まずは主系のみで問題なく起動しているかを確認します。

# pcs status --full
Cluster name: zabbixdbCluster
Status of pacemakerd: 'Pacemaker is running' (last updated 2024-06-03 14:21:10 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: zabbix-db01 (1) (version 2.1.5-9.el9_2-a3f44794f94) - partition WITHOUT quorum
  * Last updated: Mon Jun  3 14:21:11 2024
  * Last change:  Mon Jun  3 07:16:14 2024 by root via crm_attribute on zabbix-db01
  * 2 nodes configured
  * 5 resource instances configured

Node List:
  * Node zabbix-db01 (1): online, feature set 3.16.2
  * Node zabbix-db02 (2): OFFLINE

Full List of Resources:
  * vip-master  (ocf:heartbeat:IPaddr2):         Started zabbix-db01
  * Clone Set: pingChk-clone [pingChk]:
    * pingChk   (ocf:pacemaker:ping):    Started zabbix-db01
    * pingChk   (ocf:pacemaker:ping):    Stopped
  * Clone Set: prmPostgresql-clone [prmPostgresql] (promotable):
    * prmPostgresql     (ocf:heartbeat:pgsql):   Promoted zabbix-db01
    * prmPostgresql     (ocf:heartbeat:pgsql):   Stopped

Node Attributes:
  * Node: zabbix-db01 (1):
    * master-prmPostgresql              : 1000
    * pingattr                          : 1
    * prmPostgresql-data-status         : LATEST
    * prmPostgresql-master-baseline     : 00000000480000A0
    * prmPostgresql-status              : PRI

Migration Summary:

Tickets:

PCSD Status:
  zabbix-db01: Online
  zabbix-db02: Online

確認箇所は「Node Attributes」の部分で、「-INFINITY」や「DISCONNECT」値が出てしまっている場合は正常に稼働していない状況です。
問題なく起動できていることを確認したら、副系も同様に起動します。両方とも起動できた場合、以下のような結果になります。

# pcs status --full
Cluster name: zabbixdbCluster
Status of pacemakerd: 'Pacemaker is running' (last updated 2024-06-03 14:39:00 +09:00)
Cluster Summary:
  * Stack: corosync
  * Current DC: zabbix-db01 (1) (version 2.1.5-9.el9_2-a3f44794f94) - partition with quorum
  * Last updated: Mon Jun  3 14:39:00 2024
  * Last change:  Mon Jun  3 14:38:53 2024 by root via crm_attribute on zabbix-db01
  * 2 nodes configured
  * 5 resource instances configured

Node List:
  * Node zabbix-db01 (1): online, feature set 3.16.2
  * Node zabbix-db02 (2): online, feature set 3.16.2

Full List of Resources:
  * vip-master  (ocf:heartbeat:IPaddr2):         Started zabbix-db01
  * Clone Set: pingChk-clone [pingChk]:
    * pingChk   (ocf:pacemaker:ping):    Started zabbix-db01
    * pingChk   (ocf:pacemaker:ping):    Started zabbix-db02
  * Clone Set: prmPostgresql-clone [prmPostgresql] (promotable):
    * prmPostgresql     (ocf:heartbeat:pgsql):   Promoted zabbix-db01
    * prmPostgresql     (ocf:heartbeat:pgsql):   Unpromoted zabbix-db02

Node Attributes:
  * Node: zabbix-db01 (1):
    * master-prmPostgresql              : 1000
    * pingattr                          : 1
    * prmPostgresql-data-status         : LATEST
    * prmPostgresql-master-baseline     : 000000004C000060
    * prmPostgresql-status              : PRI
  * Node: zabbix-db02 (2):
    * master-prmPostgresql              : 100
    * pingattr                          : 1
    * prmPostgresql-data-status         : STREAMING|SYNC
    * prmPostgresql-status              : HS:sync

Migration Summary:

Tickets:

PCSD Status:
  zabbix-db01: Online
  zabbix-db02: Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled

実は本記事を書くために検証環境のDBを起動させた際も、エラーが出て起動できなかったため、ログを追いました。PacemakerかPostgreSQLのログのいずれかにヒントがあると思うので、エラーの際はログを追って解決してみてください。

IP確認

VIPが想定通りに付与されているか確認してみましょう。主系に「172.16.1.103」が付与されています。

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:18:75:9d brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 172.16.1.104/24 brd 172.16.1.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 172.16.1.103/24 brd 172.16.1.255 scope global secondary ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe18:759d/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Zabbix関連サービスの起動

Zabbix関連と書いたのは、Zabbixサーバ以外にもhttpd、php-fpmといったサービスの起動も必要です。
正直DB起動まで問題なくできれば、これ以降のZabbix関連のサービス確認は割と容易にできるかと思います。

Zabbixサーバ、httpd、php-fpm、Zabbixエージェントサービスの起動

以下のコマンドでサービスを起動します。

# systemctl start zabbix-server.service zabbix-agent.service httpd.service php-fpm.service

各サービスの状態確認

以下のコマンドを実行して、アクティブになっていることを確認します。以下はzabbix-server.serviceの確認です。

# systemctl status zabbix-server.service
● zabbix-server.service - Zabbix Server
     Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; disabled; preset: disabled)
     Active: active (running) since Tue 2024-06-04 09:56:28 JST; 6min ago
    Process: 2887 ExecStart=/usr/sbin/zabbix_server -c $CONFFILE (code=exited, status=0/SUCCESS)
   Main PID: 2900 (zabbix_server)
      Tasks: 102 (limit: 11124)
     Memory: 107.2M
        CPU: 1.233s
     CGroup: /system.slice/zabbix-server.service
             tq2900 /usr/sbin/zabbix_server -c /etc/zabbix/zabbix_server.conf
             tq2916 "/usr/sbin/zabbix_server: ha manager"
…

問題なく主系を起動出来たら、副系も起動します。

Zabbix HA の状態確認

先に起動した方がHAのActiveになっています。以下のコマンドで確認します。ap01がactiveになっていることを確認できます。

# zabbix_server -R ha_status
Failover delay: 60 seconds
Cluster status:
   #  ID                        Name             Address                    Status      Last Access
   1. clmdf5vzx00012y0eomes62y2 zabbix-ap01      172.16.1.101:10051         active      0s
   2. clmdg2uxt0001lp0fuu3da1zm zabbix-ap02      172.16.1.102:10051         standby     1s

Keepalivedの起動

最後にKeepalivedサービスを起動します。こちらも起動に順に応じて主副が決定されます。

以下のコマンドで起動します。

# systemctl start keepalived.service

以下のコマンドで起動状態を確認し、アクティブになっているか確認します。

# systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
     Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; preset: disabled)
     Active: active (running) since Tue 2024-06-04 10:04:23 JST; 14s ago
   Main PID: 3427 (keepalived)
      Tasks: 2 (limit: 11124)
     Memory: 6.9M
        CPU: 9ms
     CGroup: /system.slice/keepalived.service
             tq3427 /usr/sbin/keepalived --dont-fork -D
             mq3428 /usr/sbin/keepalived --dont-fork -D

IPも確認しておきましょう。以下は主系で実行した結果です。「172.16.1.100」が付与されています。

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:47:7e:f6 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 172.16.1.101/24 brd 172.16.1.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet 172.16.1.100/32 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe47:7ef6/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

問題なく起動出来たら、副系でも起動します。

これで起動は完了です。ブラウザでZabbixのGUI画面にアクセスできると思います。

停止手順

サービスを停止する手順は以下の通りです。

1. Keepalivedの停止
2. Zabbix関連サービスの停止
3. DBの停止

停止は起動とは逆の順序で、副系を停止後に主系も停止します。当然と言えばそれまでですが、手動起動のシステムを構築した場合は明確にしておきましょう。運用担当者が停止手順を間違えて、起動時にトラブルになることは避けたいところです。

Keepalivedの停止

以下のコマンドで停止します。※副系から先に停止します。

# systemctl stop keepalived.service

起動時と同じコマンドで停止できているか確認します。

# systemctl status keepalived.service
○ keepalived.service - LVS and VRRP High Availability Monitor
     Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; preset: disabled)
     Active: inactive (dead)

Zabbix関連サービスの停止

以下のコマンドで停止します。副系を停止後、主系を停止します。

# systemctl stop zabbix-server.service zabbix-agent.service httpd.service php-fpm.service

同様に、サービスの状態を確認します。

# systemctl status zabbix-server.service
○ zabbix-server.service - Zabbix Server
     Loaded: loaded (/usr/lib/systemd/system/zabbix-server.service; disabled; preset: disabled)
     Active: inactive (dead)

DBの停止

副系のDBを停止します。以下のコマンドを実行します。

# pcs cluster stop
Stopping Cluster (pacemaker)...
Stopping Cluster (corosync)...

停止後、ステータスを確認します。

# pcs cluster status
Error: cluster is not currently running on this node

問題なく停止できた後、主系のDBを停止させます。
主系停止時は「–force」オプションを付与します。

# pcs cluster stop --force
Stopping Cluster (pacemaker)...
Stopping Cluster (corosync)...

以上が起動から停止までの手順です。
同じ構成で構築されていることは少ないかもしれませんが、部分的に活用できる場面があれば幸いです。