本文へ移動

高度な機能

実行時の管理、OS固有の機能、Luaスクリプト、稼働中のトレース

3.5.1. 高度な機能:管理

HAProxyは、通常の本番環境で極めて安定し、安全に管理できるよう設計されています。インストール作業を必要としない単一の実行可能ファイルとして提供されます。複数のバージョンを簡単に共存させられるため、すべてのインスタンスを一度に移行する代わりに、重要度の順に段階的にアップグレードできます(この方法を推奨します)。設定ファイルは容易にバージョン管理できます。設定のチェックはオフラインで行うため、失敗するかもしれないサービスを再起動する必要はありません。設定チェックでは、別のルールを隠してしまうルールや、機能しないスティッキー処理など、見つけにくい誤りも検出でき、修正のための詳しい警告や設定のヒントが提示されます。設定ファイルの後方互換性は非常に長い期間に及び、バージョン1.5は13年前に書かれたバージョン1.1の設定を完全にサポートしていました。1.6でも、別の方法で実現できる、ほとんど使われていない古いキーワードのサポートを削除しただけです。設定とソフトウェアのアップグレードは円滑で処理を中断せず、古いプロセスと新しいプロセスをシステム上で共存させ、それぞれの接続を処理させられます。システムの状態、ビルドオプション、ライブラリの互換性は起動時に報告されます。

高度な機能の一部を使うと、アプリケーション管理者は、サーバーを穏やかに停止へ移行させ、処理がなくなったことを検出してからオフラインにし、停止、アップグレードを行い、その間はトラフィックを受け取らないようにできます。その後、一般公開せずに通常の経路を通じて再度テストできます。これらはすべてHAProxyに一切手を加えずに行えます。そのため、複雑な本番運用作業でも、技術要員を十分確保できる営業時間中に実施できます。

プロセスは可能な限りリソースを節約しようとします。メモリプールで割り当て時間を削減し、メモリ断片化を抑え、ペイロードバッファーは内容の送信後すぐに解放します。また、厳格なメモリ上限を適用でき、上限を超えた場合は、追加のメモリを割り当てる代わりに、接続を利用可能なバッファーができるまで待機させます。この仕組みは、制約の厳しい環境でメモリ使用量を保証するのに役立ちます。

コマンドラインインターフェース(CLI)をUNIXまたはTCPソケットで利用でき、さまざまな操作やトラブルシューティング情報の取得を行えます。このソケットで行う操作はすべて設定変更を必要としないため、主に一時的な変更に使われます。このインターフェースでは、サーバーのアドレス、重み、状態の変更、統計の参照とカウンターのクリア、スティックテーブルのダンプとクリア(必要に応じてキー条件で選択)、クライアント側・サーバー側の接続のダンプと強制終了、取得したエラーとその正確な原因・発生箇所の詳細分析のダンプ、ACLやマップのエントリーのダンプ・追加・削除、TLS共有シークレットの更新、任意のフロントエンドへの接続数制限やレート制限の即時適用(共用ホスティング環境で便利です)、特定のフロントエンドの無効化によるリッスンポートの解放(日中の運用作業が禁止されているものの、修正が必要な場合に便利です)が可能です。証明書とその設定を稼働中に更新したり、トラフィック処理の各段階のトレースを有効化・参照したりすることもできます。

SNMPが必須の環境向けには、少なくとも2つのエージェントがあります。1つはHAProxyのソースに付属し、Net-SNMPのPerlモジュールに依存します。もう1つは商用パッケージに付属し、Perlを必要としません。対応範囲はほぼ同等です。

HAProxyを配置するマシンには、次の4つのユーティリティのインストールがよく推奨されます。

  • socat:CLIに接続するために使います。netcatの一部の派生版でも、ある程度は代用できます。

  • 最新のHAProxyバージョンに付属するhalog:ログ解析ツールです。ネイティブのTCPログとHTTPログを極めて高速(毎秒1〜2 GB)に解析し、URL別・送信元アドレス別のリクエスト数、レスポンス時間やエラー率で並べたURL、終了コードなど、有用な情報と統計を抽出します。稼働中の問題を調査するために本番サーバーへ配置することを想定して設計されているため、すぐ使える状態で用意しておく必要があります。

  • tcpdump:ログで明らかになった問題の調査に必要なネットワークトレースを取得するため、強く推奨します。アプリケーション側とhaproxy側の分析が食い違う局面では、どちらが正しいかを判断する唯一の方法がネットワークトレースになります。また、tcpdumpによってネットワークスタックやハイパーバイザーのバグが見つかることもよくあります。

  • strace:tcpdumpと組み合わせて使うツールです。HAProxyが実際に何を見ているかを報告し、OSに原因がある問題とHAProxyに原因がある問題を切り分けるのに役立ちます。HAProxyのバグが疑われる場合、straceの結果を求められることがよくあります。

3.5.2. 高度な機能:システム固有の機能

HAProxyを配置するOSによっては、追加の機能が利用できる場合や必要となる場合があります。HAProxyは多数のプラットフォームをサポートしていますが、主にLinux上で開発されているため、一部の機能はLinuxでしか利用できません。

透過的なバインドと接続、特定のネットワークインターフェースへの接続のバインド、複数のプロセスを同じIPアドレスとポートにバインドする機能は、LinuxとBSDシステムでのみ利用できます。ただし、利用可能なプロセス間で受信リクエストをカーネル側で負荷分散するのはLinuxだけです。

Linuxには、このほかにも多くの追加機能と最適化があります。HAProxyをすべてのコンテナー間のゲートウェイとして動作させられるネットワーク名前空間(「コンテナー」とも呼ばれます)、クライアント側接続のMSS・Netfilterマーク・IP TOSフィールドの設定、リッスン側のTCP FastOpen、設定されたタイムアウトよりも前にクライアントの消失を検出した場合にカーネルが接続を素早く終了できるTCPユーザータイムアウト、カーネルに接続の両側間でデータを転送させて複数回のメモリコピーを避けるTCP splicing、カーネルバッファーにデータが届いてから着信接続の通知を受ける"defer-accept"バインドオプション、接続の確認ACKとともにリクエストを送信する機能(“piggy-back"とも呼ばれ、“tcp-smart-connect"オプションで有効になります)などです。Linuxでは、ネットワーク上のパケットをできるだけ節約するため、HAProxyはTCPの遅延ACKの扱いにも細心の注意を払っています。

システムによっては、時刻が過去や未来へ飛ぶ、信頼性の低い時計を持つものがあります。以前は、複数のプロセッサーが厳密に同じ時刻を参照しない一部のNUMAシステムで発生していました。最近では、仮想時計が実時計と無関係に動作する仮想化環境でより一般的になり、大きな時刻の飛び(最大30秒に達する例も観測されています)が起きています。これにより、一般にタイムアウトの適用で多くの問題が生じます。このようなシステムの欠陥に対処するため、HAProxyはシステム時計に基づきながら、そのずれを測定・補正する独自の単調時計を維持しています。その結果、システム時計が非常に不正確でも、タイマーは十分な精度を保ち、タイムアウトも機能し続けます。この問題はHAProxy固有ではなく、そのシステム上で動作するすべてのソフトウェアに影響します。典型的な症状は、不意のタイムアウトやアプリケーションのフリーズです。したがって、この動作がシステムで検出された場合は、HAProxyが自衛しているかどうかにかかわらず、必ず修正しなければなりません。

Linuxでは、新しく起動するプロセスが既存のプロセスと通信し、リッスン用のファイル記述子を再利用できるため、プロセスを置き換える間もリッスンソケットが中断されません。

3.5.3. 高度な機能:スクリプト

HAProxyは組み込み言語Luaをサポートする構成でビルドでき、リクエストやレスポンスの複雑な操作、ルーティングの判断、統計処理など、幅広い新たな用途が可能になります。Luaを使うと、ほかのサーバーに並列に接続して情報を交換することもできます。これにより、たとえば認証システムの開発も可能になります(ただし複雑です)。Luaの使い方の詳細は、“doc/lua-api/index.rst"のドキュメントを参照してください。

3.5.4. 高度な機能:トレース

管理者はいつでもCLIで接続し、さまざまな内部サブシステムのトレースを有効にできます。複数の詳細レベルが標準で用意されており、実際にはリクエストごとに1行から500行までの情報を取得できます。フィルターと、自動的な取得開始・停止・一時停止の仕組みも利用できるため、特定のイベントを待ち、その詳細を観察できます。不具合のあるサーバーやクライアントによるプロトコル違反、サービス拒否攻撃の診断に非常に便利です。