Azure Cosmos DB SQL SDK 연결 모드
적용 대상: NoSQL
클라이언트가 Azure Cosmos DB에 연결하는 방법은 특히 관찰되는 클라이언트 쪽 대기 시간 측면에서 성능에 중요한 영향을 미칩니다. Azure Cosmos DB는 HTTPS를 통해 게이트웨이 모드라고 하는 단순한 개방형 RESTful 프로그래밍 모델을 제공합니다. 또한 통신 모델에서 REST를 지원하기도 하며 초기 인증 및 암호화 트래픽에 직접 모드라고도 하는 TLS를 사용하는 효율적인 TCP 프로토콜을 제공합니다.
사용 가능한 연결 모드
사용 가능한 두 연결 모드는 다음과 같습니다.
게이트웨이 모드
게이트웨이 모드는 모든 SDK 플랫폼에서 지원됩니다. 애플리케이션이 엄격한 방화벽으로 제한된 회사 네트워크 내에서 실행되는 경우 표준 HTTPS 포트 및 단일 DNS 엔드포인트를 사용하므로 게이트웨이 모드를 선택하는 것이 가장 좋습니다. 그러나 게이트웨이 모드의 경우 성능 유지를 위해 Azure Cosmos DB에서 데이터를 읽거나 쓸 때마다 네트워크 홉이 추가됩니다. 또한 소켓 연결 수가 제한된 환경에서 애플리케이션을 실행할 때 게이트웨이 연결 모드를 권장합니다.
특히 소비 플랜에서 Azure Functions SDK를 사용하는 경우 연결에 대한 현재 제한 사항을 알고 있어야 합니다.
직접 모드
직접 모드는 TCP 프로토콜을 통한 연결을 지원하고, 초기 인증을 위해 TLS를 사용하고, 트래픽을 암호화하며, 네트워크 홉 수가 적기 때문에 더 나은 성능을 제공합니다. 애플리케이션은 백 엔드 복제본에 직접 연결됩니다. 직접 모드는 현재 .NET 및 Java SDK 플랫폼에서만 지원됩니다.
이러한 연결 모드는 기본적으로 데이터 플레인 요청(문서 읽기 및 쓰기)을 클라이언트 머신에서 Azure Cosmos DB 백 엔드의 파티션으로 가져오는 조건을 경로에 지정합니다. 직접 모드는 최상의 성능을 위한 기본 설정 옵션입니다. 즉 이를 통해 클라이언트는 Azure Cosmos DB 백 엔드에서 직접 파티션에 대한 TCP 연결을 열고 중간자 없이 요청을 직접 보낼 수 있습니다. 반대로 게이트웨이 모드에서는 클라이언트의 요청이 Azure Cosmos DB 프런트 엔드의 "게이트웨이" 서버로 라우팅된 다음, Azure Cosmos DB 백 엔드에서 적절한 파티션으로 전달됩니다.
서비스 포트 범위
직접 모드를 사용하는 경우 Azure Cosmos DB는 동적 TCP 포트를 사용하기 때문에 클라이언트가 10000에서 20000 사이의 포트에 액세스할 수 있는지 확인해야 합니다. 게이트웨이 포트에 추가됩니다. 프라이빗 엔드포인트에서 직접 모드를 사용하는 경우 TCP 포트의 전체 범위(0-65535)가 Azure Cosmos DB에서 사용될 수 있습니다. 이러한 포트가 클라이언트에서 열려 있지 않은 상태에서 TCP 프로토콜을 사용하려고 하면 503 서비스를 사용할 수 없음 오류가 발생할 수 있습니다.
다음 표에서는 각 API에 사용되는 다양한 API 및 서비스 포트에 사용할 수 있는 연결 모드를 요약해서 설명합니다.
연결 모드 | 지원되는 프로토콜 | 지원되는 SDK | API/서비스 포트 |
---|---|---|---|
게이트웨이 | HTTPS | 모든 SDK | SQL(443), MongoDB(10255), Table(443), Cassandra(10350), Graph(443) |
Direct | TCP(TLS를 통해 암호화됨) | .NET SDK Java SDK | 퍼블릭/서비스 엔드포인트를 사용하는 경우: 10000-20000 범위의 포트 프라이빗 엔드포인트를 사용하는 경우: 0-65535 범위의 포트 |
직접 모드 연결 아키텍처
소개에 자세히 설명된 것처럼 직접 모드 클라이언트는 TCP 프로토콜을 통해 백 엔드 노드에 직접 연결합니다. 각 백 엔드 노드는 물리적 파티션에 속하는 복제본 세트의 복제본을 나타냅니다.
라우팅
직접 모드에서 Azure Cosmos DB SDK가 작업을 수행하는 경우 연결할 백 엔드 복제본을 확인해야 합니다. 첫 번째 단계는 작업이 이동해야 하는 물리적 파티션을 파악하는 것이며, 이를 위해 SDK는 게이트웨이 노드에서 파티션 키 정의를 포함하는 컨테이너 정보를 가져옵니다. 또한 복제본의 TCP 주소를 포함하는 라우팅 정보도 필요합니다. 라우팅 정보는 게이트웨이 노드에서도 사용할 수 있으며 둘 다 컨트롤 플레인 메타데이터로 간주됩니다. SDK가 라우팅 정보를 가져오면 대상 물리적 파티션에 속한 복제본에 대한 TCP 연결을 열고 작업을 실행할 수 있습니다.
각 복제본 세트에는 주 복제본 1개와 보조 복제본 3개가 포함됩니다. 쓰기 작업은 항상 주 복제본 노드로 라우팅되지만 읽기 작업은 주 노드 또는 보조 노드에서 제공될 수 있습니다.
컨테이너 및 라우팅 정보는 자주 변경되지 않으므로 후속 작업에서 이 정보를 활용할 수 있도록 SDK에 로컬로 캐시됩니다. 이미 설정된 TCP 연결도 작업 간에 재사용됩니다. SDK 옵션을 통해 달리 구성하지 않는 한 SDK 인스턴스의 수명 동안 연결이 영구적으로 유지됩니다.
분산 아키텍처와 마찬가지로 복제본을 보유하는 머신은 업그레이드 또는 유지 관리를 수행할 수 있습니다. 이 서비스는 복제본 집합이 일관성을 유지하도록 보장하지만 복제본이 이동하면 기존 TCP 주소가 변경됩니다. 이러한 경우 SDK는 라우팅 정보를 새로 고치고 새 게이트웨이 요청을 통해 새 주소에 다시 연결해야 합니다. 이러한 이벤트는 전체 P99 SLA에 영향을 미치지 않아야 합니다.
연결 볼륨
각 물리적 파티션에는 4개의 복제본으로 구성된 복제본 세트가 있으며, 최상의 성능을 제공하기 위해 SDK는 쓰기 및 읽기 작업을 혼합하는 워크로드에 대해 모든 복제본에 대한 연결을 열게 됩니다. 동시 작업은 각 복제본이 제공하는 처리량을 활용하기 위해 기존 연결 간에 부하가 분산됩니다.
SDK가 여는 TCP 연결 수를 결정하는 두 가지 요소가 있습니다.
물리적 파티션 수
안정적인 상태에서 SDK는 물리적 파티션당 복제본당 하나의 연결을 갖습니다. 컨테이너의 물리적 파티션 수가 많을수록 열린 연결 수가 많아집니다. 작업이 여러 파티션 간에 라우팅되면 요청 시 연결이 설정됩니다. 그러면 평균 연결 수는 물리적 파티션의 4배가 됩니다.
동시 요청 볼륨
설정된 각 연결은 구성 가능한 수의 동시 작업을 제공할 수 있습니다. 동시 작업의 볼륨이 이 임계값을 초과하면 새 연결이 이를 제공하기 위해 열리고 실제 파티션의 경우 열린 연결 수가 안정적인 상태 수를 초과할 수 있습니다. 이 동작은 운영 볼륨이 급증할 수 있는 워크로드에 대해 예상됩니다. .NET SDK의 경우 이 구성은 CosmosClientOptions.MaxRequestsPerTcpConnection에 의해 설정되고 Java SDK의 경우 DirectConnectionConfig.setMaxRequestsPerConnection을 사용하여 사용자 지정할 수 있습니다.
기본적으로 연결은 향후 작업의 성능에 도움이 되도록 영구적으로 유지 관리됩니다(연결을 열면 계산 오버헤드가 있음). 향후 작업에 약간 영향을 줄 수 있다는 점을 이해하기 위해 한동안 사용되지 않는 연결을 닫을 수 있는 몇 가지 시나리오가 있을 수 있습니다. .NET SDK의 경우 이 구성은 CosmosClientOptions.IdleTcpConnectionTimeout에 의해 설정되고 Java SDK의 경우 DirectConnectionConfig.setIdleConnectionTimeout을 사용하여 사용자 지정할 수 있습니다. 연결이 자주 닫혀 전반적인 성능에 영향을 줄 수 있으므로 이러한 구성을 낮은 값으로 설정하지 않는 것이 좋습니다.
언어별 구현 세부 정보
언어에 대한 자세한 구현 정보는 다음을 참조하세요.
다음 단계
특정 SDK 플랫폼 성능 최적화:
Azure Cosmos DB로 마이그레이션하기 위한 용량 계획을 수행하려고 하시나요? 용량 계획을 위해 기존 데이터베이스 클러스터에 대한 정보를 사용할 수 있습니다.
- 기존 데이터베이스 클러스터의 vCore 및 서버 수만을 알고 있는 경우, vCore 또는 vCPU를 사용하여 요청 단위 추정을 참조하세요
- 현재 데이터베이스 워크로드에 대한 일반적인 요청 비율을 알고 있는 경우 Azure Cosmos DB 용량 계획 도구를 사용하여 요청 단위 예측에 대해 읽어보세요.