模組 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 sticky 會話、關於過多的 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;
上下文 streamserver

設定用於推送區域內容的每個區域緩衝區的 numbersize。預設情況下,緩衝區大小等於一個記憶體頁面。這取決於平台,為 4K 或 8K。

單一緩衝區必須足夠大,以容納每個正在同步的區域的任何條目。

語法 zone_sync_connect_retry_interval time;
預設
zone_sync_connect_retry_interval 1s;
上下文 streamserver

定義嘗試連線到另一個叢集節點之間的間隔。

語法 zone_sync_connect_timeout time;
預設
zone_sync_connect_timeout 5s;
上下文 streamserver

定義與另一個叢集節點建立連線的逾時時間。

語法 zone_sync_interval time;
預設
zone_sync_interval 1s;
上下文 streamserver

定義輪詢共享記憶體區域中更新的間隔。

語法 zone_sync_recv_buffer_size size;
預設
zone_sync_recv_buffer_size 4k|8k;
上下文 streamserver

設定每個連線接收緩衝區的 size,用於解析傳入的同步訊息串流。緩衝區大小必須等於或大於其中一個 zone_sync_buffers。預設情況下,緩衝區大小等於 zone_sync_buffers size 乘以 number

語法 zone_sync_server address [resolve];
預設
上下文 server

定義叢集節點的 address。位址可以指定為帶有強制性埠號的網域名稱或 IP 位址,或以 "unix:" 字首指定為 UNIX 網域通訊端路徑。解析為多個 IP 位址的網域名稱一次定義多個節點。

resolve 參數指示 nginx 監控對應於節點網域名稱的 IP 位址變更,並自動修改設定,而無需重新啟動 nginx。

叢集節點可以動態指定為具有 resolve 參數的單一 zone_sync_server 指令,或靜態指定為一系列沒有該參數的數個指令。

每個叢集節點都應僅指定一次。

所有叢集節點都應使用相同的設定。

為了使 resolve 參數生效,必須在 stream 區塊中指定 resolver 指令。範例

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;
上下文 streamserver

啟用與另一個叢集伺服器連線的 SSL/TLS 協定。

語法 zone_sync_ssl_certificate file;
預設
上下文 streamserver

指定一個 file,其中包含 PEM 格式的憑證,用於驗證另一個叢集伺服器。

語法 zone_sync_ssl_certificate_key file;
預設
上下文 streamserver

指定一個 file,其中包含 PEM 格式的私密金鑰,用於驗證另一個叢集伺服器。

語法 zone_sync_ssl_ciphers ciphers;
預設
zone_sync_ssl_ciphers DEFAULT;
上下文 streamserver

指定與另一個叢集伺服器連線啟用的密碼。密碼以 OpenSSL 程式庫理解的格式指定。

可以使用 "openssl ciphers" 命令檢視完整清單。

語法 zone_sync_ssl_conf_command name value;
預設
上下文 streamserver

此指令出現在 1.19.4 版本中。

設定與另一個叢集伺服器建立連線時的任意 OpenSSL 設定命令

當使用 OpenSSL 1.0.2 或更高版本時,才支援該指令。

可以在同一層級指定多個 zone_sync_ssl_conf_command 指令。當且僅當目前層級沒有定義 zone_sync_ssl_conf_command 指令時,這些指令才會從先前的設定層級繼承。

請注意,直接設定 OpenSSL 可能會導致意外行為。

語法 zone_sync_ssl_crl file;
預設
上下文 streamserver

指定一個 file,其中包含 PEM 格式的已撤銷憑證 (CRL),用於驗證另一個叢集伺服器的憑證。

語法 zone_sync_ssl_name name;
預設
zone_sync_ssl_name host from zone_sync_server;
上下文 streamserver

此指令出現在 1.15.7 版本中。

允許覆寫用於驗證叢集伺服器憑證並在與叢集伺服器建立連線時透過 SNI 傳遞的伺服器名稱。

預設情況下,使用 zone_sync_server 位址的主機部分,如果指定 resolve 參數,則使用解析的 IP 位址。

語法 zone_sync_ssl_password_file file;
預設
上下文 streamserver

指定一個 file,其中包含 私密金鑰的密碼,每個密碼都在單獨的行上指定。載入金鑰時會依序嘗試密碼。

語法 zone_sync_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
預設
zone_sync_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
上下文 streamserver

啟用與另一個叢集伺服器連線的指定協定。

語法 zone_sync_ssl_server_name on | off;
預設
zone_sync_ssl_server_name off;
上下文 streamserver

此指令出現在 1.15.7 版本中。

啟用或停用透過 TLS 伺服器名稱指示擴展 (SNI, RFC 6066) 傳遞伺服器名稱,在與另一個叢集伺服器建立連線時。

語法 zone_sync_ssl_trusted_certificate file;
預設
上下文 streamserver

指定一個 file,其中包含 PEM 格式的信任 CA 憑證,用於驗證另一個叢集伺服器的憑證。

語法 zone_sync_ssl_verify on | off;
預設
zone_sync_ssl_verify off;
上下文 streamserver

啟用或停用對另一個叢集伺服器憑證的驗證。

語法 zone_sync_ssl_verify_depth number;
預設
zone_sync_ssl_verify_depth 1;
上下文 streamserver

設定另一個叢集伺服器憑證鏈中的驗證深度。

語法 zone_sync_timeout timeout;
預設
zone_sync_timeout 5s;
上下文 streamserver

設定與另一個叢集節點連線的兩個連續讀取或寫入操作之間的 timeout。如果在此時間內未傳輸任何資料,則會關閉連線。

API 端點

節點的同步狀態可透過 API 的 /stream/zone_sync/ 端點取得,該端點會傳回以下指標。

啟動、停止、移除叢集節點

要啟動新節點,請使用新節點的 IP 位址更新叢集主機名稱的 DNS 記錄並啟動一個執行個體。新節點將從 DNS 或靜態設定中探索其他節點,並開始向它們傳送更新。其他節點最終將使用 DNS 探索新節點,並開始向其推送更新。在靜態設定的情況下,需要重新載入其他節點,才能將更新傳送至新節點。

要停止節點,請將 QUIT 訊號傳送至執行個體。節點將完成區域同步並正常關閉開啟的連線。

要移除節點,請更新叢集主機名稱的 DNS 記錄並移除該節點的 IP 位址。所有其他節點最終將發現該節點已移除,關閉與該節點的連線,並且不再嘗試連線到它。移除節點後,可以按照上述說明停止它。在靜態設定的情況下,需要重新載入其他節點,才能停止將更新傳送至已移除的節點。