복제본 세트 선거
복제본 세트는 투표를 통해 어떤 세트 멤버가 프라이머리 멤버가 될지 결정합니다. 복제본 세트는 다음과 같은 다양한 이벤트에 대한 응답으로 투표를 트리거할 수 있습니다.
복제본 세트에 새 노드를 추가하고,
rs.stepDown()
또는rs.reconfig()
등의 메서드를 사용하여 복제본 세트 유지 관리를 수행합니다.구성된
timeout
(기본적으로 10초) 이상 보조 노드가 프라이머리와 연결이 끊어지는 경우입니다.
다음 다이어그램에서 프라이머리 노드는 configured timeout
보다 오랫동안 사용할 수 없었으며 자동 페일오버 프로세스를 트리거합니다. 나머지 세컨더리 노드 중 하나는 프라이머리를 선택하고 자동으로 정상 운영을 재개하는 투표를 호출합니다.
복제본 세트는 투표가 성공적으로 완료될 때까지 쓰기 작업을 처리할 수 없습니다. 이러한 쿼리가 세컨더리에서 실행되도록 구성된 경우 복제본 세트는 읽기 쿼리를 계속 제공할 수 있습니다.
클러스터가 새 프라이머리를 선택하기까지의 시간 중앙값은 기본값 replica
configuration settings
을 가정할 때 일반적으로 12초를 초과하지 않아야 합니다. 여기에는 프라이머리을 사용 불가로 표시하고 투표를 호출하여 완료하는 데 필요한 시간이 포함됩니다. settings.electionTimeoutMillis
복제 구성 옵션을 수정하여 이 기간을 조정할 수 있습니다. 네트워크 지연 시간 등 여러 요인으로 인해 복제본 세트 선택을 마치는 데 필요한 시간이 길어질 수 있습니다. 이렇게 되면 결국 프라이머리 노드 없이 클러스터가 작동할 수 있는 시간의 양에 영향을 미칠 수 있습니다. 이러한 요인들은 특정 클러스터 아키텍처에 따라 달라집니다.
애플리케이션 연결 로직에는 자동 페일오버 및 후속 투표에 대한 허용 범위가 포함되어야 합니다. MongoDB 드라이버는 프라이머리의 손실을 감지하고 특정 쓰기 작업을 한 번만 자동으로 재시도할 수 있으며, 자동 페일오버 및 투표에 대한 추가 기본 처리 기능을 제공합니다.
호환 가능한 드라이버는 기본적으로 재시도 가능 쓰기를 활성화
투표에 영향을 미치는 요인 및 조건
복제 선거 프로토콜
복제 protocolVersion: 1
은 복제본 세트 페일오버 시간을 줄이고 여러 개의 동시 프라이머리를 더 빠르게 감지합니다.
catchUpTimeoutMillis
를 사용하여 빠른 장애 조치와 w:1
쓰기 보존 사이에서 우선 순위를 정할 수 있습니다.
pv1
에 대한 자세한 내용은 자체 관리 복제본 세트 프로토콜 버전을 참조하세요.
하트비트
복제본 세트 노드는 서로에게 2초마다 핑을 보냅니다. 하트비트가 10초 이내에 반환되지 않으면 다른 노드는 해당 노드를 액세스할 수 없는 것으로 표시합니다.
노드 우선순위
복제본 세트에 안정적인 프라이머리가 설정되면, 선거 알고리즘은 가장 높은 priority
를 가진 보조 노드가 선거를 호출하도록 "최선의 노력"을 시도합니다. 노드의 우선 순위는 선거의 시기와 결과에 모두 영향을 미칩니다. 우선 순위가 높은 보조 노드는 우선 순위가 낮은 보조 노드보다 상대적으로 더 빨리 선거를 호출하며, 당선될 가능성도 더 높습니다. 그러나 우선 순위가 낮은 인스턴스도 우선 순위가 높은 보조 노드가 사용 가능할 때라도 짧은 기간 동안 프라이머리로 선출될 수 있습니다. 복제본 집합 노드는 사용 가능한 가장 높은 우선 순위 노드가 프라이머리가 될 때까지 선택을 계속 호출합니다.
우선 순위 값이 0
인 멤버는 프라이머리가 될 수 없으며 투표에 출마할 수 없습니다. 자세한 내용은 우선 순위 0 복제본 세트 멤버를 참조하세요.
미러링된 읽기
MongoDB는 가장 최근에 액세스한 데이터를 사용하여 사전 준비 선택 가능한 세컨더리 멤버의 캐시에 미러링 된 읽기를 제공합니다. 미러링 된 읽기를 사용하면 프라이머리는 수신한 작업의 하위 집합을 미러링하여 선택 가능한 세컨더리의 하위 집합으로 전송할 수 있습니다. 세컨더리 캐시를 미리 준비하면 선택 후 성능을 더 빠르게 복원하는 데 도움이 될 수 있습니다.
자세한 내용은 미러링된 읽기를 참조하세요.
데이터 센터 손실
분산된 복제본 세트의 경우, 데이터 센터가 손실되면 다른 데이터 센터 또는 데이터 센터의 나머지 노드가 프라이머리를 선출하는 데 영향을 미칠 수 있습니다.
가능하면 복제본 세트 멤버를 데이터 센터에 분산하여 데이터 센터가 손실되더라도 나머지 복제본 세트 멤버 중 하나가 새로운 프라이머리가 될 수 있는 가능성을 극대화하세요.
네트워크 파티션
네트워크 파티션 은 프라이머리를 소수의 노드가 있는 파티션으로 격리할 수 있습니다. 프라이머리 노드가 복제본 세트의 소수 노드만 볼 수 있다고 판단하면, 그 노드는 프라이머리 자리에서 물러나 보조 노드가 됩니다. 별도로, majority
의 노드(자신 포함)와 연결 가능한 파티션의 노드가 새 프라이머리가 되기 위한 선거를 시작합니다.
투표권이 있는 회원
복제본 세트 멤버 구성 설정 members[n].votes
및 멤버 state
에 따라 멤버의 투표 여부가 결정됩니다.
members[n].votes
설정이 1로 설정된 모든 복제본 세트 노드는 선거에서 투표권을 갖습니다. 어떤 노드의 선거 선거 참여를 배제하려면 해당 노드의members[n].votes
구성 값을0
로 변경합니다.priority
2}가 0보다 큰 멤버는 0 를 가질 수votes
없습니다.
투표권 있는 노드가 특정 상태에 있을 때만 투표할 수 있습니다.
투표권이 없는 노드
투표권이 없는 노드는 선거에서 투표하지 않지만, 복제본 세트의 데이터 사본을 유지하며 클라이언트 애플리케이션으로부터의 읽기 요청을 처리할 수 있습니다.
복제본 세트는 최대 50개의 멤버를 보유할 수 있지만 투표권은 7개만 가질 수 있으므로, 투표권이 없는 멤버는 복제본 세트에 7개 이상의 멤버를 보유할 수 있도록 허용합니다.
투표권이 없는 경우(예 votes
{ 2}는 0
) 멤버는 priority
이 0이어야 합니다.
예를 들어, 아홉개의 노드로 구성된 복제본 세트 중 노드 일곱 개는 투표권이 있고, 나머지 두 개는 투표권이 없습니다.
투표권이 없는 멤버는 votes
와 priority
가 모두 0
입니다.
{ "_id" : <num>, "host" : <hostname:port>, "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { }, "secondaryDelaySecs" : NumberLong(0), "votes" : 0 }
중요
어떤 멤버가 프라이머리가 될 것인지를 결정하기 위해 투표 수를 변경 하지 마세요. 대신 members[n].priority
옵션을 수정합니다. 예외적인 경우에만 투표 수를 변경할 수 있습니다. 예를 들어, 7명 이상의 멤버를 허용하기 위한 경우입니다.
투표권이 없는 노드를 구성하려면 투표권이 없는 자체 관리형 복제본 세트 노드 구성을 참조하세요.