카산드라의 커밋 로그는 카산드라의 내구성 기록을 제공합니다. Cassandra에 쓸 때 쓰기는 클라이언트에 쓰기가 확인되기 전에 커밋 로그에 추가됩니다. 이것은 클라이언트가 성공적인 응답을 수신하는 모든 쓰기가 커밋 로그에 기록됨을 의미합니다. 쓰기는 또한 현재의 memtable에 대해서도 이루어지며, 결국에는 충분히 클 때 SSTable로 디스크에 기록됩니다. 쓰기가 완료된 후 오랜 시간이 걸릴 수 있습니다.
그러나 성능상의 이유로 커밋 로그는 즉시 디스크에 동기화되지 않습니다. 기본값은주기 모드이며 (cassandra.yaml의 commitlog_sync 매개 변수로 설정) 10 초입니다 (cassandra.yaml의 commitlog_sync_period_in_ms로 설정). 즉, 커밋 로그가 10 초마다 디스크에 동기화됩니다. 이 동작으로 인해 서버의 전원이 꺼지면 최대 10 초 동안 쓰기 작업이 손실 될 수 있습니다. 클러스터에 노드가 여러 개 있고 복제 계수를 1보다 큰 값으로 사용하면 데이터를 손실하기 위해 10 초 내에 여러 노드에 전원을 공급해야합니다.
이 위험 요소 창을 허용 할 수없는 경우 커밋 로그에 일괄 처리 모드를 사용할 수 있습니다. 이 모드는 커밋 로그가 디스크에 동기화 될 때까지 클라이언트에 대한 쓰기를 승인하지 않습니다. 시간 창은 commitlog_sync_batch_window_in_ms에 의해 설정되며 기본값은 50ms입니다. 이렇게하면 쓰기 대기 시간이 크게 늘어나고 처리량도 줄어들 기 때문에 승인 된 쓰기 손실 비용이 많은 경우에만 사용하십시오. 이 모드를 사용할 때는 커밋 로그를 별도의 드라이브에 저장하는 것이 특히 중요합니다.
서버의 전원이 꺼지면 시작시 Cassandra가 해당 memtable을 다시 작성하기 위해 커밋 로그를 재생합니다. 이 프로세스는 많은 양의 무거운 서버에서 초 (아마도 분)가 소요됩니다.
memtables의 데이터가 디스크에 기록되도록하려면 '노드 끄기 플러시'를 실행할 수 있습니다 (노드별로 작동). 이렇게하면 새로운 SSTable이 생성되고 플러시 된 memtables의 데이터를 참조하는 커밋 로그가 삭제됩니다.
상세하고 잘 쓰여진 설명에 감사드립니다. 지금은 훨씬 명확합니다.나는 이것이 나를 좋아하는 다른 초보자들에게도 도움이되기를 바랍니다. – user1680784
'일괄'및 '주기적으로'거꾸로 가질 수있는 것처럼 보입니다 ... 주기적으로 기본 설정이므로 확인을 기다리면 일괄 처리로 전환됩니다. –
@ 리차드 나는이 문제에 직면 해있다. 카산드라 커밋 로그가 손상되었습니다. 어떤 제안? 여기에 질문을 게시했습니다 : http://stackoverflow.com/questions/33304367/cassandra-exiting-due-to-error-while-processing-commit-log-during-initializatio – Dojo