문제

관련된 노드를 다시 시작하지 않고 MNENSIA 클러스터의 네트워크 파티션에서 복구 할 수 있습니까? 그렇다면 어떻게해야합니까?

특히 알고있는 데 관심이 있습니다.

  • 표준 OTP MNENSIA (v4.4.7)로이를 수행 할 수있는 방법
  • 이런 일을하기 위해 작성 해야하는 사용자 정의 코드 (예 : MNESIA Running_Paritioned_network 이벤트를 구독하고, 새 마스터를 결정하고, 비 마스터에서 마스터로, 새로운 마스터에서 강제로드 테이블을 병합하고, 분명한 실행 된 페리터드 네트워크 이벤트- 예제 코드는 크게 감사 할 것입니다).
  • 또는 MNESIA는 범주 적으로 온라인 복구를 지원하지 않으며 비 마스터 파티션의 일부인 노드가 다시 시작되어야합니다.

일반 분산 시스템 이론에 대한 포인터에 감사하지만,이 질문에서 나는 Erlang/OTP Mnesia에만 관심이 있습니다.

도움이 되었습니까?

해결책

약간의 실험 후 다음을 발견했습니다.

  • MNESIA는 두 노드 사이에 노드 연결이 끊기고 MNESIA 재시작없이 재 연결되는 경우 네트워크를 분할 할 것으로 간주했습니다.
  • 분리 시간 동안 미네소아 읽기/쓰기 작업이 발생하지 않더라도 마찬가지입니다.
  • 분할 된 네트워크 이벤트를 지우려면 MNESIA 자체를 다시 시작해야합니다. force_load_table 네트워크가 분할 된 후
  • 네트워크 파티셔닝 이벤트를 지우려면 MNESIA 만 다시 시작해야합니다. 전체 노드를 다시 시작할 필요가 없습니다.
  • MNESIA는 새로 다시 시작된 MNENSIA 노드가 다른 MNESIA 노드 (시작 테이블로드 알고리즘)의 데이터로 테이블 데이터를 덮어 쓰면 네트워크 파티셔닝을 해결합니다.
  • 일반적으로 노드는 가장 길었던 노드에서 테이블을 복사합니다 (이것은 내가 본 동작이었습니다. 나는 이것이 다른 무언가의 부작용이 아니라 명시 적으로 코딩 된 것을 확인하지 않았습니다). 클러스터에서 노드를 분리하고 두 파티션 (분리 된 노드 및 기존 피어)에서 쓰기를 작성하고 모든 노드를 종료 한 후 다시 시작된 노드를 다시 시작하면 연결 해제 된 노드가 마스터와 그로 간주됩니다. 데이터는 다른 모든 노드를 덮어 씁니다. 테이블 비교/체크 덤밍/쿼럼 동작이 없습니다.

그래서 내 질문에 답하기 위해, 실행하여 반 온라인 복구를 수행 할 수 있습니다. mnesia:stop(), mnesia:start() 파티션의 노드에서 데이터를 폐기하기로 결정한 데이터 (이는 잃어버린 파티션이라고 부릅니다). 실행 mnesia:start() 호출은 노드가 파티션의 다른쪽에있는 노드에 접촉하게됩니다. 파티션이 잃어버린 노드에 둘 이상의 노드가있는 경우, 승리 파티션에서 테이블로드의 마스터 노드를 노드에 노드로 설정할 수 있습니다. 그렇지 않으면 잃어버린 파티션에서 다른 노드에서 테이블을로드 할 가능성이 있다고 생각합니다. 분할 된 네트워크 상태로 돌아갑니다.

불행히도 MNESIA는 시작 테이블로드 단계에서 테이블 내용을 병합/조정에 대한 지원을 제공하지 않으며 일단 시작되면 테이블로드 단계로 돌아가는 것을 제공하지 않습니다.

노드에는 여전히 사용자 연결이 있으므로 어떤 사용자 레코드가 소유하고 있는지/클러스터 당 하나의 사용자 onneciton을 가정 할 경우)가 가장 최신 인 사용자 레코드를 알고 있기 때문에 병합 단계는 특히 Ejabberd에 적합합니다. 병합 단계가 존재하는 경우 노드는 userData 테이블을 필터링하고 연결된 사용자의 모든 레코드를 저장하고 평소에 따라 테이블을로드 한 다음 저장된 레코드를 MNENSIA 클러스터에 다시 작성할 수 있습니다.

다른 팁

사라의 대답은 훌륭합니다. . MNESIA 개발자는 ca를 위해 P를 희생합니다. P가 필요하다면 희생을 원하는 캡을 선택하고 다른 스토리지를 선택해야합니다. 예를 들어 couchdb (희생) 또는 Scalaris (희생 a).

이와 같이 작동합니다. 하늘이 새로 가득 찬 상상해보십시오. 새들이 모든 새를 얻을 때까지 사진을 찍으십시오. 사진을 테이블 위에 놓으십시오. 서로 사진을 맵핑하십시오. 그래서 당신은 모든 새를 한 번만 볼 수 있습니다. 당신은 모든 새를합니까? 확인. 그렇다면 그 당시에는 알고 있습니다. 시스템은 안정적이었습니다. 모든 새들이 (메시지)처럼 들리는 것을 녹음하고 더 많은 사진을 찍으십시오. 그런 다음 반복하십시오.

노드 분할이있는 경우. 최신 일반적인 안정적인 스냅 샷으로 돌아갑니다. 그리고 그 후에 어떤 부족을 재생하려고 **를 시도하십시오. :)

"분산 스냅 샷 : 분산 시스템의 글로벌 상태 결정"K. Mani Chandy 및 Leslie Lamport에 더 잘 설명되어 있습니다.

** 나는 무슨 일이 일어 났는지 재생하려고 할 때 누가 시계를 따라야하는지 결정하는 데 문제가 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top