モジュール ngx_stream_zone_sync_module

設定例
ディレクティブ
     zone_sync
     zone_sync_buffers
     zone_sync_connect_retry_interval
     zone_sync_connect_timeout
     zone_sync_interval
     zone_sync_recv_buffer_size
     zone_sync_server
     zone_sync_ssl
     zone_sync_ssl_certificate
     zone_sync_ssl_certificate_key
     zone_sync_ssl_ciphers
     zone_sync_ssl_conf_command
     zone_sync_ssl_crl
     zone_sync_ssl_name
     zone_sync_ssl_password_file
     zone_sync_ssl_protocols
     zone_sync_ssl_server_name
     zone_sync_ssl_trusted_certificate
     zone_sync_ssl_verify
     zone_sync_ssl_verify_depth
     zone_sync_timeout
APIエンドポイント
クラスタノードの起動、停止、削除

ngx_stream_zone_sync_module モジュール(1.13.8)は、クラスタのノード間で共有メモリゾーンの内容を同期するために必要なサポートを提供します。特定のゾーンの同期を有効にするには、対応するモジュールがこの機能をサポートしている必要があります。現在、HTTPのスティッキーセッション、過剰なHTTPリクエストに関する情報、およびhttpstreamの両方のキーと値のペアを同期できます。

このモジュールは、当社の商用サブスクリプションの一部として利用可能です。

設定例

最小限の設定

http {
    ...

    upstream backend {
       server backend1.example.com:8080;
       server backend2.example.com:8081;

       sticky learn
              create=$upstream_cookie_examplecookie
              lookup=$cookie_examplecookie
              zone=client_sessions:1m sync;
    }

    ...
}

stream {
    ...


    server {
        zone_sync;

        listen 127.0.0.1:12345;

        # cluster of 2 nodes
        zone_sync_server a.example.com:12345;
        zone_sync_server b.example.com:12345;

    }

SSLが有効で、DNSで定義されたクラスタメンバーによるより複雑な設定

...

stream {
    ...

    resolver 127.0.0.1 valid=10s;

    server {
        zone_sync;

        # the name resolves to multiple addresses that correspond to cluster nodes
        zone_sync_server cluster.example.com:12345 resolve;

        listen 127.0.0.1:4433 ssl;

        ssl_certificate     localhost.crt;
        ssl_certificate_key localhost.key;

        zone_sync_ssl on;

        zone_sync_ssl_certificate     localhost.crt;
        zone_sync_ssl_certificate_key localhost.key;
    }
}

ディレクティブ

構文 zone_sync;
デフォルト
コンテキスト server

クラスタノード間での共有メモリゾーンの同期を有効にします。クラスタノードは、zone_sync_serverディレクティブを使用して定義されます。

構文 zone_sync_buffers number size;
デフォルト
zone_sync_buffers 8 4k|8k;
コンテキスト stream, server

ゾーンコンテンツのプッシュに使用されるゾーンごとのバッファの numbersize を設定します。デフォルトでは、バッファサイズは1つのメモリページと同じです。これは、プラットフォームに応じて4Kまたは8Kのいずれかです。

単一のバッファは、同期される各ゾーンの任意のエントリを保持するのに十分な大きさでなければなりません。

構文 zone_sync_connect_retry_interval time;
デフォルト
zone_sync_connect_retry_interval 1s;
コンテキスト stream, server

別のクラスタノードへの接続試行間の間隔を定義します。

構文 zone_sync_connect_timeout time;
デフォルト
zone_sync_connect_timeout 5s;
コンテキスト stream, server

別のクラスタノードとの接続を確立するためのタイムアウトを定義します。

構文 zone_sync_interval time;
デフォルト
zone_sync_interval 1s;
コンテキスト stream, server

共有メモリゾーンの更新をポーリングする間隔を定義します。

構文 zone_sync_recv_buffer_size size;
デフォルト
zone_sync_recv_buffer_size 4k|8k;
コンテキスト stream, server

同期メッセージの着信ストリームを解析するために使用される、接続ごとの受信バッファの size を設定します。バッファサイズは、zone_sync_buffersの1つ以上と等しいか、それより大きくする必要があります。デフォルトでは、バッファサイズはzone_sync_bufferssizenumber を掛けたものに等しくなります。

構文 zone_sync_server address [resolve];
デフォルト
コンテキスト server

クラスタノードの address を定義します。アドレスは、必須ポート付きのドメイン名またはIPアドレスとして、または「unix:」プレフィックスの後に指定されたUNIXドメインソケットパスとして指定できます。複数のIPアドレスに解決されるドメイン名は、一度に複数のノードを定義します。

resolveパラメーターは、ノードのドメイン名に対応するIPアドレスの変更を監視し、nginxを再起動する必要なく自動的に設定を変更するようにnginxに指示します。

クラスタノードは、resolveパラメーター付きの単一のzone_sync_serverディレクティブとして動的に指定されるか、パラメーターなしの複数のディレクティブのシリーズとして静的に指定されます。

各クラスタノードは一度だけ指定する必要があります。

すべてのクラスタノードは同じ設定を使用する必要があります。

resolveパラメーターを機能させるには、resolverディレクティブをstreamブロックで指定する必要があります。例

stream {
    resolver 10.0.0.1;

    server {
        zone_sync;
        zone_sync_server cluster.example.com:12345 resolve;
        ...
    }
}

構文 zone_sync_ssl on | off;
デフォルト
zone_sync_ssl off;
コンテキスト stream, server

別のクラスタサーバーへの接続にSSL/TLSプロトコルを有効にします。

構文 zone_sync_ssl_certificate file;
デフォルト
コンテキスト stream, server

別のクラスタサーバーへの認証に使用されるPEM形式の証明書を含む file を指定します。

構文 zone_sync_ssl_certificate_key file;
デフォルト
コンテキスト stream, server

別のクラスタサーバーへの認証に使用されるPEM形式の秘密鍵を含む file を指定します。

構文 zone_sync_ssl_ciphers ciphers;
デフォルト
zone_sync_ssl_ciphers DEFAULT;
コンテキスト stream, server

別のクラスタサーバーへの接続に有効な暗号化方式を指定します。暗号化方式は、OpenSSLライブラリで理解される形式で指定されます。

完全なリストは、「openssl ciphers」コマンドを使用して表示できます。

構文 zone_sync_ssl_conf_command name value;
デフォルト
コンテキスト stream, server

このディレクティブはバージョン1.19.4で登場しました。

別のクラスタサーバーとの接続を確立するときに、任意のOpenSSL設定コマンドを設定します。

このディレクティブは、OpenSSL 1.0.2以上を使用する場合にサポートされます。

同じレベルで複数のzone_sync_ssl_conf_commandディレクティブを指定できます。これらのディレクティブは、現在のレベルでzone_sync_ssl_conf_commandディレクティブが定義されていない場合にのみ、前の設定レベルから継承されます。

OpenSSLを直接設定すると、予期しない動作が発生する可能性があることに注意してください。

構文 zone_sync_ssl_crl file;
デフォルト
コンテキスト stream, server

別のクラスタサーバーの証明書を検証するために使用される、PEM形式の失効した証明書(CRL)を含む file を指定します。

構文 zone_sync_ssl_name name;
デフォルト
zone_sync_ssl_name host from zone_sync_server;
コンテキスト stream, server

このディレクティブはバージョン1.15.7で登場しました。

クラスタサーバーの証明書を検証し、クラスタサーバーとの接続を確立するときにSNI経由で渡されるサーバー名をオーバーライドできます。

デフォルトでは、zone_sync_serverアドレスのホスト部分、またはresolveパラメーターが指定されている場合は解決されたIPアドレスが使用されます。

構文 zone_sync_ssl_password_file file;
デフォルト
コンテキスト stream, server

秘密鍵のパスフレーズを含む file を指定します。各パスフレーズは別の行に指定されます。キーをロードするときに、パスフレーズが順番に試行されます。

構文 zone_sync_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
デフォルト
zone_sync_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
コンテキスト stream, server

別のクラスタサーバーへの接続に指定されたプロトコルを有効にします。

構文 zone_sync_ssl_server_name on | off;
デフォルト
zone_sync_ssl_server_name off;
コンテキスト stream, server

このディレクティブはバージョン1.15.7で登場しました。

別のクラスタサーバーとの接続を確立するときに、TLS Server Name Indication拡張機能(SNI、RFC 6066)を介したサーバー名の受け渡しを有効または無効にします。

構文 zone_sync_ssl_trusted_certificate file;
デフォルト
コンテキスト stream, server

別のクラスタサーバーの証明書を検証するために使用される、PEM形式の信頼できるCA証明書を含む file を指定します。

構文 zone_sync_ssl_verify on | off;
デフォルト
zone_sync_ssl_verify off;
コンテキスト stream, server

別のクラスタサーバー証明書の検証を有効または無効にします。

構文 zone_sync_ssl_verify_depth number;
デフォルト
zone_sync_ssl_verify_depth 1;
コンテキスト stream, server

別のクラスタサーバー証明書チェーンでの検証の深さを設定します。

構文 zone_sync_timeout timeout;
デフォルト
zone_sync_timeout 5s;
コンテキスト stream, server

別のクラスタノードへの接続での2つの連続する読み取りまたは書き込み操作間の timeout を設定します。この時間内にデータが送信されない場合、接続は閉じられます。

APIエンドポイント

ノードの同期ステータスは、APIの/stream/zone_sync/エンドポイントを介して利用でき、次のメトリックを返します。

クラスタノードの起動、停止、削除

新しいノードを起動するには、新しいノードのIPアドレスでクラスタホスト名のDNSレコードを更新し、インスタンスを起動します。新しいノードは、DNSまたは静的構成から他のノードを検出し、それらに更新を送信し始めます。他のノードは最終的にDNSを使用して新しいノードを検出し、更新をプッシュし始めます。静的構成の場合、他のノードに更新を送信するには、他のノードをリロードする必要があります。

ノードを停止するには、インスタンスに QUIT シグナルを送信します。ノードはゾーン同期を完了し、開いている接続を正常に閉じます。

ノードを削除するには、クラスタホスト名のDNSレコードを更新し、ノードのIPアドレスを削除します。他のすべてのノードは、ノードが削除されたことを最終的に検出し、ノードへの接続を閉じ、それへの接続を試行しなくなります。ノードが削除されたら、上記のように停止できます。静的構成の場合、削除されたノードへの更新の送信を停止するには、他のノードをリロードする必要があります。