파일 잠금 관리
Azure Files 다음 프로토콜을 통해 클라우드 파일 공유에 대한 액세스를 제공합니다.
- SMB(서버 메시지 블록)
- NFS(네트워크 파일 시스템)
- FileREST(HTTPS)
이 항목에서는 SMB와 FileREST 간의 파일 잠금 상호 작용을 관리하는 방법을 설명합니다. NFS 파일 공유에는 다른 잠금 의미 체계가 있으며 FileREST API의 하위 집합을 지원합니다. 이 항목은 NFS 파일 공유에는 적용되지 않습니다.
SMB 파일 잠금
파일 공유를 탑재하는 SMB 클라이언트는 파일 시스템 잠금 메커니즘을 사용하여 공유 파일에 대한 액세스를 관리할 수 있습니다. 여기에는 다음이 포함됩니다.
- 읽기, 쓰기 및 삭제에 대한 전체 파일 액세스 공유
- 단일 파일 내 영역에 대한 읽기 및 쓰기 액세스 권한을 관리하는 바이트 범위 잠금
SMB 클라이언트는 파일을 열 때 파일 액세스 및 공유 모드를 모두 지정합니다. 다음 파일 액세스 옵션은 일반적으로 SMB 클라이언트에서 사용되지만 모든 조합은 허용됩니다.
- 없음: 쿼리 특성 액세스에 대해서만 파일을 엽니다.
- 읽기: 읽기 전용 파일을 엽니다.
- 쓰기: 쓰기 액세스 전용 파일을 엽니다.
- 읽기/쓰기: 읽기/쓰기 권한이 있는 파일을 엽니다.
- 삭제: 액세스만 삭제하기 위한 파일을 엽니다.
SMB 클라이언트에서 일반적으로 사용되는 파일 공유 모드는 다음과 같습니다.
- 없음: 현재 파일의 공유를 거부합니다. 파일을 닫을 때까지 읽기, 쓰기 또는 삭제 액세스 권한으로 파일을 여는 모든 요청이 실패합니다.
- 공유 읽기: 나중에 파일을 열어 읽을 수 있습니다. 이 플래그를 지정하지 않으면 파일을 닫을 때까지 읽기를 위해 파일을 여는 모든 요청이 실패합니다.
- 공유 쓰기: 나중에 파일을 열어 쓸 수 있습니다. 이 플래그를 지정하지 않으면 파일을 닫을 때까지 쓰기 위해 파일을 여는 모든 요청이 실패합니다.
- 공유 읽기/쓰기: 파일을 읽거나 쓸 수 있도록 파일의 후속 열기를 허용합니다. 이 플래그를 지정하지 않으면 파일을 닫을 때까지 파일을 읽거나 쓰기 위해 파일을 여는 요청이 실패합니다.
- 공유 삭제: 파일의 후속 삭제를 허용합니다. 이 플래그를 지정하지 않으면 파일을 닫을 때까지 파일 삭제 요청이 실패합니다.
SMB 클라이언트 열기 파일 예제
다음과 같은 파일 열기 예제를 고려해 보세요.
공유 위반 없이 파일이 열립니다.
- 클라이언트 A가 및 FileShare.Write를 사용하여
FileAccess.Read
파일을 엽니다(열려 있는 동안 후속 읽기/삭제 거부). - 그런 다음 클라이언트 B는 FileShare.Read를
FileAccess.Write
사용하여 파일을 엽니다(열려 있는 동안 후속 쓰기/삭제 거부). - 결과: 파일 액세스와 파일 공유 모드 간에 충돌이 없으므로 허용됩니다.
- 클라이언트 A가 및 FileShare.Write를 사용하여
파일 액세스로 인한 공유 위반
- 클라이언트 A가 및 FileShare.Read를 사용하여
FileAccess.Write
파일을 엽니다(열려 있는 동안 후속 쓰기/삭제를 거부함). - 그런 다음, 클라이언트 B는 FileShare.Write를 사용하여 파일을
FileAccess.Write
엽니다(열려 있는 동안 후속 읽기/삭제 거부). - 결과: 클라이언트 B에서 공유 위반이 발생합니다. 클라이언트는 이전에 클라이언트 A에서 지정한 공유 모드에서 거부된 파일 액세스를 지정했습니다.
- 클라이언트 A가 및 FileShare.Read를 사용하여
공유 모드로 인한 공유 위반
- 클라이언트 A가 및 FileShare.Write를 사용하여
FileAccess.Write
파일을 엽니다(열려 있는 동안 후속 읽기/삭제 거부). - 그런 다음 클라이언트 B는 FileShare.Read를
FileAccess.Write
사용하여 파일을 엽니다(열려 있는 동안 후속 쓰기/삭제 거부). - 결과: 클라이언트 B에서 공유 위반이 발생합니다. 클라이언트는 쓰기 액세스를 위해 열려 있는 파일에 대한 쓰기 액세스를 거부하는 공유 모드를 지정했습니다.
- 클라이언트 A가 및 FileShare.Write를 사용하여
FileREST 파일 액세스
FileREST 작업을 수행할 때 이 작업은 SMB 클라이언트에서 열려 있는 파일에 대해 지정된 공유 모드를 준수해야 합니다. 다음 파일 액세스 모드를 사용하여 작업을 완료할 수 있는지 여부를 확인합니다.
FileREST 작업 | 해당하는 파일 액세스 |
---|---|
디렉터리 및 파일 나열 | 해당 없음. |
파일 만들기 | 쓰기, 삭제 |
파일 가져오기 | 읽기 |
파일 속성 설정 | 쓰기 |
파일 속성 가져오기 | 해당 없음. |
파일 메타데이터 설정 | 쓰기 |
파일 메타데이터 가져오기 | 해당 없음. |
파일 삭제 | 삭제합니다. |
범위 배치 | 쓰기 |
범위 나열 | 읽기 |
임대 파일 | 임대 기간 동안 쓰기, 삭제 및 공유 읽기 |
디렉터리 및 파일 나열, 파일 속성 가져오기 및 파일 메타데이터 가져오기 는 파일 콘텐츠에서 작동하지 않습니다. 이러한 작업에는 파일에 대한 읽기 권한이 필요하지 않습니다(즉, SMB 클라이언트가 단독 읽기 액세스를 위해 열려 있는 파일이 있는 경우에도 이러한 작업은 성공).
다음은 SMB 공유 모드와 상호 작용하는 FileREST 요청의 예입니다.
FileREST 파일 공유 가져오기 위반
- SMB 클라이언트는 및 FileShare.Write를 사용하여
FileAccess.Read
파일을 엽니다(열려 있는 동안 후속 읽기/삭제를 거부함). - 그런 다음 REST 클라이언트는 파일에서 파일 가져오기 작업을 수행합니다(이전 표에 지정된 대로 를 사용
FileAccess.Read
). -
결과: REST 클라이언트의 요청은 상태 코드 409(충돌) 및 오류 코드
SharingViolation
로 인해 실패합니다. SMB 클라이언트는 여전히 파일이 열려 있으며 읽기/삭제 액세스를 거부합니다.
- SMB 클라이언트는 및 FileShare.Write를 사용하여
FileREST Put Range 공유 위반
- SMB 클라이언트는 및 FileShare.Read를 사용하여
FileAccess.Write
파일을 엽니다(열려 있는 동안 후속 쓰기/삭제 거부). - 그런 다음 REST 클라이언트는 파일에서 범위 배치 작업을 수행합니다(이전 표에 지정된 대로 를 사용
FileAccess.Write
). -
결과: REST 클라이언트의 요청은 상태 코드 409(충돌) 및 오류 코드
SharingViolation
로 인해 실패합니다. SMB 클라이언트는 여전히 파일이 열려 있으며 쓰기/삭제 액세스를 거부합니다.
- SMB 클라이언트는 및 FileShare.Read를 사용하여
다음 섹션에는 FileREST API 공유 위반 시나리오의 포괄적인 테이블이 포함되어 있습니다.
FileREST에 대한 SMB 클라이언트 공유 모드 영향
SMB 클라이언트가 파일을 열 때 지정하는 공유 모드에 따라 FileREST가 오류 코드SharingViolation
와 함께 상태 코드 409(충돌)를 반환할 수 있습니다. 다음 표에는 여러 시나리오가 나와 있습니다.
SMB 클라이언트 파일 공유 모드 | 공유 위반으로 실패한 FileREST 작업 |
---|---|
None (Deny Read, Write, Delete) |
파일에 대한 다음 읽기, 쓰기, 임대 및 삭제 작업이 실패합니다.
|
Shared Read Deny Write, Delete) |
파일에 대한 다음 쓰기, 임대 및 삭제 작업이 실패합니다.
|
Shared Write (Deny Read, Delete) |
파일에 대한 다음 읽기, 임대 및 삭제 작업이 실패합니다.
|
Shared Delete (Deny Read, Write) |
파일에 대한 다음 읽기, 쓰기 및 임대 작업이 실패합니다.
|
Shared Read/Write (Deny Delete) |
파일에 대한 다음 임대 및 삭제 작업이 실패합니다.
|
Shared Read/Delete (Deny Write) |
파일에 대한 다음 쓰기, 임대 및 삭제 작업이 실패합니다.
|
Shared Write/Delete (Deny Read) |
파일에 대한 다음 읽기 및 임대 작업이 실패합니다.
|
Shared Read/Write/Delete (Deny Nothing) |
파일 삭제 |
Azure Files SMB 클라이언트에서 파일이 열려 있는 경우에만 공유 위반을 반환합니다. FileREST 파일 삭제 작업이 성공하려면 해당 파일에 대해 열려 있는 핸들이 있는 SMB 클라이언트가 없을 수 있습니다. 자세한 내용은 파일 삭제 작업 및 FileREST와 SMB 기회 잠금 간의 상호 작용을 참조하세요.
FileREST 임대 파일 API에 대한 SMB 파일 잠금 영향
SMB 클라이언트가 파일을 열 때 지정하는 파일 액세스 옵션에 따라 FileREST 임대 파일 API가 오류 코드SharingViolation
와 함께 상태 코드 409(충돌)를 반환할 수 있습니다. 다음 표에서는 추가 정보를 제공합니다.
SMB 클라이언트 파일 액세스 옵션 | 임대 파일 API를 사용하여 활성 임대 없이 파일에서 임대 획득 |
---|---|
없음 | 성공 |
읽기 | 성공 |
쓰기 | 로 인해 실패 SharingViolation |
삭제 | 로 인해 실패 SharingViolation |
읽기|쓰기 | 로 인해 실패 SharingViolation |
읽기|삭제 | 로 인해 실패 SharingViolation |
쓰기|삭제 | 로 인해 실패 SharingViolation |
읽기|쓰기|삭제 | 로 인해 실패 SharingViolation |
Azure Files SMB 클라이언트에서 파일이 열려 있는 경우에만 공유 위반을 반환합니다. FileREST 임대 파일 작업이 성공하려면 해당 파일에 대해 쓰기 또는 삭제 핸들이 열려 있는 SMB 클라이언트가 없을 수 있습니다. 자세한 내용은 파일 임대 작업 및 FileREST와 SMB 기회 잠금 간의 상호 작용을 참조하세요.
SMB 파일 잠금에 대한 FileREST 임대 파일 영향
파일의 임대는 파일에 대한 단독 쓰기 및 삭제 액세스를 제공합니다. SMB 클라이언트가 파일을 열 때 FileREST 임대 파일 작업에서 임대한 파일에 대한 잠금을 준수해야 합니다. 다음 표를 사용하여 SMB 파일 열기 작업을 완료할 수 있는지 여부를 확인할 수 있습니다.
FileREST 파일 임대 상태 | 공유 위반으로 실패한 SMB 작업 |
---|---|
임대됨 | 다음 파일 액세스로 파일을 여는 SMB 클라이언트가 실패합니다.
|
사용 가능 | 없음 |
끊어짐 | 없음 |
FileREST에 대한 SMB 삭제 영향
SMB 클라이언트가 삭제할 파일을 열면 해당 파일의 다른 모든 SMB 클라이언트 열기 핸들이 닫혀질 때까지 파일을 삭제 보류 중으로 표시합니다. 파일이 삭제 보류 중으로 표시되어 있는 동안 해당 파일의 FileREST 작업은 오류 코드SMBDeletePending
와 함께 상태 코드 409(충돌)를 반환합니다. SMB 클라이언트가 파일을 닫기 전에 보류 중인 삭제 플래그를 제거할 수 있으므로 상태 코드 404(찾을 수 없음)가 반환되지 않습니다. 즉, 파일이 제거된 경우에만 상태 코드 404(찾을 수 없음)가 반환됩니다.
파일이 삭제 보류 중인 SMB 상태인 동안에는 결과에 포함되지 List Files
않습니다.
또한 FileREST Delete File
및 Delete Directory
작업은 원자적으로 커밋되며 보류 중인 삭제 상태가 발생하지 않습니다.
FileREST에 대한 파일 특성 영향
SMB 클라이언트는 다음을 비롯한 파일 특성을 읽고 설정할 수 있습니다.
- 보관
- 읽기 전용
- 숨김
- 시스템
파일 또는 디렉터리가 읽기 전용으로 표시되면 파일에 쓰려고 시도하는 FileREST 작업이 상태 코드 412(사전 조건 실패) 및 오류 코드 ReadOnlyAttribute
로 실패합니다. 다음과 같은 작업이 여기에 포함됩니다.
Create File
Set File Properties
Set File Metadata
Put Range
이러한 파일 특성은 REST 클라이언트에서 설정하거나 읽을 수 없습니다. 파일을 읽기 전용으로 만든 후에는 SMB 클라이언트가 읽기 전용 특성을 제거할 때까지 REST 클라이언트가 파일에 쓸 수 없습니다.
FileREST와 SMB 기회 잠금 간의 상호 작용
SMB 편의적 잠금(oplock)은 성능을 개선하고 네트워크 전송을 줄이기 위해 SMB 클라이언트가 요청하는 캐싱 메커니즘입니다. SMB 클라이언트는 특정 파일 또는 디렉터리의 최신 상태를 캐시할 수 있습니다. 편의적 잠금에는 SMB 임대 유형이라고 불리는 여러 유형이 있습니다.
- 읽기(R): SMB 클라이언트는 로컬 캐시에서 읽을 수 있습니다.
- 쓰기(W): SMB 클라이언트는 데이터를 Azure 파일 공유로 다시 플러시할 필요 없이 로컬로 쓸 수 있습니다.
- 핸들(H): 핸들이 닫히면 SMB 클라이언트가 Azure 파일 공유에 즉시 알릴 필요가 없습니다. 이 잠금 유형은 애플리케이션이 동일한 액세스 및 공유 모드로 파일을 계속 열고 닫을 때 유용합니다.
이러한 임대 유형은 지정된 액세스 및 공유 모드와 독립적입니다. 일반적으로 SMB 클라이언트는 액세스 및 공유 모드에 관계없이 파일에 대한 새 핸들을 열 때마다 모든 임대 형식을 획득하려고 시도합니다.
라는 FileREST 작업에 따라 기존 기회 잠금을 중단하도록 요청해야 할 수 있습니다. 쓰기 oplock의 경우 SMB 클라이언트는 캐시된 변경 내용을 Azure 파일 공유에 플러시해야 합니다. 각 oplock 유형을 해제해야 하는 몇 가지 사례는 다음과 같습니다.
와 같은
Put Range
쓰기 작업이 실행될 때마다 읽기(R) oplock을 끊어야 합니다.와 같은
Get File
읽기 작업이 실행될 때마다 쓰기(W) oplock이 끊어져야 합니다.클라이언트에서 삭제 작업을 수행할 때마다 핸들(H) oplock을 중단해야 합니다. Azure Files 삭제 작업이 성공하려면 핸들을 열 수 없습니다.
FileREST 작업이 기존 SMB 핸들을 사용하여 공유 위반에 직면하면 핸들 oplock도 중단됩니다. 이는 클라이언트에서 실행되는 애플리케이션에서 핸들이 여전히 열려 있는지 확인하기 위해 발생합니다.
oplock을 중단하려면 캐시된 SMB 클라이언트 변경 내용을 플러시해야 할 수 있으며, 이로 인해 작업 응답 시간이 지연될 수 있습니다. 플러시하면 상태 코드 408(요청 시간 제한) 및 오류 코드 ClientCacheFlushDelay
로 인해 작업이 실패할 수도 있습니다.
다음 섹션에서는 oplock이 끊어진 시나리오에 대해 설명합니다.
oplock 중단 및 SMB 클라이언트 플러시가 필요하며 REST 클라이언트에서 지연이 발생합니다.
다음 예제를 살펴보겠습니다.
SMB 클라이언트가 파일을 열고 RWH oplock을 획득한 다음 데이터를 로컬에 씁니다.
REST 클라이언트는 요청을 보냅니다
Get File
.- Azure 파일 공유는 쓰기(W) oplock을 중단하여 클라이언트에 RH oplock을 남깁니다.
- SMB 클라이언트는 캐시된 데이터를 Azure 파일 공유에 대해 플러시하고 oplock 중단을 승인합니다.
- Azure 파일 공유는 요청을 처리
Get File
하고 요청된 데이터로 다시 응답합니다.
이 예제에서 REST 클라이언트는 지연을 경험합니다. 이 상황은 oplock 중단 및 SMB 클라이언트가 Azure 파일 공유에 대해 데이터를 플러시하는 데 걸린 시간으로 인해 발생합니다.
쓰기(W) oplock이 이미 끊어졌기 때문에 에 대한 후속 호출 Get File
에는 추가 지연이 발생하지 않습니다.
oplock을 해제해야 하지만 REST 클라이언트에서 지연이 발생하지 않습니다.
다음 예제를 살펴보겠습니다.
SMB 클라이언트가 RH oplock을 획득합니다.
REST 클라이언트는 요청을 보냅니다
Put Range
.- Azure 파일 공유는 Oplock 중단 요청을 SMB 클라이언트에 보내고 응답을 기다리지 않습니다.
- Azure 파일 공유는 요청을 처리합니다
Put Range
.
이 예제에서는 oplock 중단이 필요하지만 Put Range
요청에 추가 지연이 발생하지 않습니다. 읽기 oplock을 중단하는 경우 응답이 필요하지 않습니다.
Azure Files 동작
다음 표에서는 각 FileREST 작업에 대한 Azure Files 동작을 요약합니다. 이 동작은 동일한 파일에 대한 핸들을 이미 획득한 SMB 클라이언트의 oplock 상태를 기반으로 합니다. 또한 동작은 SMB 핸들 액세스 및 공유가 FileREST 작업과 충돌하지 않는다고 가정합니다.
충돌 발생 시에는 클라이언트에서 핸들이 계속 열려 있도록 핸들 oplock도 해제됩니다. 차단 oplock 중단의 경우 Azure Files 중단이 성공했음을 인정할 때까지 기다려야 합니다. 차단되지 않는 oplock 중단의 경우 Azure Files 기다릴 필요가 없습니다.
FileREST 작업 | 현재 oplock 형식 | Oplock 중단 수행됨 | 결과 oplock |
---|---|---|---|
파일 가져오기 | RWH | 예(차단) | RH |
파일 가져오기 | RH | 아니요 | RH |
파일 가져오기 | RW | 예(차단) | R |
파일 속성 가져오기 | RWH | 예(차단) | RH |
파일 속성 가져오기 | RH | 아니요 | RH |
파일 속성 가져오기 | RW | 예(차단) | R |
범위 나열 | RWH | 예(차단) | RH |
범위 나열 | RH | 아니요 | RH |
범위 나열 | RW | 예(차단) | R |
파일 메타데이터 가져오기 | RWH | 예(차단) | RH |
파일 메타데이터 가져오기 | RH | 아니요 | RH |
파일 메타데이터 가져오기 | RW | 예(차단) | R |
파일 나열 | RWH | 아니요 | RWH |
파일 나열 | RH | 아니요 | RH |
파일 나열 | RW | 아니요 | RW |
범위 배치 | RWH | 예(차단) | 없음 |
범위 배치 | RH | 예(비차단) | 없음 |
범위 배치 | RW | 예(차단) | 없음 |
파일 속성 설정 | RWH | 예(차단) | 없음 |
파일 속성 설정 | RH | 예(비차단) | 없음 |
파일 속성 설정 | RW | 예(차단) | 없음 |
파일 메타데이터 설정 | RWH | 예(차단) | 없음 |
파일 메타데이터 설정 | RH | 예(비차단) | 없음 |
파일 메타데이터 설정 | RW | 예(차단) | 없음 |
파일 삭제 | RWH | 예(차단) | RW |
파일 삭제 | RH | 예(차단) | R |
파일 삭제 | RW | 아니요 | RW |
차단 oplock 중단이 필요한 경우 특정 조건에서 FileREST 작업이 실패합니다. 지정된 요청 시간 제한 내에서 또는 30초 이내에 중단이 성공하지 못하면 서비스는 먼저 완료되는 코드 408(요청 시간 제한) 및 오류 코드를 ClientCacheFlushDelay
상태 반환합니다.
또한 요청에는 Delete File
oplock 핸들(H) 임대를 중단해야 합니다. 핸들을 분리하면 REST 클라이언트가 를 호출 Delete File
할 때 SMB 클라이언트 애플리케이션에서 열린 파일 핸들이 없도록 합니다. 공유 위반이 있는 경우 상태 코드 409(충돌) 및 오류 코드 SharingViolation
로 인해 요청이 실패합니다.