2017-12-28 21 views
0

리더가 실제로 클라이언트에게 ACK를 보내는 시점을 이해하는 데 어려움이 있습니다.리더가 DistributedLog에서 클라이언트에게 ACK를 보내는시기는 언제입니까?

enter image description here

로그 세그먼트에 부가 각 일괄 엔트리가 로그 세그먼트 라이터에 의해 일정하게 증가 항목 ID가 할당 될 것이다 : 여기 DistributedLog documentation의 일부이다. 모든 항목은 파이프 라인에 비동기 적으로 기록됩니다. 따라서 로그 세그먼트 writer는 LAP (LastAddPushed)이라는 메모리 내 포인터를 업데이트합니다.이 포인터는 작성자가 로그 세그먼트 저장소에 푸시 한 마지막 일괄 처리 항목 의 항목 ID입니다. 항목은 순서로 작성되었지만 항목 ID 순서로만 승인 될 수 있습니다. 성공적인 승인과 함께 과 함께 로그 세그먼트 작성자는 LAC (LastAddConfirmed)라고하는 메모리 내 포인터 도 업데이트합니다. LAC는 작가가 이미 확인한 마지막 항목의 항목입니다. LAC와 LAP 사이에 쓰여진 모든 항목은 수신 확인되지 않은 데이터이므로 독자에게는 보이지 않습니다.

독자는 이러한 항목이 가 튼튼 복제에 알려진대로 LAC까지 항목을 읽을 수 있습니다 -하여 안전하게 읽기 순서를 위반 의 위험없이 읽을 수 있습니다. 작성자는 BookKeeper에 보내는 각 항목에 현재 LAC를 포함시킵니다. 따라서 각 후속 항목 은 이전 항목의 레코드를 독자가 볼 수있게합니다. LAC 업데이트는 작성자가 작성한 다음 항목에 피기 백될 수 있습니다. 독자는 엄격하게 추종자이기 때문에 라이터와 의사 소통 또는 조정없이 복제본에서 내구성있는 데이터를 읽으려면 LAC를 활용할 수 있습니다 ( ).

DL은 제어 레코드라고하는 한 유형의 시스템 레코드를 도입합니다.이 레코드는 2 단계 커밋 알고리즘에서 커밋 요청으로 작동합니다. 응용 프로그램 레코드가 지정된 SLA 내에 도착하지 않으면 작성자 이 제어 레코드를 생성합니다. 제어 레코드를 쓰면 은 로그 스트림의 LAC를 처리합니다. 제어 레코드는 사용자 레코드를 쓰는 중 승인을받은 직후 또는 응용 프로그램 레코드가 추가되지 않은 경우 주기적으로 이 추가됩니다. 작가의 플러싱 정책의 일환으로 구성된 입니다. 제어 로그 레코드가 실제 로그 스트림에 존재하는 동안 응용 프로그램 로그 판독기에서 배달되지 않습니다.

지금 다음 시나리오를 고려하십시오

  1. 리더
  2. 팔로워 메시지를 얻을 회계하는 메시지를 게시, 로그 리더는 추종자 증가에서 확인를 얻을 수
  3. 지도자에게 ACK를 보내 추가 LAC 및 메시지가 커밋 된 클라이언트에 응답합니다.
  4. NOW : 리더가 LAC 이 증가 된 팔로어에게 피기 백하기 전에 실패합니다.
  5. 질문입니다 : 잠재적 인 지도자가 LAC가 증가 된 사실 을 인식하지 않기 때문에, 그것은 새로운 지도자가되어 우리가 에있는 로그 항목을 잃은 의미 오래된 LAC에 대한 로그를 자릅니다 이전 지도자에 의해 확인되었습니다.

결과적으로 클라이언트는 메시지가 성공적으로 작성되었지만 메시지가 손실되었음을 확인했습니다.

답변

1

잠재적 인 리더는 LAC가 증가되었다는 사실을 인식하지 못하기 때문에 새로운 리더가되고 이전 LAC로 로그를 자릅니다. 즉, 이전 LAC가 확인한 로그의 항목을 잃어버린 것입니다 리더.

1) 지도자가 정상적으로 로그를 닫으면, 그것이 쓰고있는 로그 세그먼트를 밀봉한다 :

몇 가지 경우가 있습니다. LAC는 고급 상태가되며 로그 세그먼트 메타 데이터 (메타 데이터 저장소에 저장 됨)의 일부로도 기록됩니다.

2) 리더가 충돌하고 정상적으로 로그를 닫지 않으면 잠재 리더가 나타나면 recovery process을 통과합니다. 새로운 리더는 다음과 같습니다 :

  • a) 이전 리더가 작성한 마지막 로그 세그먼트를 봉인합니다. 봉인 프로세스는 두 부분으로 구성된 회계사 클라이언트에 의해 수행됩니다. (a) 로그 세그먼트를 차단합니다. 펜싱은이 로그 세그먼트에서 더 이상의 쓰기가 발생하지 않도록 강제합니다. (b) 마지막으로 알려진 LAC에서 앞으로 복구를 수행하고 작성되었지만 아직 커밋되지 않은 항목을 복구합니다.

  • b) 마지막 로그 세그먼트를 복구 한 후 새 리더가 항목을 쓰는 새 로그 세그먼트를 엽니 다.

귀하의 질문에 대한 답변입니다.

DistributedLog에는 ICDE 2017에 게시 된 논문도 있습니다. here에서 얻을 수 있습니다.