복제본 세트는 투표를 통해 어떤 설정하다 멤버가 프라이머리 될지 결정합니다. 복제본 세트는 다음과 같은 다양한 이벤트에 대한 응답으로 투표 트리거하다 할 수 있습니다.
복제본 세트에 새 노드를 추가하고,
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로 변경합니다.priority2}가 0보다 큰 멤버는 0 를 가질 수votes없습니다.
투표권 있는 노드가 특정 상태에 있을 때만 투표할 수 있습니다.
과반수 투표를 가장 먼저 얻은 멤버가 새로운
PRIMARY이(가) 됩니다.복제본 세트 멤버는 설정하다 에 표시된
PRIMARY노드 중 optime 가장 높은 경우를 제외하고는 이(가) 될 수 없습니다.
투표권이 없는 노드
투표권이 없는 노드는 선거에서 투표하지 않지만, 복제본 세트의 데이터 사본을 유지하며 클라이언트 애플리케이션으로부터의 읽기 요청을 처리할 수 있습니다.
복제본 세트는 최대 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" : Long(0), "votes" : 0 }
중요
어떤 멤버가 프라이머리가 될 것인지를 결정하기 위해 투표 수를 변경 하지 마세요. 대신 members[n].priority 옵션을 수정합니다. 예외적인 경우에만 투표 수를 변경할 수 있습니다. 예를 들어, 7명 이상의 멤버를 허용하기 위한 경우입니다.
투표권이 없는 노드를 구성하려면 투표권이 없는 자체 관리형 복제본 세트 노드 구성을 참조하세요.