模块 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 endpoints
Starting, stopping, removing a cluster node

模块 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。默认情况下,缓冲区大小等于一个内存页。这取决于平台,可以是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。缓冲区大小必须等于或大于numbersize乘以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;
上下文: stream, server

启用与另一个集群服务器的连接的 SSL/TLS 协议。

语法: zone_sync_ssl_certificate file;
默认:
上下文: stream, server

指定一个用于身份验证到另一个集群服务器的 PEM 格式证书文件。

语法: zone_sync_ssl_certificate_key file;
默认:
上下文: stream, server

指定一个用于身份验证到另一个集群服务器的 PEM 格式密钥文件。

语法: 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 文件;
默认:
上下文: stream, server

指定一个以 PEM 格式存储的吊销证书 (CRL) 的 文件,用于验证另一个集群服务器的证书。

语法: zone_sync_ssl_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 文件;
默认:
上下文: stream, server

指定一个包含 密钥密码文件,其中每个密码都在单独的一行上指定。加载密钥时逐个尝试密码。

语法: 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 extension (SNI, RFC 6066) 在与另一个集群服务器建立连接时传递服务器名称。

语法: zone_sync_ssl_trusted_certificate 文件;
默认:
上下文: stream, server

指定一个包含 PEM 格式的受信任 CA 证书的 文件,用于验证另一个集群服务器的证书。

Syntax: zone_sync_ssl_verify on | off;
Default:
zone_sync_ssl_verify off;
Context: stream, server

Enables or disables verification of another cluster server certificate.

Syntax: zone_sync_ssl_verify_depth number;
Default:
zone_sync_ssl_verify_depth 1;
Context: stream, server

Sets the verification depth in another cluster server certificates chain.

Syntax: zone_sync_timeout timeout;
Default:
zone_sync_timeout 5s;
Context: stream, server

Sets the timeout between two successive read or write operations on connection to another cluster node. If no data is transmitted within this time, the connection is closed.

API endpoints

The synchronization status of a node is available via the /stream/zone_sync/ endpoint of the API which returns the following metrics.

Starting, stopping, removing a cluster node

To start a new node, update a DNS record of a cluster hostname with the IP address of the new node and start an instance. The new node will discover other nodes from DNS or static configuration and will start sending updates to them. Other nodes will eventually discover the new node using DNS and start pushing updates to it. In case of static configuration, other nodes need to be reloaded in order to send updates to the new node.

To stop a node, send the QUIT signal to the instance. The node will finish zone synchronization and gracefully close open connections.

To remove a node, update a DNS record of a cluster hostname and remove the IP address of the node. All other nodes will eventually discover that the node is removed, close connections to the node, and will no longer try to connect to it. After the node is removed, it can be stopped as described above. In case of static configuration, other nodes need to be reloaded in order to stop sending updates to the removed node.