NFS 스레드를 통해 액세스된 파일에서 첫 번째 줄을 추출하는 것이 안전합니까?

NFS 스레드를 통해 액세스된 파일에서 첫 번째 줄을 추출하는 것이 안전합니까?

여러 서버에서 NFS를 통해 디렉터리를 마운트하는 경우 각 서버는 해당 디렉터리에서 특정 파일의 첫 번째 줄을 읽고 삭제하는 프로세스를 실행하며 어떤 줄도 두 번 읽지 않도록 보장할 수 있습니까? 아니면 추출하지 않고 삭제합니까?

분명히 하나의 프로세스만 NFS 마운트 파일에서 작동하도록 허용하는 일종의 뮤텍스를 만들 수 있지만 이를 달성하기 위해 이를 구축할 수 있는 방법이 있습니까?

답변1

여러 서버에서 NFS를 통해 디렉터리를 마운트하는 경우 각 서버는 해당 디렉터리에서 특정 파일의 첫 번째 줄을 읽고 삭제하는 프로세스를 실행하며 어떤 줄도 두 번 읽지 않도록 보장할 수 있습니까? 아니면 추출하지 않고 삭제합니까?

추출하기 쉽지 않은 경우 행이 삭제되지 않도록 보장할 수 있습니다. 단, 삭제하지 마세요. 행을 "추출"하지 않은 한 프로세스에서 행을 삭제하지 않도록 하세요.

행이 한 번만 처리되도록 보장할 수 있나요? 이는 사실이 아닙니다. NFS에는 모든 종류의 타이밍 취약점이 있습니다. 데이터와 메타데이터는 각 클라이언트에 캐시되며 모든 캐싱이 비활성화된 경우에도 네트워크 데이터 전송에 상당한 시간 지연이 발생합니다. 한 서버의 프로세스는 너무 늦을 때까지 무슨 일이 일어나고 있는지 "확인"하지 못할 수 있습니다.

그러나 더 큰 문제를 놓치고 있는 것 같습니다. 파일의 첫 번째 줄을 삭제하려면 파일의 나머지 부분 전체를 다시 작성해야 합니다. 이 파일을 일종의 FIFO로 사용하려는 것 같으므로 파일 끝에 줄을 추가하는 다른 프로세스도 있다고 가정하겠습니다. 여러 클라이언트가 첫 번째 줄을 삭제한 후 전체 파일을 다시 작성할 때 이 접근 방식이 얼마나 효과적이라고 생각하십니까? 심지어만약에클라이언트가 올바르게 동기화되도록 하려면 동기화 클러스터에 쓰기 프로세스를 추가해야 합니다.

첫 줄 없이 전체 파일을 다시 쓰거나 파일 끝에 추가하여 내용을 업데이트하기 위해 전체 잠금이 필요한 파일을 공유하는 소프트웨어 클러스터를 만들어야 합니다.

안정적으로 수행할 수 있습니까? 물론 가능하지만 NFS만 사용하는 것은 아닙니다.

파일을 FIFO로 사용하는 것을 고려하고 있다면 더 잘할 수 있으며 각 줄을 별도의 파일에 넣은 다음 사용하십시오.rename()공용 디렉토리의 파일을 동일한 NFS 마운트 파일 시스템의 클라이언트별 디렉토리로 이동합니다. 각 클라이언트에는 자체 디렉토리가 있으며, 제대로 작동하면 rename()파일을 성공적으로 "청구"했다는 것을 알고, 실패하면 다른 클라이언트가 파일을 "청구"했다고 가정합니다.

NFS 구현이 NFS 서버를 잠그거나 커널에 패닉을 일으키지 않고 rename()하나의 클라이언트만 작동하고 성공적으로 반환하는 반면 다른 모든 클라이언트는 실패하는 NFS 서버에서 충돌하는 시도를 적절하게 처리할 수 있을 만큼 강력하기를 바랍니다.rename()

관련 정보