MeterMaid は conn_throttle.so を代替するリポジトリプロセスであり、同様の機能を提供しますが、Messaging Server のインストール全体にその機能を拡張します。MeterMaid は、割り当て量の超過を監視する役割を果たします。
conn_throttle は、MTA のマッピングテーブルからのコールアウトとして使用される共有ライブラリであり、着信接続のメモリー内テーブルを使用して、特定の IP アドレスが最近頻繁に接続されすぎている場合は、しばらく受信しないようにするべきであると判断します。メモリー内テーブルを持つとパフォーマンスの面では有効ですが、その最大のコストは、各サーバー上の個別のプロセスごとに独自のテーブルが保持されることです。
ほとんどの場合、conn_throttle のコールアウトは、各システム上の 1 つのプロセスであるディスパッチャーによってアクセスされる PORT_ACCESS マッピングで実行されます。この場合の唯一のコストは、サーバーごとに個別のテーブルが存在することです。
MeterMaid による主な機能向上は、Messaging Server 環境内のすべてのシステムおよびプロセスからアクセス可能な、調整情報の単一のリポジトリが存在することです。このデータを格納するためのメモリー内データベースが引き続き保持されるため、パフォーマンスが最大限に向上します。MeterMaid を再起動すると以前に格納されていた情報はすべて失われますが、このデータは一般に寿命が非常に短いため、このような (たまに実行される) 再起動のコストは非常に低くなります。
MeterMaid の設定は msg.conf 内に格納され、configutil によって保守されます。
MeterMaid は、check_metermaid.so を使用したマッピングテーブルのコールアウトを介して MTA からアクセスされます。MeterMaid は、任意の *_ACCESS テーブルから呼び出すことができます。PORT_ACCESS テーブルから呼び出した場合は、接続の IP アドレスに基づいた制限をチェックできます。これが、MeterMaid を以前の conn_throttle.so の代替として実装するためのもっとも一般的な方法です。その他の *_ACCESS テーブルから呼び出した場合は、MeterMaid を使用して、IP アドレスだけでなくエンベロープ From またはエンベロープ To アドレスなどのほかのデータに対する制限を確立することもできます。
check_metermaid.so 内のエントリポイントは 1 つだけ定義されます。throttle ルーチンは MeterMaid に接続して、コンマで区切られたそれ以降の 2 つの引数を提供します。最初の引数はデータをチェックするテーブルの名前であり、2 番目はチェック対象のデータです。
プローブからの結果により、チェック対象の特定のデータがそのテーブル内の制限容量を超えていることが示された場合、このエントリがマッピングエンジンによって引き続き処理されるように、check_metermaid.so は「success」を返します。それによって、エントリの残りの部分が、制限容量を超えたこの接続を処理するために使用されます。
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,tablename,$3]$N421$ Connection$ \ declined$ at$ this$ time$E * $YEXTERNAL |
マッピングテーブルエントリ内の、check_metermaid.so への呼び出しの前にある $:A フラグテストに注意してください。このテストは、自身のプローブに対して A フラグを設定するディスパッチャーによって PORT_ACCESS がチェックされている場合にのみ MeterMaid プローブを実行するためのものです。
MeterMaid を使用するには、最低限、次の操作を行なってください。
次のコマンドを発行して、local.metermaid.enable configutil パラメータを yes に設定します。
# Configutil -o local.metermaid.enable yes |
マッピングファイル内の既存の *_ACCESS マッピングテーブルに *_ACCESS マッピングテーブルまたはエントリを追加します。PORT_ACCESS マッピングテーブルを使用する場合は、次のエントリを使用できます。
PORT_ACCESS *|*|*|*|* $C$|INTERNAL_IP;$3|$Y$E *|*|*|*|* $C$:A$[/opt/SUNWmsgsr/lib/check_metermaid.so,throttle,tablename,$3]$N421$ \ Connection$ declined$ at$ this$ time$E * $YEXTERNAL |
次のコマンドを発行します。
# imsimta cnbuild # imsimta restart dispatcher |
MeterMaid の設定は msg.conf 内に格納され、configutil によって保守されます。現在 MeterMaid でサポートされている設定を次に示します。
local.metermaid.enable - MeterMaid が Watcher によって制御されるように、MeterMaid デーモンを実行するシステムでは、この設定を yes に設定してください。
logfile.metermaid.* - これらの設定は、imap、pop、その他のサービスで使用される設定と同じです。MeterMaid は、ログファイルを msg-svr-base/data/log/metermaid に書き込みます。
metermaid.config.listenaddr (INADDR_ANY) - MeterMaid がバインドするアドレス。ほとんどのシステムではデフォルト値の変更は必要ありませんが、マルチホームまたは HA システムの場合は、ここで適切なアドレスを指定することをお勧めします。
metermaid.config.maxthreads (20) - MeterMaid サーバーはマルチスレッドであり、タスクをスケジュールするためのスレッドのプールを保持しています。この値は、MeterMaid で使用されるスレッドの最大数を設定します。CPU の個数が 4 つを超えるシステムでは、この値を増やすと全体的なスループットが向上する可能性があります。
metermaid.config.port (63837) - MeterMaid が接続を待機するポートであり、また MeterMaid クライアントが接続するポートでもあります。
metermaid.config.secret (デフォルト値はなく、値の指定が必要) - 着信接続を認証するために、MeterMaid は、クライアントが MeterMaid への接続時に送信する共有の秘密情報を使用します。
metermaid.config.serverhost (デフォルト値はなく、値の指定が必要) - クライアントが接続するホスト名または IP アドレスです。metermaid.config.listenaddr と同じである場合もありますが、特に Messaging Server 環境では一般に、クライアントをあるシステムに転送するための特定の値が設定されます。
次の設定は、check_metermaid クライアントによって使用されます。
metermaid.mtaclient.connectfrequency (15) - クライアントが MeterMaid に接続する必要がある場合、MeterMaid が使用不可のときに接続が絶えず試行されることを回避するために、クライアントは内部の調整としてこの値を使用します。MeterMaid と通信できない期間、クライアントは、MeterMaid がこの接続をブロックしなかったことを示す「fail」ステータスを MTA マッピングエンジンに返します。
metermaid.mtaclient.connectwait (5) - クライアントが MeterMaid への接続 (初期接続、またはすでに確立されている別の接続の再利用のどちらか) を待機している場合、「fail」ステータスを返す前にクライアントは connectwait 秒間待ちます。
metermaid.mtaclient.debug (no) - このオプションが有効になっている場合、クライアントからのデバッグ情報は、SMTP サーバーのサーバーまたはスレッド固有のログファイルに出力されます。
metermaid.mtaclient.maxconns (3) - マルチスレッドサーバーをサポートするために、クライアントは、MeterMaid への接続のプールを保持できます。それによって、通信中の並行性を向上させることができます。ただし、MeterMaid によって実行される内部のロックのために、特定のテーブルへのアクセスが一度に 1 つの要求に制限され、それによって 1 つのプロセスからの複数の接続による利点が得られない可能性もあります。
metermaid.mtaclient.readwait (10) - MeterMaid との通信中にクライアントが応答を待つ秒数がこの値を超えると、クライアントは単にこの接続を無応答とみなして閉じ、「fail」ステータスを返します。
最後に、次に示すように、調整用のテーブルも msg.conf 内に定義されます。各設定パラメータ内の * は、定義される特定のテーブルの名前です。たとえば、internal という名前のテーブルの場合、最初のパラメータは metermaid.table.internal.data_type になります。
metermaid.table.*.data_type (文字列) - MeterMaid はテーブル内で、文字列と ipv4 という 2 種類のデータをサポートできます。文字列データは、エントリあたり 255 バイトに制限され、大文字と小文字が区別される関数または大文字と小文字が区別されない関数を使用して比較できます (下の metermaid.table.*.options を参照)。
metermaid.table.*.max_entries (1000) - MeterMaid が各テーブルを初期化する場合は、この個数のエントリを事前に割り当てます。MeterMaid は、まだ期限が切れていない場合でも、古いエントリを自動的にリサイクルします。新しい接続を受信した場合、MeterMaid は、最近もっともアクセスされていないエントリを再利用します。サイトは、quota_time 中に受信された接続をキャッシュできるだけの十分な大きさの値を指定するべきです。
metermaid.table.*.options は、テーブルの動作または特性を定義するための、コンマで区切られたキーワードのリストです。以下のキーワードが指定可能です。
nocase - データを操作する場合、すべての比較が、大文字と小文字が区別されない比較関数を使用して実行されます。このオプションは、文字列データに対してのみ有効です。
penalize - quota_time 秒が経過すると、通常、throttle は接続数を 0 にリセットします。penalize オプションが有効になっている場合は、それ以降の quota_time の期間だけ追加の接続試行にペナルティーが科されるように、throttle は接続数を制限容量だけ減らします (ただし、0 未満にはしない)。たとえば、quota_time が 60 で制限容量が 5 の場合、最初の 1 分間にシステムが 12 の接続試行を受信したとすると、最初の 5 つの接続が受け付けられ、次の 5 つの接続が拒否されます。60 秒が経過すると、特定のアドレスに対してカウントされる接続数は 7 に減らされますが、まだ制限容量を超えているために接続試行は拒否されます。追加の接続試行がなかったと仮定した場合、それからさらに 60 秒が経過すると、接続数はさらに減らされ 2 になるため、MeterMaid によって接続試行がふたたび許可されるようになります。
metermaid.table.*.quota (100) - 接続が受信されると、その接続は制限容量に対してカウントされます。quota_time 秒間に受信された接続数がこの値を超えた場合、MeterMaid は接続を拒否します。着信接続に対する実際の効果はマッピングテーブルによって制御されるため、追加の調査、遅延、接続の拒否などが実行される可能性があります。
metermaid.table.*.storage (ハッシュ) - MeterMaid は、hash と splay という 2 種類の保存方法を使用できます。デフォルトのハッシュテーブルの方法が推奨されますが、環境によっては、スプレーツリーによって検索が高速化される場合があります。
metermaid.table.*.quota_time (60) - 接続を quota に対してカウントする期間の秒数を指定します。この秒数が経過すると、着信アドレスに対してカウントされる接続数は、このテーブルの type に応じて減らされます。
metermaid.table*.storage (hash) - MeterMaid は、hashとsplayという 2 種類の保存方法を使用できます。デフォルトのハッシュテーブルの方法が推奨されますが、環境によっては、スプレーツリーによって検索が高速化される場合があります。
metermaid.table.*.type (throttle) - 現在、MeterMaid でサポートされている唯一のテーブルタイプは throttle です。このタイプのテーブルはデータ (一般には IP アドレス) を常時監視し、quota_time 秒の期間中の着信接続の数を quota に調整します。