朝日ネット 技術者ブログ

朝日ネットのエンジニアによるリレーブログ。今、自分が一番気になるテーマで書きます。

SmokePingのMaster/Slaveを、もくもくと設定する

お前は誰?

はじめまして、朝日ネットのkenji-as4685と申します。
現在は、今年の4月から新設された『サービス基盤部』という部署に所属しており、 主にネットワークの回線サービス(PPPoE/IPoE)のサービスレベルの定義、サービス品質の可視化を担当しております。

で、なに書くの?

4月の異動より、ネットワークのサービスレベルの(再)定義と、可視化を上司より言い渡されまして、 でもネットワークの品質といえば、やはり『パケットロス』と『遅延』が一番わかりやすい、ということもあり、 また、過去に所属した会社でSmokePingによる可視化を行っていたので、朝日ネット版SmokePing導入の話を書きたいと思います。

なお、SmokePingは現在、単純にインストールだけならyumやaptコマンドで出来ます。また、基本的な設定は、日本語で書かれている多数のブログ情報もいろいろありますが、しかしながら、特に、SmokePingの有用な機能のひとつ『Master/Slave』は、日本語の情報が少ないので、せっかくなのでこちらで紹介させていただければと考えました。

SmokePingってなに?

公式サイト:https://oss.oetiker.ch/smokeping/
SmokePingは、MRTGの開発者としても有名なTobias Oetiker さんがOSSとして公開しているネットワーク品質可視化ツールになります。パケットロス、およびRTT(遅延)の状況を、お馴染みのMRTGのようなグラフで可視化を簡単にしてくれるツールです。 パケット往復時間の遅延の『ゆらぎ(ジッタ?)』を、縦軸で黒く表示するようになっていて、その煙っぽい見た目で、『Smoke』と呼んでいる。。。と思われます(?)
基本的な設定は、公式サイト、および日本語のブログでも多数ありますので、検索して参照いただければと思います。

で、SmokePingでなにしたいの?

弊社は、昔からのPPPoEのインターネット接続サービス(IPv4)、また最近では、IPoEによるIPv6インターネット接続サービスを提供しております。
フレッツによるインターネット接続サービスは、弊社のネットワーク機器の障害はもちろん、NTT側の障害、また回線の輻輳などで品質が低下(業界では劣化ともいう)が発生します。この品質低下を、できる限り細かい時間で、且つリアルタイム、且つ過去一定期間に遡って可視化することを目指しました。
また、監視に用いるサーバ側に近い場所での障害が発生すると、全体の品質測定に影響を及ぼしてしまいますので、監視サーバを複数、また、朝日ネットの外部に置くことで、品質測定の冗長化を図ることを考えました。

したがって、要件は以下となります

  1. Pingによる、PPPoEの品質測定。pingの測定先は、NTTの各県の網終端装置1(朝日ネットは全国展開のため、対象は数百台にのぼる)
  2. ping6による、IPoE回線の品質測定。対象は、NTT東日本、西日本それぞれで10回線程度を確保(IPoEは、PPPoEと違い、各都道府県の網終端装置での終端という概念が無いため、実際の開通済みの回線の一部をピックアップして監視対象としています)
  3. 朝日ネットのネットワークの外部から、複数の監視サーバで品質測定を行う。
  4. 他、モニタリングしていると『素敵なサムシング(?)』を得られる宛先にポーリング。

具体的な例として、以下のグラフは、当社の本社(東京都中央区、歌舞伎座タワー21階)の会議室等に、ご来訪頂いたお客様向けに提供しているIPoE回線に対して、外部の2拠点からの、IPv6のパケットロスとRTTの状況を表しています。
今回、外部の監視サーバとして、東京と大阪でクラウドサービスを提供されている会社様のVPSサービスを、東京大阪それぞれ1台契約してSmokePingを実行しております。。
上のグラフが、東京のVPSから。下のグラフが、大阪のVPSからの結果となります。 グラフの下部の、『"probe:5 IPo6-ICMP Echo Pings (56 Bytes) every 30s"』という記載は、『30秒サイクルで、サイクル毎に5回のICMPv6(IPv6のping)の実行結果』を意味します。
また、大阪側のほうが遅延の数値が大きいのは、物理的な距離が遠いためとなります。2
※RTTが縦に触れているのは、会議室用ということでSOHO用途のルータのためであり、ご了承ください(汗)

f:id:kenji-as4685:20190914193049p:plain

SmokePingのMaster/Slaveってなに?

公式サイト:https://oss.oetiker.ch/smokeping/doc/smokeping_master_slave.en.html

今回の要件のうち、『朝日ネット外部から、複数の監視サーバで品質測定を行う』については、ほぼ同じ設定のSmokePingを複数立ち上げることになります。
これは、Master/Slaveの機能を使うほうが簡単です。この機能は、端的にいえば、設定ファイルをMasterのみで一元化し、SlaveはMasterの設定を受け取ってMasterの代わりにポーリングする動作となります(Active/Standbyではありません)

Master/Slaveの動作のために必要な設定は、簡単に言えば以下となります。

その1. Master側に、Slaveの定義と、設定のやり取りをするための『secret』ファイルの配置。
内容は、"Slaveサーバの名前:秘密の言葉"となります。今回の場合は以下のような感じです。

<東京リージョンVPSのFQDN>:himitsu
<大阪リージョンVPSのFQDN>:himitsu

その2.『 Slavesセクション』にて、Slaveサーバの定義
以下のように記載します。(override以下は、基本的には不要です3

*** Slaves ***
secrets=/etc/smokeping/smokeping_secrets

+ <東京リージョンVPSのFQDN>
display_name = Tokyo
location = Tokyo
color = ff0000
++override
Probes.FPing.mininterval = 0.001
Probes.FPing6.mininterval = 0.001

+ <大阪リージョンVPSのFQDN>
display_name = Osaka
location = Osaka
color = 00ff00
++override
Probes.FPing.mininterval = 0.001
Probes.FPing6.mininterval = 0.001

その3. 『Targetセクション』の中で、Slaveにもポーリングさせたい宛先に、Slaveの定義を行う
Targetセクションで、以下のように記載します。
今回は、『IPoE-EAST』のTargetすべてについて、Slaveの定義、および、Masterからはポーリングしない設定を行っております。 複数設定する際は、間はスペースで問題ありません。 また、IPv6回線なので、probeは、fping6(fpingのipv6)を指定します。

*** Targets ***

+ IPoE-EAST

probe = FPing6
slaves =  <東京リージョンVPSのFQDN> <大阪リージョンVPSのFQDN>
nomasterpoll = yes

++ Kabukiza-AsahiFree

menu = 歌舞伎座AsahiFree
title = 歌舞伎座AsahiFree
host = 2405:6580:xxxx:xxxx::xxxx <---IPv6アドレスはマスクしています、ご了承ください。

<以下に、他の、IPoE回線のTargetとする宛先を記載する>

なお、Master/Slaveの連携は、Slaveが、Master側のsmokeping.cgiを叩くことで実現しています。

Master/Slaveにすると嬉しくなるメリットは以下。

  1. Target設定の管理がMasterのみで済む。
  2. Slave側のサーバは、測定結果を永続的に持たないでよい(ストレージ不要)
  3. Slave側のサーバは、HTTPサーバを起動させる必要がない(依存関係でインストールされてはしまいますが)
  4. Master側のサーバは、Slaveに品質測定を任せることができる。

1に関しては、Targetの追加/削除時にSlave側のプロセス再起動などが必要になりますが、設定を一元管理できるのはメリットと考えます。 2と3に関しては、結果的に、Slaveサーバの要求スペックが非常に低くなります。手のひらサイズのLinuxマシン、あるいは、自分では試せていませんが、RasberryPiでも動くかと思います。 4に関しては、ターゲット(もしくはターゲットの階層)毎に『nomasterpoll=yes』というオプションを設定する必要がありますが、 例えばMasterはファイアウォールの内側に配置し、Slaveとの通信のみに限定しセキュリティを担保する、というような構成が取れます。

Master/Slaveでつまずくポイント

ということで、基本的な設定は単体動作と一緒ですが、Master/Slaveで動作させる場合には、以下のポイントに気を付ける必要があります。

なお、smokepingで設定する"Probe"(fping、fping6等)は、MasterとSlaveでインストールする必要があります(nomasterpollさせる場合も、MasterにはProbe(例えばfping)をインストールが必要となりますので注意ください。

ポイント1(secretファイルのパーミッション)

Master/Slaveで動作させる場合、Slave側サーバで、『secretファイル』という、秘密の合言葉を書いたファイルを用意する必要があります。

# ls -hal /var/lib/smokeping/
total 28K
drwxr-xr-x  5 smokeping smokeping 4.0K Sep  2 17:59 .
drwxr-xr-x 26 root      root      4.0K Jul 23 11:53 ..
drwxrwsr-x  2 smokeping www-data  4.0K May 19  2016 __cgi
drwxr-xr-x  2 smokeping smokeping 4.0K Jul 23 11:53 Local
-rw-r-----  1 smokeping smokeping   13 Jul 23 15:15 secret.txt     <---これ
-rw-r--r--  1 root      root         6 Sep  9 12:42 smokeping.pid
drwxr-xr-x  2 smokeping smokeping 4.0K Aug 27 12:27 __sortercache

中身は、そのまま、秘密の言葉を書くのみでOKです
# cat secret.txt
himitsu

このファイルですが、実行ユーザ/グループ以外に読み書き権限があった場合、以下のとおり起動時にエラーとなります。

ERROR: the shared secret file (/var/lib/smokeping/secret.txt) is world-readable or writable at /usr/share/perl5/Smokeping.pm line 4146.

したがって、実行ユーザ/グループ以外での読み込み権限を落とす必要があります。
上記の例では、ユーザ、グループを"smokeping"に変更し、パーミッションを"640"にしております。

ポイント2(slaveサーバの名前解決)

公式では、slave側の起動のオプションは以下の通りとなっています。
("master-url"や各ディレクトリは、環境に合わせて修正が前提です)

 ./smokeping --master-url=http://smokeping/smokeping.cgi \
             --cache-dir=/var/smokeping/ \
             --shared-secret=/var/smokeping/secret.txt

しかしながら、環境によっては、Slaveの名前が一致しない、というエラーが発生する場合があります。

WARNING: No secret found for slave <slaveの名前>

おそらくSlaveのデフォルト動作は、自身のホスト名だけ(FQDNではない)を送っていると思われますので、 この場合、Slave側の起動オプションで、以下のようにslave-nameを明示的に追加すれば解決する場合があります。
今回の場合は、Slaveは、社外のVPSをFQDNで設定しているので、その通りに記載します。

--slave-name=<SlaveサーバのFQDN>

つまり、Slave側の起動オプションを以下のようにします

 ./smokeping --master-url=http://smokeping/smokeping.cgi \
             --cache-dir=/var/smokeping/ \
             --shared-secret=/var/smokeping/secret.txt \
             --slave-name=<SlaveサーバのFQDN>           <---追加

もしくは、ホスト名のみでMaster/Slaveを合わせてもよいかと思われます。

ポイント3(MasterのRRDディレクトリのパーミッション)

Slaveのポーリング実行結果(pingのロス、RTT等)は、Masterサーバのcgi経由で、Master側のRRDファイル4のディレクトリに、一時キャッシュとして書き込まれます。 つまり、RRDを保存するディレクトリは、www-dataでも書き込める権限が必要となります。しかしデフォルトでは、RRDのディレクトリは、smokepingのユーザ、グループでパーミッションが755で設定されてしまいます。

したがって、RRDを保存するディレクトリについて、cgi経由でも書き込みができるように、グループをwww-dataに変更しパーミッションを"775"に変更することで解決します。
なお、これは、新しいTargetの階層を作るたびに対応が必要となりますので、SmokePingのソースを修正する方法もあります。

上記まで対応できれば、SlaveからのキャッシュがRRDディレクトリに書き込まれ、ブラウザを開くと、Slaveの実行結果のグラフが生成されるかと思います。

おわりに

いかがでしたでしょうか?
SmokePingは、ping以外のprobeも多数用意されており、各種設定方法については日本語での開設ブログも多数ございます。 Master/Slaveの利用ケースとしては、例えば『複数の支店等を持つ会社の支店~センタとなるサーバまでの品質測定を、支店側の視点で測定する』など、いろいろな用途が考えられますので、有効に利用いただければ幸いです。

しかし、上司からは『今のナウなヤングの監視ツールはPrometheus5だろ?』と、白い目で見られているので、もしかしたら、同様の監視をPrometheusで行った結果なども、後日紹介できればと考えております。

長文お読みいただき、ありがとうございます。

採用情報

朝日ネットでは新卒採用・キャリア採用を行っております。


  1. ※NTE(Network Termination Equipment)とも呼ばれる。お客様のPPPoEセッションを終端するNTT側の装置。

  2. ※一般的に、東京~大阪間のパケット通信は、おおよそ8msec程度の遅延が発生する(東京大阪でリニア新幹線が開通して、現在よりも直線的にファイバが引ければ1~2msecくらい短縮されるかもしれないかも?)

  3. ※特定のSlaveに対して、Probeに渡すパラメータを変更できる。この"mininterval"は、数百台に及ぶTargetへ30秒でポーリングを完了させるために実施したオプション変更ですが、Masterとして動作させていたサーバ側のFping/Fping6のバージョンが古く設定できないパラメータのため、overrideを用いた。

  4. ※RoundRobinDatabaseの略で、SmopePingの測定結果を保存するデータベースのこと。MRTG/SmokePingと同じくTobias Oetiker氏が開発。

  5. ※ここ最近で注目されている新しい監視ツール。