리더가 실제로 클라이언트에게 ACK를 보내는 시점을 이해하는 데 어려움이 있습니다.리더가 DistributedLog에서 클라이언트에게 ACK를 보내는시기는 언제입니까?
로그 세그먼트에 부가 각 일괄 엔트리가 로그 세그먼트 라이터에 의해 일정하게 증가 항목 ID가 할당 될 것이다 : 여기 DistributedLog documentation의 일부이다. 모든 항목은 파이프 라인에 비동기 적으로 기록됩니다. 따라서 로그 세그먼트 writer는 LAP (LastAddPushed)이라는 메모리 내 포인터를 업데이트합니다.이 포인터는 작성자가 로그 세그먼트 저장소에 푸시 한 마지막 일괄 처리 항목 의 항목 ID입니다. 항목은 순서로 작성되었지만 항목 ID 순서로만 승인 될 수 있습니다. 성공적인 승인과 함께 과 함께 로그 세그먼트 작성자는 LAC (LastAddConfirmed)라고하는 메모리 내 포인터 도 업데이트합니다. LAC는 작가가 이미 확인한 마지막 항목의 항목입니다. LAC와 LAP 사이에 쓰여진 모든 항목은 수신 확인되지 않은 데이터이므로 독자에게는 보이지 않습니다.
독자는 이러한 항목이 가 튼튼 복제에 알려진대로 LAC까지 항목을 읽을 수 있습니다 -하여 안전하게 읽기 순서를 위반 의 위험없이 읽을 수 있습니다. 작성자는 BookKeeper에 보내는 각 항목에 현재 LAC를 포함시킵니다. 따라서 각 후속 항목 은 이전 항목의 레코드를 독자가 볼 수있게합니다. LAC 업데이트는 작성자가 작성한 다음 항목에 피기 백될 수 있습니다. 독자는 엄격하게 추종자이기 때문에 라이터와 의사 소통 또는 조정없이 복제본에서 내구성있는 데이터를 읽으려면 LAC를 활용할 수 있습니다 ( ).
DL은 제어 레코드라고하는 한 유형의 시스템 레코드를 도입합니다.이 레코드는 2 단계 커밋 알고리즘에서 커밋 요청으로 작동합니다. 응용 프로그램 레코드가 지정된 SLA 내에 도착하지 않으면 작성자 이 제어 레코드를 생성합니다. 제어 레코드를 쓰면 은 로그 스트림의 LAC를 처리합니다. 제어 레코드는 사용자 레코드를 쓰는 중 승인을받은 직후 또는 응용 프로그램 레코드가 추가되지 않은 경우 주기적으로 이 추가됩니다. 작가의 플러싱 정책의 일환으로 구성된 입니다. 제어 로그 레코드가 실제 로그 스트림에 존재하는 동안 응용 프로그램 로그 판독기에서 배달되지 않습니다.
지금 다음 시나리오를 고려하십시오
- 리더
- 팔로워 메시지를 얻을 회계하는 메시지를 게시, 로그 리더는 추종자 증가에서 확인를 얻을 수
- 지도자에게 ACK를 보내 추가 LAC 및 메시지가 커밋 된 클라이언트에 응답합니다.
- NOW : 리더가 LAC 이 증가 된 팔로어에게 피기 백하기 전에 실패합니다.
- 질문입니다 : 잠재적 인 지도자가 LAC가 증가 된 사실 을 인식하지 않기 때문에, 그것은 새로운 지도자가되어 우리가 에있는 로그 항목을 잃은 의미 오래된 LAC에 대한 로그를 자릅니다 이전 지도자에 의해 확인되었습니다.
결과적으로 클라이언트는 메시지가 성공적으로 작성되었지만 메시지가 손실되었음을 확인했습니다.