「Web三層構造」を知識としてではなく、きちんと理解できていますか？？【Zabbixクイズ】

どうも。札幌のふーみんと申します。

皆さん、「**Web三層構造**」ご存じですか？

**「舐めんなよあぁん？」** と思った方、素晴らしい。

では質問を変えます。（Zabbixユーザー向けのクイズです）

**＃状況**
・Zabbixサーバーでアラートが大量にボンボカ発生し、送信待ちアラートは2000件以上です。
・サーバー構成はZabbixサーバー１台とDBサーバー１台。
・一旦滞留した障害の通知は諦め、DBサーバーにログインし障害アクションのステータスを「0 - message not sent」から、「2 - failed after a number of retries」に書き換えました。
・送信待ちアラートの件数は0件となった。

が、しかし、

Zabbixサーバーがまだ2000件のアラートを処理しようと通知をし続けています。

**＃質問**
次に、何をすればZabbixサーバーからの通知を止めることができますか？


これに「**はぁ？簡単じゃん**」と答えられる方、本当に素晴らしい。
あなたにはこの記事の内容は必要ないので、今すぐタブを閉じてください。さようなら。

![s0075_15_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/ee93de6f-e87f-d1f6-f672-0bb0e7615ecc.png)


さて、ここに残ったあなた。

しかも、**Web三層構造は何かを知っているにも関わらずさっきの質問に答えられなかった方**は、も少しお付き合いください。

筆者の私もまったく同じ、Web三層構造自体はもちろん知っているが、実際に先ほどの問題のような状況になった時にどう対処すればよいかわからなかった、知識だけ入れて分かった気になっていた者です。

**この記事を読めば、Web三層構造という単なる知識から、実践的な理解へとつながると思います。**

## Web三層構造のおさらい
Web三層構造とは、Webアプリケーションを構成する際に、機能や役割を3つの層に分けて管理する方法で、各層にサーバーを配置します。

- プレゼンテーション層のWebサーバ
- アプリケーション層のAPサーバ
- データ層のDBサーバ

※1つのサーバーで複数サーバの役割を担うこともできます。
　詳しく理解したい人は「@mi-1109」様の記事を読んでください。（画像下リンク）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/d433fc4d-a02a-6c76-1a07-20022ff280bb.png)
引用：https://qiita.com/mi-1109/items/a8e5cfa0637ba2925b59

## Zabbixのサーバー構成
Zabbixサーバーでよくある構成は、
WebサーバとAPサーバの機能を備えた「Zabbixサーバ」、
データを溜めておく「DBサーバ」の二つのサーバーで構成されることが多いです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/5746075f-ecb3-f907-1cbd-ed1e010eda0d.png)


## 問題の解説
問題では、障害が大量に検知され、2000件以上のアラートが通知されようとしていました。
いっぺんに2000件のメール通知をできるハイスペックならまだしも、一気に障害を検知した場合は送信待ちアラートとして処理が滞留します。

サーバーの負荷を抑えるために、溜まった2000件の障害のアラート通知は諦め、送信失敗の状態に変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/1de8ceb2-b90a-58ca-978b-476968d58e5e.png)


問題文の「障害アクションのステータスを「0 - message not sent」から、「2 - failed after a number of retries」に書き換えました。」

とは、DBサーバに対し、「その通知もう送らなくてもいいよ」と指示をするということです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/b7e1b5b7-d2c3-a2fc-c3e1-13365ec2c7a6.png)


:::note info
[Zabbixドキュメント](https://www.zabbix.com/documentation/4.0/en/manual/api/reference/alert/object)より
Possible values for message alerts:
0 - message not sent.
1 - message sent.
2 - failed after a number of retries.
3 - new alert is not yet processed by alert manager.
:::


なのになぜZabbixはメール通知をやめないかというと、
**Zabbixサーバーはその指示を知らないからです。**

障害アクションのステータスを変更したことを知っているのは**DBサーバーだけで、
Zabbixサーバー（Web、APサーバ）の方は何も知らされていないんですよ。**

そりゃ知るわけねぇって話ですよ。
だってZabbixサーバーとDBサーバーは**物理的に別々の場所にあるんですから。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/3177d722-ca8b-e6f0-3335-151e41f0a0e6.png)


その為、Zabbixサーバーにも「その通知もう送らなくてもいいよ」と伝えてあげる必要があります。

既にアクションが動いてしまっているZabbixで言うと、
その指示は、ZabbixServerプロセスの再起動がそれにあたります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3148337/f38db225-7c44-5185-70ea-fd425cd9ac7d.png)


冒頭の質問、
「次に、何をすればZabbixサーバーからの通知を止めることができますか？」
に対する答えは、
**「ZabbixServerプロセスの再起動する。」** でした。


普段からZabbixや三層構造のシステムをサーバー側から操作している方にとっては超～～～当たり前のことかもしれませんが、
私みたいなヘナチョコZabbixユーザーでは、この知識としてではなく理解としてのインプットが必要だった（アウトプットが足りていなかった）というお話です。

この記事が誰かの理解の助けになれば幸いです。

読んでいただきありがとうございました。