서버 선택 및 모니터링
이 페이지의 내용
서버 선택 및 모니터링
작업을 실행하려면 먼저 MongoDB PHP 라이브러리가 토폴로지 에서 서버 를 선택해야 합니다(예: 복제본 세트, 샤딩된 클러스터). 서버 를 선택하려면 토폴로지 를 정확하게 확인해야 하므로 확장 프로그램은 연결된 서버를 정기적으로 모니터링합니다.
대부분의 다른 드라이버에서는 서버 검색 및 모니터링 이 배경 스레드에서 처리됩니다. 그러나 PHP 운전자 는 단일 스레드이므로 애플리케이션 에서 시작된 작업 사이 에 모니터링 을 수행해야 합니다.
다음 예시 애플리케이션을 사용할 수 있습니다.
/** * When constructing a Client, the library creates a MongoDB\Driver\Manager * object from the extension. In turn, the extension will either create a * libmongoc client object (and persist it according to the constructor * parameters) or re-use a previously persisted client. * * Assuming a new libmongoc client was created, the host name(s) in the * connection string must be resolved via DNS. Likewise, if the connection * string includes a mongodb+srv scheme, SRV/TXT records must be resolved. * Following DNS resolution, the driver should then have a list of one or * more hosts to which it can connect. This is referred to as the seed list. * * If a previously persisted client was re-used, no DNS resolution is needed * and there will likely already be connections and topology state associated * with the client. * * Drivers perform no further IO when constructing a client, so control is * returned the the PHP script. */ $client = new MongoDB\Client('mongodb://a.example.com:27017/?replicaSet=rs0'); /** * The library creates a MongoDB\Database object from the Client. This does * not entail any IO, as the Database and Collection objects only associate * a database or namespace with a Client object, respectively. */ $database = $client->test; /** * The library creates an internal object for this operation and must select * a server to use for executing that operation. * * If this is the first operation on the underlying libmongoc client, it must * first discover the topology. It does so by establishing connections to any * host(s) in the seed list (this may entail TLS and OCSP verification) and * issuing "hello" commands. * * In the case of a replica set, connecting to a single host in the seed list * should allow the driver to discover all other members in the replica set. * In the case of a sharded cluster, the driver will start with an initial * seed list of mongos hosts and, if SRV polling is utilized, may discover * additional mongos hosts over time. * * If the topology was already initialized (i.e. this is not the first * operation on the client), the driver may still need to perform monitoring * (i.e. "hello" commands) and refresh its view of the topology. This process * may entail adding or removing hosts from the topology. * * Once the topology has been discovered and any necessary monitoring has * been performed, the driver may select a server according to the rules * outlined in the server selection specification (e.g. applying a read * preference, filtering hosts by latency). */ $database->command(['ping' => 1]);
애플리케이션은 단지 몇 줄의 PHP로 구성되어 있지만 백그라운드에서 상당한 양의 처리가 진행됩니다! 관심이 있는 분은 이 프로세스에 대한 보다 자세한 설명을 제공하는 다음 문서를 참조하세요.
단일 스레드 모드 libmongoc 문서에서
MongoDB Server 검색 및 모니터링 사양
MongoDB 서버 선택 사양
연결 문자열 옵션
서버 선택 및 모니터링 과 관련된 몇 가지 연결 string 옵션이 있습니다.
connectTimeoutMS
connectTimeoutMS
서버 연결 설정 제한 과 서버 모니터링(hello
명령)을 위한 소켓 시간 초과 모두에 대한 제한을 지정합니다. PHP와 같은 단일 스레드 드라이버의 기본값은 10초입니다.
모니터링 중에 서버 가 시간 초과되면 최소 5초까지 다시 확인되지 않습니다(쿨다운MS)가 경과했습니다. 이 시간 제한은 오류 후 각 후속 스캔에서 단일 스레드 드라이버가 connectTimeoutMS
에 대해 차단 하는 것을 방지하기 위한 것입니다.
애플리케이션은 이 옵션을 클러스터에 있는 서버 간 최대 지연 시간보다 약간 더 길게 설정할 수 있습니다. 예를 들어 PHP 애플리케이션 서버와 데이터베이스 서버 간의 최대 ping
시간이 200ms인 경우 제한 시간을 1초로 지정하는 것이 합리적일 수 있습니다. 이렇게 하면 연결을 설정하고 액세스 가능한 서버를 모니터링하는 데 충분한 시간을 확보하는 동시에 액세스 불가능한 서버를 감지하는 시간도 크게 줄일 수 있습니다.
heartbeatFrequencyMS
heartbeatFrequencyMS
모니터링 발생 빈도를 결정합니다. 단일 스레드 드라이버의 경우 기본값은 60초이며 최저 500ms로 설정할 수 있습니다.
serverSelectionTimeoutMS
serverSelectionTimeoutMS
서버 선택 루프에서 보낼 수 있는 최대 시간을 결정합니다. 기본값은 30초이지만 serverSelectionTryOnce
가 true
이고 더 작은 connectTimeoutMS
값이 적용되는 경우 애플리케이션이 더 빨리 실패합니다.
원래의 기본값 은 복제본 세트 투표를 완료하는 데 훨씬 더 오랜 시간이 걸렸을 때 설정되었습니다. 애플리케이션은 이 옵션을 투표 의 예상 완료 시간보다 약간 더 길게 설정할 수 있습니다. 예를 예시, 복제본 세트 투표 에는 투표가 일반적으로 12 초를 초과하지 않는다고 명시되어 있으므로 15초의 제한 시간이 합리적일 수 있습니다. 샤딩된 클러스터 에 연결하는 애플리케이션은 mongos
가 운전자 를 투표로부터 보호하기 때문에 더 작은 값을 여전히 고려할 수 있습니다.
즉, serverSelectionTimeoutMS
은 일반적으로 connectTimeoutMS
보다 작은 값으로 설정하다 해서는 안 됩니다.
서버 선택 시도
serverSelectionTryOnce
는 첫 번째 실패한 서버 선택 시도 후 드라이버를 포기할지, 아니면 serverSelectionTimeoutMS
에 도달할 때까지 계속 기다려야 하는지를 결정합니다. PHP 기본값은 true
이며, 이 경우 서버를 선택할 수 없는 경우 드라이버가 '빠르게 실패'할 수 있습니다(예: 페일오버 중에는 프라이머리가 없음).
기본 동작은 일반적으로 트래픽이 많은 웹 애플리케이션에 바람직합니다. 이는 작업자 프로세스가 서버 선택 루프에서 차단되지 않고 대신 오류 응답을 반환하고 즉시 다른 요청을 처리할 수 있기 때문입니다. 또한 재시도 가능한 읽기 및 쓰기와 같은 다른 드라이버 기능을 통해 애플리케이션이 페일오버와 같은 일시적인 오류를 피할 수 있습니다.
즉, 응답 시간(및 작업자 풀 사용률)보다 복원력을 우선시하는 애플리케이션은 serverSelectionTryOnce
에 false
를 지정할 수 있습니다.
socketCheckIntervalMS
socketCheckIntervalMS
최근에 소켓을 사용하지 않은 경우 소켓을 확인하는 빈도( ping
명령 사용)를 결정합니다. 이 시간은 기본값이 5초로 설정되어 있으며, 단일 스레드 드라이버가 끊긴 연결을 더 잘 복구할 수 있도록 의도적으로 heartbeatFrequencyMS
보다 낮습니다.
socketTimeoutMS
socketTimeoutMS
소켓을 읽거나 쓰는 데 소요되는 최대 시간을 결정합니다. 서버 모니터링은 소켓 시간 제한에 connectTimeoutMS
를 사용하므로 socketTimeoutMS
는 애플리케이션에서 실행하는 작업에만 적용됩니다.
socketTimeoutMS
5 기본값은 분입니다. 그러나 max_execution_time 으로 인해 PHP 웹 요청 이 더 일찍 종료될 수 30 있습니다. 웹 SAPI의 경우 기본값은 초입니다. 기본값 max_execution_time
가 무제한인 CLI 환경에서는 socketTimeoutMS
에 도달할 가능성이 더 높습니다.
참고
socketTimeoutMS
서버 선택 및 모니터링 과 직접 관련이 없습니다. 그러나 이는 다른 옵션과 자주 연결되므로 언급하지 않아도 됩니다.