模块 ngx_streamzone_sync_module

ngx_stream_zone_sync_module模块(1.13.8)为在 cluster 的节点之间同步共享 memory zones的内容提供必要的支持。要为特定 zone 启用同步,相应的模块必须支持此 feature。目前,可以在HTTP中同步 HTTP 会话,过多的 HTTP 请求和 key-value 对的信息。

该模块作为商业订阅的一部分提供。

Example Configuration

最小配置:

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 定义的 cluster 成员的更复杂的 configuration:

...

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;
默认:
Context:server

在 cluster 节点之间启用共享 memory zones 的同步。 Cluster 节点使用zone_sync_server指令定义。

句法:zone_sync_buffers number size;
默认:zone_sync_buffers 8 4k\|8k;
Context:stream , server

设置用于推送 zone 内容的 per-zone 缓冲区的numbersize。默认情况下,缓冲区大小等于一个 memory 页面。这是 4K 或 8K,具体取决于平台。

单个缓冲区必须足够大,以保持每个 zone 的任何条目同步。

句法:zone_sync_connect_retry_interval time;
默认:zone_sync_connect_retry_interval 1s;
Context:stream , server

定义到另一个 cluster 节点的连接尝试之间的间隔。

句法:zone_sync_connect_timeout time;
默认:zone_sync_connect_timeout 5s;
Context:stream , server

定义与另一个 cluster 节点建立连接的超时。

句法:zone_sync_interval time;
默认:zone_sync_interval 1s;
Context:stream , server

定义在共享 memory zone 中轮询更新的时间间隔。

句法:zone_sync_recv_buffer_size size;
默认:zone_sync_recv_buffer_size 4k\|8k;
Context:stream , server

Sets size per-connection 接收缓冲区用于解析传入的同步消息流。缓冲区大小必须等于或大于zone_sync_buffers之一。默认情况下,缓冲区大小等于zone_sync_buffers size乘以number

句法:zone_sync_server address [resolve];
默认:
Context:server

定义 cluster 节点的address。可以将地址指定为具有强制 port 的域 name 或 IP 地址,或指定为“unix:”前缀后指定的 UNIX-domain socket 路径。解析为多个 IP 地址的域 name 一次定义多个节点。

resolve参数指示 nginx 监视对应于节点的域 name 的 IP 地址的更改,并自动修改 configuration 而无需重新启动 nginx。

Cluster 节点可以动态指定为带有resolve参数的单个zone_sync_server指令,也可以静态指定为一系列不带参数的指令。
每个 cluster 节点只应指定一次。

所有 cluster 节点都应使用相同的 configuration。

resolve参数的 order 中,必须在块中指定分解器指令。 例:

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;
Context:stream , server

启用 SSL/TLS 协议以连接到另一个 cluster 服务器。

句法:zone_sync_ssl_certificate file;
默认:
Context:stream , server

使用 PEM 格式的证书指定file,用于对另一个 cluster 服务器进行身份验证。

句法:zone_sync_ssl_certificate_key file;
默认:
Context:stream , server

使用 PEM 格式的 secret key 指定file,用于对另一个 cluster 服务器进行身份验证。

句法:zone_sync_ssl_ciphers ciphers;
默认:zone_sync_ssl_ciphers DEFAULT;
Context:stream , server

指定用于连接到另一个 cluster 服务器的已启用密码。密码以 OpenSSL library 理解的格式指定。

可以使用“openssl ciphers”命令查看完整列表。

句法:zone_sync_ssl_crl file;
默认:
Context:stream , server

指定具有 PEM 格式的已撤销证书(CRL)的file,用于校验另一个 cluster 服务器的证书。

句法:zone_sync_ssl_name name;
默认:zone_sync_ssl_name host from zone_sync_server;
Context:stream , server

该指令出现在 version 1.15.7 中。

允许覆盖服务器 name,用于校验 cluster 服务器的证书,并且在与 cluster 服务器建立连接时为通过 SNI

默认情况下,如果指定了解决参数,则使用zone_sync_server地址的 host 部分或解析的 IP 地址。

句法:zone_sync_ssl_password_file file;
默认:
Context:stream , server

secret 键指定带有密码的file,其中每个密码在单独的 line 上指定。当_加载 key 时,依次尝试密码短语。

句法:zone_sync_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
默认:zone_sync_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Context:stream , server

启用指定的协议以连接到另一个 cluster 服务器。

句法:zone_sync_ssl_server_name on \| off;
默认:zone_sync_ssl_server_name off;
Context:stream , server

该指令出现在 version 1.15.7 中。

在与另一个 cluster 服务器建立连接时,启用或禁用通过TLS 服务器 Name 指示扩展名(SNI,RFC 6066)传递服务器 name。

句法:zone_sync_ssl_trusted_certificate file;
默认:
Context:stream , server

指定带有 PEM 格式的可信 CA 证书的file,用于校验另一个 cluster 服务器的证书。

句法:zone_sync_ssl_verify on \| off;
默认:zone_sync_ssl_verify off;
Context:stream , server

启用或禁用另一个 cluster 服务器证书的验证。

句法:zone_sync_ssl_verify_depth number;
默认:zone_sync_ssl_verify_depth 1;
Context:stream , server

在另一个 cluster 服务器证书链中设置验证深度。

句法:zone_sync_timeout timeout;
默认:zone_sync_timeout 5s;
Context:stream , server

在连接到另一个 cluster 节点时,在两次连续读取或写入操作之间设置timeout。如果在此 time 内没有传输数据,则关闭连接。

API endpoints

节点的同步状态可通过返回以下 metrics 的 API 的/stream/zone_sync/端点获得。

启动,停止,删除 cluster 节点

要启动新节点,请使用新节点的 IP 地址更新 cluster 主机名的 DNS record 并启动实例。新节点将从 DNS 或静态 configuration 中发现其他节点,并将开始向它们发送更新。其他节点最终将使用 DNS 发现新节点并开始向其推送更新。在静态 configuration 的情况下,需要在 order 中重新加载其他节点以将更新发送到新节点。

要停止节点,请将QUIT信号发送到实例。该节点将完成 zone 同步并正常关闭打开的连接。

要删除节点,请更新 cluster 主机名的 DNS record 并删除该节点的 IP 地址。所有其他节点最终将发现节点已被删除,关闭与节点的连接,并且将不再尝试连接到节点。移除节点后,可以如上所述停止节点。在静态 configuration 的情况下,需要在 order 中重新加载其他节点以停止向已删除节点发送更新。

Updated at: 7 months ago
ngx_stream_upstream_hc_moduleTable of contentngx_google_perftools_module