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
영역 내용을 푸시하는 데 사용하는 영역별 버퍼의 number와 size를 설정합니다. 기본적으로 버퍼 크기는 메모리 페이지 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 size에 number를 곱한 값과 같아야 합니다.
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 주소를 제거합니다. 그 외에 다른 노드도 해당 노드가 제거된 것을 발견하고, 해당 노드에 대한 연결을 종료한 후 더 이상 연결을 시도하지 않습니다. 노드가 제거된 후에는 위에서 설명한 방법으로 중단할 수 있습니다. 고정 구성의 경우, 다른 노드를 다시 로드해야 제거된 노드로 업데이트를 전송하지 않습니다.