序章

NATS は、オープンソースの高性能メッセージングシステムであり、「クラウドの中枢神経系」と呼ばれることがよくあります。 毎秒数百万のメッセージをルーティングできるため、マイクロサービスと IoT (モノのインターネット)デバイスの接続に最適です。

NATSは、PubSubメッセージングシステムです。 この種のシステムでは、1つ以上のパブリッシャーが特定の件名のメッセージをメッセージブローカーに送信し、メッセージブローカーがこれらのメッセージを任意のクライアントまたはサブスクライバーに配信します。 ]与えられた主題の。 出版社は加入者を知らないか、気にかけません。逆もまた同様です。 このアーキテクチャでは、システムの他の部分に影響を与えることなくパブリッシャーとサブスクライバーを追加できるため、システムの拡張と新しい機能の追加が容易になります。 このタイプのシステムは、サーバーとデバイスの監視に最適です。 デバイスはメッセージを送信でき、それらのメッセージをサブスクライブして、電子メールまたはその他の手段で通知を送信できます。

このチュートリアルでは、インストールします gnatsd、公式NATSサーバー、サービスとして、安全な方法でアクセスできるようにします。 また、サーバーの負荷が高くなりすぎたときにメールを送信する基本的なサーバー過負荷警告システムを作成します。 gnatsd そのメッセージブローカーとして。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1—NATSサーバーをダウンロードする

ダウンロードから始めましょう gnatsd サーバーとそれが問題なく私たちのシステムで実行されていることを確認します。

最新の厩舎 gnatsd このチュートリアルが書かれた時点でのリリースはバージョン0.9.4です。 NATSダウンロードページで新しいバージョンを確認し、新しいバージョンを使用する場合は、必要に応じて以下のコマンドを適用できます。

まず、root以外のアカウントでサーバーにログインします。

  1. ssh sammy@your_server_ip

次に、ユーザーのホームディレクトリにいることを確認します。

  1. cd

次に、 wget ダウンロードする gnatsd サーバーへ:

  1. wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip

ダウンロードしたアーカイブは圧縮アーカイブであるため、インストールする必要があります unzip ファイルを抽出します。 あなたはそれをインストールすることができます apt:

  1. sudo apt-get install -y unzip

次に、 unzip 抽出する gnatsd:

  1. unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd

次に、 gnatsd 実行可能ファイルを実行できるようにします。

  1. chmod +x gnatsd

実行できることをテストしましょう gnatsd 現在のディレクトリから実行します。 次のコマンドを使用して開始します gnatsd:

  1. ./gnatsd --addr 127.0.0.1 --port 4222

表示される出力は、次の例のようになります。

Output
[1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4 [1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on 127.0.0.1:4222 [1851] 2016/09/23 05:20:02.248626 [INF] Server is ready

デフォルトでは、 gnatsd ポートでリッスンします 4222 住所 0.0.0.0 これはすべてのインターフェースに対応します。 を使用して --port 引数、あなたはポートを変更することができます、そして --addr リッスンするアドレスを変更できます。 走った gnatsd--addr 127.0.0.1、サーバー内でのみ利用可能であり、外部クライアントからアクセスできないようにします。 チュートリアルの後半で、セキュリティを確保します gnatsd そしてそれを世界に開放します。

プレス CTRL+C 閉鎖すること gnatsd.

物事が機能することがわかったので、より正式な方法で物事を設定しましょう。

ステップ2—ディレクトリ構造と構成ファイルを作成する

Linuxでは、サードパーティのサービス関連ソフトウェアが頻繁に /srv ディレクトリ。 その規則に従い、NATS関連のファイルを /srv/nats. 配置します gnatsd の実行可能ファイル /srv/nats/bin.

まず、を作成します /srv/nats/bin フォルダ:

  1. sudo mkdir -p /srv/nats/bin

次に移動します gnatsd/srv/nats/bin フォルダ:

  1. sudo mv ~/gnatsd /srv/nats/bin

サーバーはファイルから構成をロードできます。これは、チュートリアルの後半でサーバー設定を変更する必要がある場合に役立ちます。 ファイルを作成する /srv/nats/gnatsd.config:

  1. sudo nano /srv/nats/gnatsd.config

そして、次の内容をファイルに追加します。

/srv/nats/gnatsd.config
port: 4222
net: '127.0.0.1'

この構成ファイルは、 gnatsd ポートでリッスンするサーバー 4222 住所 127.0.0.1、以前と同じですが、今回はコマンドラインでこれらのオプションを指定する必要はありません。

サーバーを再度実行して、正しく構成されていることを確認しましょう。 次のコマンドを実行して起動します gnatsd 新しい構成ファイルの使用:

  1. /srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config

出力は、前に見たものと似ています。

Output
[1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4 [1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on 127.0.0.1:4222 [1869] 2016/06/18 05:30:55.989562 [INF] Server is ready

もう一度、を押します CTRL+C 閉鎖すること gnatsd プロンプトに戻ります。 次に、このサービスを実行するユーザーを作成しましょう。

ステップ3—サービスユーザーの作成

サービスが危険にさらされた場合の被害を制限するために、各サービスを独自のユーザーアカウントで実行することをお勧めします。 NATSサービスとNATS関連ファイルを所有するユーザーとグループを作成しましょう。

まず、というシステムユーザーとグループを作成しましょう nats:

  1. sudo adduser --system --group --no-create-home --shell /bin/false nats
Output
Adding system user `nats' (UID 106) ... Adding new group `nats' (GID 114) ... Adding new user `nats' (UID 106) with group `nats' ... Not creating home directory `/home/nats'.

割り当てました /bin/false シェルに nats システムユーザーは、このユーザーのログインを無効にし、ホームディレクトリの作成を抑制します。 また、 nats グループ。

の所有者を変更しましょう /srv ディレクトリへの nats ユーザーとグループ:

  1. sudo chown -R nats:nats /srv

これで、 nats ユーザーとグループ、NATSサービスの作成を続けましょう。

ステップ4—サービスとしてのgnatsdの実行

私たちそうしたい gnatsd システムの起動時に起動し、クラッシュした場合は再起動します。 これを処理するには、systemdを使用します。

systemd は、Linuxシステムのサービスマネージャーです。 起動時にサービスを開始し、必要に応じてサービスを再起動し、システムのシャットダウン時に制御された方法でサービスを停止します。

NATSサービスをいつどのように開始するかを定義するには、サービス構成を作成する必要があります。 ユーザーが作成したサービスファイルは /etc/systemd/system、ファイルを作成します /etc/systemd/system/nats.service:

  1. sudo nano /etc/systemd/system/nats.service

そして、ファイルにこのスクリプトを配置して、方法を定義します gnatsd 起動する必要があります:

/etc/systemd/system/nats.service
[Unit]
Description=NATS messaging server

[Service]
ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
User=nats
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • The [Unit] セクションには、サービスに関する一般的な情報が含まれています。 Description これはサービスについて説明しています。
  • The [Service] セクションには、サービス関連の構成が含まれています。 ExecStart サーバーを実行するコマンドです。 の絶対パスを使用します gnatsd ここで実行可能。 Restart=on-failure これは、サービスがクラッシュしたり、失敗して終了したりした場合に、サービスを再起動する必要があることを意味します。 systemdによって停止された場合、再起動されません。
  • The [Install] セクションには、サービスに関するインストール情報が含まれています。 WantedBy=multi-user.target 開始時にサービスを開始するようにsystemdに指示します multi-user.target. これは、システムの起動時にサービスを開始する一般的な方法です。

サービスの説明を配置したら、次のコマンドでサービスを開始できます。

  1. sudo systemctl start nats

それを確認しましょう gnatsd を送信して実行しています PING メッセージ:

  1. printf "PING\r\n" | nc 127.0.0.1 4222

使用したばかりです nc と通信する gnatsd. nc TCPまたはUDPサーバーと通信するためのコマンドラインユーティリティです。 使用したコマンドは、次のような出力を出力します。

Output
INFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576} PONG

応答 PONG サーバーが期待どおりにリッスンして動作していることを通知します。 NATSサーバーを起動時に起動するには、最後の1つのコマンドを実行する必要があります。

  1. sudo systemctl enable nats

サービスがインストールされたことを確認する次の出力が表示されます。

Output
Created symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.

正常に構成されました gnatsd サービスとして実行します。 それでは、それを保護して、外部クライアントがアクセスできるようにしましょう。

ステップ5—NATSサービスへの接続を保護する

すべてのパブリッシャーとサブスクライバーが一緒に使用したい場合 gnatsd 同じサーバー上で実行された場合、それを完了と呼んで先に進むことができますが、最近はめったにありません。 外部クライアントが接続してメッセージを公開できるようにする必要があります gnatsd 安全な方法で。

gnatsd TLSトランスポートをサポートしているため、これを使用して間の通信を保護します gnatsd およびNATSクライアント。

まず、証明書が必要です。 商用証明書を購入するか、 Let’s Encrypt から証明書を取得するか、自己署名証明書を生成することができます。 証明書の取得はこの記事の範囲外であるため、後者のアプローチを使用します。

証明書を一時的に保持するディレクトリを作成します。

  1. mkdir ~/priv

次に、次のコマンドを使用して自己署名証明書を作成します。

  1. openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  2. -keyout priv/gnatsd.key -out priv/gnatsd.crt \
  3. -subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"

このコマンドは、2048ビットで有効期間が10年のRSA証明書を作成します。 TLS検証を有効にしないため、任意のドメイン名を使用していることに注意してください。 gnatsd この記事のサーバー。

これでファイルができました gnatsd.keygnatsd.crt の中に ~/priv ディレクトリ。 それらのファイルを下に移動しましょう /srv/nats/ ディレクトリ構造なので、すべてが1か所にあります。 次のコマンドを実行します。

  1. sudo mv ~/priv /srv/nats

さあ、 /srv/nats/priv にのみアクセス可能 nats ユーザーとグループ:

  1. sudo chmod 440 /srv/nats/priv/*
  2. sudo chmod 550 /srv/nats/priv
  3. sudo chown -R nats:nats /srv/nats/priv

今、私たちは更新します /srv/nats/gnatsd.config 作成した証明書とキーを含めるため。 構成ファイルを再度開きます。

  1. sudo nano /srv/nats/gnatsd.config

そして、次のセクションを追加して伝えます gnatsd 証明書とキーを使用するには:

/srv/nats/gnatsd.config
. . .

tls {
  cert_file: "/srv/nats/priv/gnatsd.crt"
  key_file: "/srv/nats/priv/gnatsd.key"
  timeout: 1
}

ファイルを保存して、エディターを終了します。 次に、サービスを再起動して、変更を取得できるようにします。

  1. sudo systemctl restart nats

証明書が機能することをテストしてみましょう。 次のコマンドを実行します。

  1. printf "PING\r\n" | nc localhost 4222

今回、コマンドは次のメッセージを出力します。

Output
INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} -ERR 'Secure Connection - TLS Required'

サーバーがメッセージを返しました -ERR 'Secure Connection - TLS Required' これにより、新しい構成が選択され、安全な接続が必要であることが確認されます。 nc 方法がわかりません。

本格的なNATSクライアントをインストールせずにNATSサービスと通信できるようにするために、catnatsというツールを使用します。 最初にダウンロードしましょう:

  1. wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py

そしてそれを実行可能にします:

  1. chmod +x catnats.py

最後に、移動します catnats.py/srv/nats/bin フォルダに名前を変更します catnats:

  1. sudo mv catnats.py /srv/nats/bin/catnats

を使用してNATSサービスと通信できることを確認しましょう catnats、同じを送信することによって PING 以前に送信したメッセージ:

  1. printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

接続が安全であることを示す次の出力が表示されます。

Output
INFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} PONG

通信を保護したので、認証を有効にして、NATSに接続するためにユーザー名とパスワードが必要になるようにします。

ステップ6—認証を要求する

NATSサービスは、デフォルトでは認証を必要としません。 これは、サービスがプライベートネットワークでのみアクセス可能である場合は問題ありませんが、インターネット上でNATSサービスにアクセスできるようにしたいので、認証を有効にする必要があります。 gnatsd ユーザー名とパスワードの認証をサポートしており、簡単に有効にできます。

を開きます /srv/nats/gnatsd.config ファイル:

  1. sudo nano /srv/nats/gnatsd.config

新しいを追加します authorization 資格情報を指定するセクション。 我々は使用するだろう user1 ユーザー名として pass1 このチュートリアルのパスワードとして。 実稼働環境では、より長く、より複雑なパスワードを使用する必要があります。

/srv/nats/gnatsd.config
. . .

authorization {
  user: user1
  password: pass1
}

ファイルを保存してから、の所有者を変更します /srv/nats/gnatsd.confignats システム上の他のユーザーからユーザー名とパスワードを保護するために、そのユーザーが読み取れるようにします。

  1. sudo chown nats /srv/nats/gnatsd.config
  2. sudo chmod 400 /srv/nats/gnatsd.config

次に、サービスを再起動して変更を有効にします。

  1. sudo systemctl restart nats

送信しましょう PING へのメッセージ gnatsd すべてがOKかどうかを確認します。 もう一度、使用します catnats メッセージを送信するには:

  1. printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222

次の出力が表示されます。

Output
NFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} -ERR 'Authorization Violation'

これは、変更が正常に適用されたことを示しており、サービスに接続するために正しいユーザー名とパスワードを送信する必要があります。 今度はユーザー名を入力して、もう一度試してみましょう user1 とパスワード pass1:

  1. printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1

次の出力からわかるように、今回は機能しました。

Output
INFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK PONG

このサービスをユーザー名とパスワードを知っているクライアントに制限したので、外部のクライアントが接続できるようにサービスを再構成できます。

ステップ7—サービスを世界に開く

リッスンするようにNATSサーバーを構成しました 127.0.0.1、これはローカルインターフェイスです。 聞かせたら 0.0.0.0、それからそれは世界に利用可能になります。 更新しましょう /srv/nats/gnatsd.config 最後にもう一度:

  1. sudo nano /srv/nats/gnatsd.config

次に、に関連付けられているIPアドレスを変更します net 設定:

/srv/nats/gnatsd.config
. . .
net: '0.0.0.0'
. . .

ファイルを保存して、サービスを再起動します。

  1. sudo systemctl restart nats

これで、NATSサービスは外部クライアント接続の準備が整いました。 使い方を学ぶために、NATSサーバーをメッセージブローカーとして使用する簡単な監視サービスを作成しましょう。

手順8—(オプション)サーバーの過負荷に関する通知の構成

このセクションでは、NATSサービスを利用する単純な過負荷監視システムを作成します。 システムはサーバーの平均負荷を受信し、いずれかのサーバーが過負荷の場合は管理者に電子メールを送信します。

サンプルプロジェクトは、次のコンポーネントで構成されます。

  • 構成したばかりのNATSサービス。
  • モニター。サーバーのホスト名、負荷平均、およびプロセッサ数を stats.loadaverage 60秒ごとに被験者。 このコンポーネントは、負荷を監視する任意のサーバーで実行する必要があります。
  • 通知機能stats.loadaverage サブジェクトし、サーバーのホスト名、負荷平均、およびプロセッサー数を受け取ります。 ホストの負荷平均が特定のしきい値を超えている場合、通知機能はSMTPサーバーを介して事前定義されたアドレスに電子メールを送信します。

簡単にするために、これらすべてのコンポーネントを同じサーバーで実行しますが、このチュートリアルを完了したら、各コンポーネントを別のサーバーで実行してみることができます。

モニターのセットアップ

Linuxシステムの平均負荷は次の場所から読み取ることができます。 /proc/loadavg. このプロジェクトでは、出力の最初のフィールドである直前の負荷平均のみに関心があります。 このコマンドを使用して、その値を取得します。

  1. cat /proc/loadavg | cut -f1 -d" "

次の出力が表示されます。

Output
0.11

あなたが読むことによって得られる負荷平均 /proc/loadavg プロセッサの数に依存するため、負荷平均をプロセッサの数で割って正規化する必要があります。 次のコマンドを使用して、サーバーのプロセッサ数を取得できます。

  1. getconf _NPROCESSORS_ONLN

ターミナルに結果が表示されます。

Output
1

サーバーのデフォルトシェルは浮動小数点演算を処理できないため、負荷平均とプロセッサ数の両方をホスト名とともにメッセージのペイロードとして送信し、後で通知機能で除算を行います。 ペイロードを作成するために使用するコマンドは次のとおりです。

  1. echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`

このコマンドは、ホスト名、負荷平均、およびプロセッサの数をそれぞれ表示します。

Output
your_hostname 0.28 1

ホスト名、負荷平均、プロセッサ数を件名でNATSサーバーに公開するシェルスクリプトを作成しましょう stats.loadaverage. このスクリプトを定期的に実行するようにシステムを構成します。 と呼ばれる新しいファイルを作成します ~/publish_load_average.sh:

  1. nano ~/publish_load_average.sh

ファイルに、次のスクリプトを追加します。

〜/publish_load_average.sh
NATS_ADDR=127.0.0.1:4222
LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ")
NPROC=$(getconf _NPROCESSORS_ONLN)
SUBJECT="stats.loadaverage"
PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC)
MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n"
printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1

このスクリプトはメッセージを作成し、それをパイプで送信します catnats、メッセージをNATSサービスに公開します。 私たちは走る catnats とともに -q 出力を抑制するスイッチを使用し、 --raw そう切り替える catnats 入力の内容を解釈しようとはしません。 あなたは変更することができます $NATS_ADDR NATSサービスが異なるサーバー上にある場合の変数の値。

スクリプトが負荷平均をNATSに送信することをテストしてみましょう。

次のコマンドが実行されます ~/publish_load_average.sh 5秒ごと。 を使用することに注意してください & バックグラウンドでコマンドを実行するための行末の文字:

  1. while true; do sh ~/publish_load_average.sh; sleep 5; done &

コマンドがプロセスIDでバックグラウンドで実行されていることを示す出力が表示されます。

Output
[1] 14123

:後でコマンドを停止するためにIDを使用する必要があるため、プロセスIDをどこかに書き留めます。

次に、NATSに接続して、サブジェクトをサブスクライブします stats.loadaverage 負荷平均を取得するには:

  1. printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1

を使用します --no-exit 自動終了を無効にするフラグ、および --pong NATSへの接続を維持するため。 すべてが正しければ、5秒ごとに更新される次のような出力が得られるはずです。

Output
INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK +OK MSG stats.loadaverage 0 27 your_hostname 0.08 1

プレス CTRL+C から終了します catnats. 呼び出したループを止めましょう publish_load_average.sh より良い走り方ができるので publish_load_average.sh:

  1. kill 14123

私たちが採用したアプローチはテストには最適ですが、永続的に使用したいものではありません。 システムを実行したい publish_load_average.sh 毎分実行します。 これを実現するために、crontabエントリを追加できます。 Linuxシステムは cron、指定したスケジュールでコマンドまたは「ジョブ」を実行できるシステム。 The crontab コマンドを使用すると、これらのジョブを管理できます。 チュートリアルCronを使用してVPSでタスクを自動化する方法でCronのすべてを学ぶことができます。

新しいエントリを作成するには、次のコマンドを実行します。

  1. crontab -e

上記のコマンドを実行したことがない場合は、エントリを管理するためのテキストエディタを選択するように求める次のプロンプトが表示される場合があります。

Output
no crontab for demo - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/vim.basic 4. /usr/bin/vim.tiny Choose 1-4 [2]:

最も使いやすいエディタに対応する番号を入力して、を押します ENTER. 選択したエディターにファイルが表示されます。

開いたファイルの最後に次の行を追加しますが、それ以外のものを使用した場合はユーザー名に置き換えてください sammy:

*/1 * * * * bash /home/sammy/publish_load_average.sh

上記のエントリは cron 私たちを実行するには publish_load_average.sh 毎分スクリプト。 ファイルを保存して、エディターを閉じます。

次に、負荷平均の定期的な公開が機能していることをテストしましょう。

  1. printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1

数分待つと、表示される出力は次のようになります。

Output
INFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK +OK MSG stats.loadaverage 0 27 your_hostname 0.01 1 MSG stats.loadaverage 0 27 your_hostname 0.00 1

プレス CTRL+C 出る catnats.

モニターのセットアップに成功し、NATSサーバーにメッセージを送信しています。 次に、このデータを利用する通知機能を設定します。

通知機能の作成

NATSサービスに接続してリッスンする通知機能を作成しましょう stats.loadaverage メッセージ。 プログラムがメッセージを受信するたびに、プロセッサごとの平均負荷が計算されます。 0.6、つまりプロセッサあたりのCPU使用率が60%を超える場合は、メッセージを公開したホストに警告フラグを設定し、事前定義されたアドレスに電子メールを送信します。 プロセッサあたりの平均負荷が0.4未満の場合、ホストの警告フラグはクリアされます。 受信トレイのフラッディングを防ぐために、警告フラグが設定されている場合は1通のメールを送信します。

Node.js用の優れたNATSクライアントがあるため、Node.JSを使用して通知機能を作成します。 したがって、最初にNode.jsをインストールします。

  1. sudo apt-get install -y npm

次に、通知機能のディレクトリを作成し、それに切り替えます。

  1. mkdir ~/overload_notifier && cd ~/overload_notifier

Node.jsプロジェクトは、というファイルを使用します package.json プロジェクトとその依存関係に関する情報が含まれています。 次のコマンドを実行して、そのファイルを作成します。

  1. npm init -y

次に、Node.js用のNATSクライアントと nodemailer このプロジェクトで警告メールを送信するために使用するモジュール:

  1. npm install [email protected] [email protected] --save-exact

これで、通知機能を作成できます。 ファイルを作成する notifier.js:

  1. nano notifier.js

次に、次のコードをファイルに追加します。

notifier.js
var NATS_URL = 'nats://127.0.0.1:4222';
var NATS_USER = 'user1';
var NATS_PASS = 'pass1';
var EMAIL_TO = '[email protected]';

これらのオプションは、NATSサービスのユーザー名とパスワード、および電子メールアドレスと一致するように変更してください。

次に、このコードを追加してNode.js NATSクライアントをインポートし、に接続します gnatsd サービス:

notifier.js
var tlsOptions = {
  rejectUnauthorized: false,
};
var nats = require('nats').connect({url: NATS_URL,
                                    tls: tlsOptions,
                                    user: NATS_USER,
                                    pass: NATS_PASS});

次に、このコードを追加してメーラーを設定し、電子メールを送信するSMTPサーバーに接続します。 このサーバーはまもなくセットアップされます。

notifier.js
var nodemailer = require('nodemailer');
var transport = nodemailer.createTransport('smtp://localhost:2525');

次に、残りのコードを追加して負荷平均を計算し、通知メールを送信する必要があるかどうかを判断します。

notifier.js
// keep the state of warnings for each host
var warnings = {};

function sendEmail(subject, text) {
    transport.sendMail({
        to: EMAIL_TO,
        subject: subject,
        text: text
    });
}

function processMessage(message) {
    // message fields: host load processor_count
    var fields = message.split(" ");
    var host = fields[0];
    var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]);
    if (loadAverage > 0.6) {
        if (!warnings[host]) {
            // send warning email if one wasn't already sent
            var res = sendEmail('Warning! Server is Overloaded: ' + host,
                                'Load average: ' + loadAverage);
            // set warning for the host
            warnings[host] = true;
        }
    }
    else if (loadAverage < 0.4) {
        if (warnings[host]) {
            // clear the warning
            warnings[host] = false;
        }
    }
}

nats.subscribe('stats.loadaverage', processMessage);

私たちはメッセージを購読し、メッセージを受信するたびに実行します processMessage 送信したペイロードを解析し、負荷平均を決定する関数。 高すぎる場合は、メッセージを送信し、ホスト名に基づいてフラグを設定することにより、以前にメッセージを送信したかどうかを追跡します。 このようにして、ホストごとに通知を追跡できます。 負荷平均がしきい値を下回っている場合は、そのフラグをクリアします。

モニターと通知機能を配置したら、サンプルプロジェクトをテストします。

プロジェクトのテスト

これを試乗してみましょう。 人工的な負荷を生成し、負荷が高くなりすぎたときに通知メールが警告メールを送信するかどうかを確認します。

インストールしましょう stress サーバーにCPU負荷を生成するツール:

  1. sudo apt-get install -y stress

次に、通知機能からメッセージをメールで送信するようにSMTPサーバーを設定する必要があります。 本格的なSMTPサーバーのインストールと構成は、このテストではやり過ぎになるため、実際に送信するのではなく、渡された電子メールを表示するだけの単純なSMTPサーバーを使用します。 Pythonプログラミング言語には DebuggingServer 受信した電子メールを破棄するモジュールをロードできますが、確実に機能するように画面に表示します。 PythonはすでにUbuntuサーバーにインストールされているため、これは完璧なソリューションです。

SMTPサーバーのデバッグをバックグラウンドで開始しましょう。 聞いてもらいます localhost ポート 2525、これは、で構成したSMTPアドレスと一致します notifier.js コード。 次のコマンドを実行して、SMTPサーバーを起動します。

  1. python -m smtpd -n -c DebuggingServer localhost:2525 &

次に、次のコマンドを使用して、バックグラウンドで通知機能を開始します。

  1. nodejs ~/overload_notifier/notifier.js &

最後に、サーバーのすべてのプロセッサに負荷をかけましょう。 を実行します stress 次のオプションを指定したコマンド:

  1. stress --cpu $(getconf _NPROCESSORS_ONLN)

数分後、SMTPサーバーが通知機能によって送信されたメッセージの表示を開始すると、次のような出力が表示されます。

Output
---------- MESSAGE FOLLOWS ---------- Content-Type: text/plain To: [email protected] Subject: Warning! Server is Overloaded: your_hostname Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost> X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/; SMTP/2.5.0[client:2.5.0]) Content-Transfer-Encoding: 7bit Date: Sun, 19 Jun 2016 16:47:02 +0000 MIME-Version: 1.0 X-Peer: 127.0.0.1 Load average: 0.88 ------------ END MESSAGE ------------

これにより、サーバーの負荷が高くなりすぎたときにメールを正常に送信したことがわかります。

プレス CTRL+C 負荷の生成を停止します。 これでサンプルプロジェクトが完了し、自分の環境でこれを機能させる方法がわかったはずです。

結論

この記事では、NATS PubSubメッセージングシステムについて学び、サービスとして安全な方法でインストールし、サンプルプロジェクトでテストしました。 サンプルプロジェクトではNode.JSクライアントを使用しましたが、NATSには、NATSダウンロードページにリストされているより多くの言語とフレームワークのクライアントがあります。 NATSの詳細については、公式ドキュメントをご覧ください。