ngx_stream_zone_sync_module

ngx_stream_zone_sync_module 모듈(1.13.8)은 클러스터 노드 사이에 공유된 메모리 영역의 내용을 동기화하기 위한 필수적 지원을 제공합니다. 특정 영역에 동기화를 활성화하려면 해당 모듈이 이 기능을 지원해야 합니다. 현재 http 및 stream에서 HTTP sticky 세션, 표현적 HTTP 요청에 대한 정보, 키-값 쌍을 동기화할 수 있습니다.

이 모듈은 상업용 구독에서 제공합니다.

예제 구성

최소 구성:

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;
    }
}

Directives

Syntax:  zone_sync;
Default: —
Context: server

클러스터 노드 사이에 공유된 메모리 영역을 동기화합니다. 클러스터 노드는 zone_sync_server 명령을 사용하여 정의합니다.

Syntax:  zone_sync_buffers number size;
Default: zone_sync_buffers 8 4k|8k;
Context: stream, server

영역 내용을 푸시하는 데 사용하는 영역별 버퍼의 numbersize를 설정합니다. 기본적으로 버퍼 크기는 메모리 페이지 1개와 같습니다. 플랫폼에 따라 4K 또는 8K가 됩니다.

버퍼 하나는 동기화 대상인 각 영역의 모든 항목을 포함할 수 있을 정도여야 합니다.

Syntax:  zone_sync_connect_retry_interval time;
Default: zone_sync_connect_retry_interval 1s;
Context: stream, server

다른 클러스터 노드에 연결을 시도하는 간격을 정의합니다.

Syntax:  zone_sync_connect_timeout time;
Default: zone_sync_connect_timeout 5s;
Context: stream, server

다른 클러스터 노드와의 연결을 설정하는 시간제한을 정의합니다.

Syntax:  zone_sync_interval time;
Default: zone_sync_interval 1s;
Context: stream, server

공유된 메모리 영역에서 폴링 업데이트 간격을 정의합니다.

Syntax:  zone_sync_recv_buffer_size size;
Default: zone_sync_recv_buffer_size 4k|8k;
Context: stream, server

동기화 메시지의 수신 스트림을 파싱하는 데 사용할 연결별 수신 버퍼의 size를 설정합니다. 버퍼 크기는 zone_sync_buffers 중 하나와 같거나 커야 합니다. 기본적으로 버퍼 크기는 zone_sync_buffers sizenumber를 곱한 값과 같아야 합니다.

Syntax:  zone_sync_server address [resolve];
Default: —
Context: server

클러스터 노드의 address를 정의합니다. 주소는 필수 포트를 포함한 도메인 이름이나 IP 주소로 지정하거나, “unix:” 접두어 뒤에 UNIX 도메인 소켓 경로로 지정합니다. 여러 IP 주소로 변환되는 도메인 이름으로 여러 노드를 한 번에 정의합니다.

resolve 매개변수를 사용하면 nginx가 노드의 도메인 이름에 해당하는 IP 주소의 변경 사항을 모니터링하고, 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;
        ...
    }
}
Syntax:  zone_sync_ssl on | off;
Default: zone_sync_ssl off;
Context: stream, server

다른 클러스터 서버 연결에 대해 SSL/TLS 프로토콜을 활성화합니다.

Syntax:  zone_sync_ssl_certificate file;
Default: —
Context: stream, server

다른 클러스터 서버 인증에 사용하기 위한 PEM 형식의 인증서가 포함된 file을 지정합니다.

Syntax:  zone_sync_ssl_certificate_key file;
Default: —
Context: stream, server

다른 클러스터 서버 인증에 사용하기 위한 PEM 형식의 시크릿 키가 포함된 file을 지정합니다.

Syntax:  zone_sync_ssl_ciphers ciphers;
Default: zone_sync_ssl_ciphers DEFAULT;
Context: stream, server

다른 클러스터 서버 연결에 대해 활성화된 암호를 지정합니다. 이 암호는 OpenSSL 라이브러리에서 이해하는 형식으로 지정합니다.

전체 목록은 “openssl ciphers” 명령을 사용하여 확인할 수 있습니다.

Syntax:  zone_sync_ssl_conf_command command;
Default: —
Context: stream, server
This directive appeared in version 1.19.4.

다른 클러스터 서버로 연결을 설정할 때 임의의 OpenSSL 구성 명령을 설정합니다.

이 명령은 OpenSSL 1.0.2 이상을 사용할 때 지원됩니다.

동일한 수준에서 여러 zone_sync_ssl_conf_command 명령을 지정할 수 있습니다. 이러한 명령은 현재 수준에서 zone_sync_ssl_conf_command 명령이 정의되지 않은 경우에만 이전 구성에서 상속합니다.

OpenSSL을 직접 구성하면 예상치 못한 동작이 발생할 수 있습니다.

Syntax:  zone_sync_ssl_crl file;
Default: —
Context: stream, server

다른 클러스터 서버의 인증서를 인증하는 데 사용한 취소된 인증서(CRL)를 PEM 형식으로 포함한 file을 지정합니다.

Syntax:  zone_sync_ssl_name name;
Default: zone_sync_ssl_name host from zone_sync_server;
Context: stream, server
This directive appeared in version 1.15.7.

클러스터 서버 인증서를 인증하는 데 사용하고 클러스터 서버와의 연결을 설정할 때 SNI를 통해 전달되는 서버 이름을 재정의할 수 있습니다.

기본적으로 zone_sync_server 주소의 호스트 부분을 사용하거나, resolve 매개변수를 지정한 경우에는 변환된 IP 주소를 사용합니다.

Syntax:  zone_sync_ssl_password_file file;
Default: —
Context: stream, server

시크릿 키에 대한 패스프레이즈가 포함된 file을 지정합니다. 각 패스프레이즈는 별도의 행으로 지정합니다. 키를 로딩할 때 순서대로 패스프레이즈를 시도합니다.

Syntax:  zone_sync_ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2] [TLSv1.3];
Default: zone_sync_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Context: stream, server

다른 클러스터 서버 연결에 지정된 프로토콜을 활성화합니다.

Syntax:  zone_sync_ssl_server_name on | off;
Default: zone_sync_ssl_server_name off;
Context: stream, server
This directive appeared in version 1.15.7.

다른 클러스터 서버와 연결을 설정할 때 TLS Server Name Indication 확장 프로그램(SNI, RFC 6066)을 통해 서버 이름을 전달하도록 활성화하거나 비활성화합니다.

Syntax:  zone_sync_ssl_trusted_certificate file;
Default: —
Context: stream, server

다른 클러스터 서버의 인증서를 인증하는 데 사용된 신뢰할 수 있는 CA 인증서를 PEM 형식으로 포함한 file을 지정합니다.

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

다른 클러스터 서버 인증서의 인증을 활성화하거나 비활성화합니다.

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

다른 클러스터 서버 인증서 체인에서 인증 깊이를 설정합니다.

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

다른 클러스터 노드 연결에서 두 개의 연속적 읽기 또는 쓰기 작업 사이의 timeout을 설정합니다. 이 시간 동안 전송되는 데이터가 없을 경우, 연결이 종료됩니다.

API 엔드포인트

노드 상태 동기화는 API의 /stream/zone_sync/ 엔드포인트를 통해 제공되며, 다음의 메트릭이 반환됩니다.

클러스터 노드 시작, 중단, 제거

새 노드를 시작하려면 새 노드의 IP 주소로 클러스터 호스트 이름의 DNS 레코드를 업데이트하고 인스턴스를 시작합니다. 새 노드가 DNS 또는 고정 구성에서 다른 노드를 발견하고, 업데이트를 보내기 시작할 것입니다. 다른 노드에서도 DNS를 사용하는 새 노드를 발견하고, 업데이트를 푸시하기 시작합니다. 고정 구성의 경우, 다른 노드를 다시 노드해야 새 노드에 업데이트를 전송합니다.

노드를 중단하려면 QUIT 신호를 인스턴스로 보냅니다. 노드가 영역 동기화를 중단하고, 열린 연결을 적절히 종료합니다.

노드를 제거하려면 클러스터 호스트 이름의 DNS 레코드를 업데이트하고 노드의 IP 주소를 제거합니다. 그 외에 다른 노드도 해당 노드가 제거된 것을 발견하고, 해당 노드에 대한 연결을 종료한 후 더 이상 연결을 시도하지 않습니다. 노드가 제거된 후에는 위에서 설명한 방법으로 중단할 수 있습니다. 고정 구성의 경우, 다른 노드를 다시 로드해야 제거된 노드로 업데이트를 전송하지 않습니다.