Azure NetApp Files의 파일 잠금 및 잠금 형식 이해
NAS 환경에서는 여러 클라이언트가 동일한 볼륨에 있는 파일에 액세스합니다. NAS 볼륨은 애플리케이션을 인식하지 못하므로 둘 이상의 클라이언트가 동시에 동일한 파일에 쓰려고 할 때 잠재적인 손상으로부터 데이터를 보호하기 위해 애플리케이션은 NAS 서버에 잠금 요청을 보내서 파일이 사용되는 동안 다른 클라이언트가 변경하는 것을 방지합니다. NFS의 경우 파일 잠금 메커니즘은 사용 중인 NFS 버전에 따라 달라집니다.
잠금 유형
NFS 잠금에는 다음과 같은 여러 유형이 있습니다.
공유 잠금: 공유 잠금은 여러 프로세스에서 동시에 사용할 수 있으며 파일에 배타적 잠금이 없는 경우에만 실행될 수 있습니다. 이러한 잠금은 읽기 전용 작업용이지만 쓰기(예: 데이터베이스 사용)에도 사용할 수 있습니다.
배타적 잠금: 배타적 잠금은 CIFS/SMB의 배타적 잠금과 동일하게 작동합니다. 배타적 잠금이 있는 경우 하나의 프로세스만 파일을 사용할 수 있습니다. 다른 프로세스가 파일을 잠근 경우 해당 프로세스가 포크되지 않는 한 배타적 잠금을 실행할 수 없습니다.
위임: 위임은 NFSv4.x에서만 사용되며 NFS 서버 옵션이 사용하도록 설정되고 클라이언트가 NFSv4.x 위임을 지원할 때 할당됩니다. 위임은 클라이언트가 사용하는 파일에 "소프트" 잠금을 생성하여 클라이언트 쪽에서 작업을 캐시하는 방법을 제공합니다. 이렇게 하면 클라이언트와 서버 간의 호출 수를 줄여 특정 워크로드의 성능을 향상시키며 SMB 기회 잠금과 유사합니다. Azure NetApp Files는 현재 NFSv4.x 위임을 지원하지 않습니다.
바이트 범위 잠금: 전체 파일을 잠그는 대신 바이트 범위 잠금은 파일의 일부만 잠급니다.
잠금 동작은 잠금 유형, 클라이언트 운영 체제 버전 및 사용 중인 NFS 버전에 따라 달라집니다. 예상되는 동작을 측정하려면 환경에서 잠금을 테스트해야 합니다.
NFSv3 잠금
NFSv3은 NLM(네트워크 잠금 관리자) 및 NSM(네트워크 상태 모니터)과 같은 보조 프로토콜을 사용하여 NFS 클라이언트와 서버 간의 파일 잠금을 조정합니다. 이러한 보조 프로토콜은 Azure NetApp Files가 준수하는 RFC-1813에 정의되어 있습니다.
NLM은 잠금 설정 및 해제를 돕고, NSM은 피어에게 서버 재부팅을 알립니다. NFSv3 잠금을 사용하면 클라이언트가 재부팅될 때 서버가 잠금을 해제해야 합니다. 서버가 재부팅되면 클라이언트는 서버에 보유된 잠금을 상기시킵니다.
참고 항목
경우에 따라 NFS 잠금 메커니즘이 제대로 통신하지 못하고(예: 네트워크 중단 발생 시) 오래된 잠금이 서버에 남아 있어 수동으로 지워야 합니다. 이 작업에 대한 자세한 내용은 파일 잠금 문제 해결을 참조하세요.
NFSv4.x 잠금
NFSv4.x는 NFS 프로토콜 내에 통합된 임대 기반 잠금 모델을 사용합니다. 이는 유지 관리하거나 걱정할 보조 서비스가 없음을 의미합니다. 모든 잠금은 NFSv4.x 통신에 캡슐화됩니다.
Azure NetApp Files는 NFSv4.x 파일 잠금 메커니즘을 지원하여 임대 기반 모델에서 모든 파일 잠금 상태를 유지합니다. RFC 8881에 따라 Azure NetApp Files는 "NFS 클라이언트가 보유한 모든 상태에 대한 단일 임대 기간을 정의합니다. 클라이언트가 정의된 기간 내에 임대를 갱신하지 않으면 서버에서 클라이언트의 임대와 관련된 모든 상태를 해제할 수 있습니다."
이는 클라이언트가 파일 읽기와 같은 작업을 수행하여 명시적으로 또는 암시적으로 임대를 갱신할 수 있음을 의미합니다. 또한 Azure NetApp Files는 클라이언트가 서버 복구 중에 잠금 상태를 회수하려고 시도하는 특수 처리 기간인 유예 기간을 정의합니다.
용어 | 정의 |
---|---|
임대 | Azure NetApp Files가 클라이언트에 잠금을 취소할 수 없게 부여하는 기간입니다. |
유예 기간 | 서버 중단 시 서버 복구 중에 클라이언트가 잠금 상태를 회수하려고 시도하는 기간입니다. |
Azure NetApp Files에서 NFSv4.x 잠금을 처리하는 방법
잠금은 클라이언트 요청 시 임대 기반으로 Azure NetApp Files에서 발급됩니다. Azure NetApp Files 서버는 30초마다 각 클라이언트의 임대에 변경 사항이 있는지 확인합니다. 클라이언트를 재부팅하는 경우 클라이언트는 다시 시작된 후 서버에서 유효한 잠금을 모두 회수할 수 있습니다. Azure NetApp Files 서버가 다시 부팅되면 다시 시작할 때 45초의 유예 기간 동안 클라이언트에 새 잠금을 발급하지 않습니다. 그 이후에는 요청 클라이언트에 잠금이 발행될 수 있습니다. 지정된 유예 기간 동안 잠금을 다시 설정할 수 없으면 잠금이 자체적으로 만료됩니다. 수동으로 해제해야 하는 오래된 잠금이 없으므로 이 동작은 NFSv3 잠금과 다릅니다.
클라이언트에 수동으로 잠금 설정
NFS 잠금을 테스트하려면 클라이언트는 NFS 서버에 잠금을 설정하도록 지시해야 합니다. 그러나 모든 애플리케이션이 잠금을 사용하는 것은 아닙니다. 예를 들어, "vi" 애플리케이션은 파일을 잠그지 않습니다. 점 명명 규칙을 사용하여 동일한 폴더에 숨겨진 스왑 파일을 만든 다음, 애플리케이션이 닫힐 때 해당 파일에 쓰기를 커밋합니다. 그런 다음, 이전 파일이 삭제되고 스왑 파일의 이름이 파일 이름으로 변경됩니다.
그러나 수동으로 잠금을 설정하는 유틸리티가 있습니다. 예를 들어, flock은 파일을 잠글 수 있습니다.
파일에 잠금을 설정하려면 먼저 exec를 실행하여 숫자 ID를 할당합니다.
# exec 4<>v4user_file
flock을 사용하여 파일에 대한 공유 또는 배타적 잠금을 만듭니다.
# flock
Usage:
flock [options] <file|directory> <command> [command args]
flock [options] <file|directory> -c <command>
flock [options] <file descriptor number>
Options:
-s --shared get a shared lock
-x --exclusive get an exclusive lock (default)
-u --unlock remove a lock
-n --nonblock fail rather than wait
-w --timeout <secs> wait for a limited amount of time
-E --conflict-exit-code <number> exit code after conflict or timeout
-o --close close file descriptor before running command
-c --command <command> run a single command string through the shell
-h, --help display this help and exit
-V, --version output version information and exit
# flock -n 4
파일의 잠금을 해제하려면:
# flock -u -n 4
수동으로 파일을 잠그면 파일 열기 및 편집 상호 작용을 테스트하고 Azure NetApp Files에서 잠금 중단 기능을 테스트할 수 있습니다.