자체 관리 배포를 위한 GridFS
GridFS는 BSON 문서 크기 제한인 16MB를 초과하는 파일을 저장하고 검색하기 위한 사양입니다.
참고
GridFS는 다중문서 트랜잭션을 지원하지 않습니다.
GridFS는 파일을 단일 문서에 저장하는 대신 파일을 여러 부분, 즉 청크 [1]로 나누고 각 청크를 별도의 문서로 저장합니다. 기본적으로 GridFS는 255 kB의 기본 청크 크기를 사용합니다. 즉, GridFS는 마지막 청크를 제외하고 파일을 255 kB의 청크로 나눕니다. 마지막 청크는 필요한 만큼만 커집니다. 마찬가지로 청크 크기보다 크지 않은 파일에는 필요한 만큼의 공간과 일부 추가 메타데이터만 사용하는 최종 청크만 있습니다.
GridFS는 두 개의 컬렉션을 사용하여 파일을 저장합니다. 한 컬렉션은 파일 청크를 저장하고 다른 컬렉션은 파일 메타데이터를 저장합니다. GridFS Collections11 섹션에서 각 컬렉션에 대해 자세히 설명합니다.
GridFS에 파일을 쿼리하면 드라이버가 필요에 따라 청크를 재조립합니다. GridFS를 통해 저장된 파일의 범위 쿼리를 수행할 수 있습니다. 또한 동영상이나 오디오 파일 중간에 '건너뛰기'와 같이 파일의 임의 섹션에서 정보에 액세스할 수도 있습니다.
GridFS는 16MB를 초과하는 파일을 저장하는 데 유용할 뿐만 아니라 전체 파일을 메모리에 로드하지 않고도 액세스하려는 모든 파일을 저장하는 데에도 유용합니다. GridFS를 사용해야 하는 경우를 참조하세요.
GridFS를 사용해야 하는 경우
MongoDB에서는 16MB보다 큰 파일을 저장할 때 GridFS를 사용합니다.
경우에 따라 대용량 파일을 저장하는 것이 시스템 수준의 파일 시스템보다 MongoDB 데이터베이스에서 더 효율적일 수 있습니다.
파일 시스템이 디렉터리의 파일 수를 제한하는 경우 GridFS를 사용하여 필요한 만큼 많은 파일을 저장할 수 있습니다.
전체 파일을 메모리에 로드하지 않고 대용량 파일의 일부에서 정보에 액세스하려는 경우에 GridFS를 사용하면 전체 파일을 메모리에 읽지 않고 파일 섹션을 불러올 수 있습니다.
파일 및 메타데이터를 자동으로 동기화하고 여러 시스템 및 시설에 배포하려는 경우 GridFS를 사용할 수 있습니다. 지리적으로 분산된 복제본 세트를 사용하면 MongoDB는 파일과 해당 메타데이터를 여러
mongod
인스턴스 및 시설에 자동으로 배포할 수 있습니다.
전체 파일의 콘텐츠를 원자 단위로 업데이트해야 하는 경우에는 GridFS를 사용하지 않도록 합니다.대안으로 각 파일의 여러 버전을 저장하고 메타데이터에서 파일의 현재 버전을 지정할 수 있습니다.새 버전의 파일을 업로드한 후 원자 업데이트에서 '최신' 상태를 나타내는 메타데이터 필드를 업데이트할 수 있으며 필요한 경우 나중에 이전 버전을 제거할 수 있습니다.
또한 파일이 모두 BSON 문서 크기 제한인 16MB보다 작은 경우에는 GridFS를 사용하는 대신 각 파일을 단일 문서에 저장하는 것이 좋습니다. BinData 데이터 유형을 사용해 바이너리 데이터를 저장할 수 있습니다. BinData 사용에 대한 자세한 내용은 드라이버 설명서를 참조하세요.
GridFS 사용
GridFS를 사용하여 파일을 저장하고 검색하려면 다음 중 하나를 사용하세요:
MongoDB 드라이버입니다. 드라이버에서 GridFS를 사용하는 방법에 대한 자세한 내용은 드라이버 문서를 참조하세요.
mongofiles
명령줄 도구입니다. 자세한 내용은mongofiles
참조 문서에서 확인할 수 있습니다.
GridFS 컬렉션
GridFS는 파일을 다음과 같은 두 개의 컬렉션에 저장합니다.
chunks
바이너리 청크를 저장합니다. 자세한 내용은chunks
컬렉션을 참조하세요.files
파일의 메타데이터를 저장합니다. 자세한 내용은files
컬렉션을 참조하세요.
GridFS는 각 버킷 앞에 이름을 지정해 공통 버킷에 컬렉션을 배치합니다. 기본적으로 GridFS는 fs
라는 이름이 지정된 버킷이 포함된 컬렉션 두 개를 사용합니다.
fs.files
fs.chunks
다른 버킷 이름을 선택할 수 있을 뿐만 아니라 단일 데이터베이스에 여러 버킷을 생성할 수도 있습니다. 버킷 이름을 포함한 전체 컬렉션 이름에는 네임스페이스 길이제한이 적용됩니다.
chunks
컬렉션
chunks
[1] 컬렉션의 각 문서는 GridFS에서 표현되는 별개의 파일 청크를 나타냅니다. 이 컬렉션의 문서 양식은 다음과 같습니다. 이 컬렉션의 문서 양식은 다음과 같습니다.
{ "_id" : <ObjectId>, "files_id" : <ObjectId>, "n" : <num>, "data" : <binary> }
컬렉션 chunks
문서에는 다음 필드가 포함되어 있습니다.
chunks._id
청크의 고유 ObjectId입니다.
chunks.data
청크의 페이로드는 BSON
Binary
유형입니다.
files
컬렉션
files
collection 컬렉션의 각 문서는 GridFS의 파일을 나타냅니다.
{ "_id" : <ObjectId>, "length" : <num>, "chunkSize" : <num>, "uploadDate" : <timestamp>, "md5" : <hash>, "filename" : <string>, "contentType" : <string>, "aliases" : <string array>, "metadata" : <any>, }
files
컬렉션 내의 문서에는 다음 필드 중 일부 또는 전부가 포함되어 있습니다.
files._id
이 문서의 고유 식별자입니다.
_id
는 원본 문서에 대해 선택한 데이터 유형입니다. MongoDB 문서의 기본 유형은 BSON ObjectId입니다.
files.chunkSize
각 청크의 크기(바이트)입니다. GridFS는 마지막 청크를 제외하고 문서를 필요한 크기의 청크
chunkSize
로 나눕니다. 기본 크기는 255 킬로바이트(kB)입니다.
files.md5
더 이상 사용되지 않습니다.
MD5 알고리즘은 FIPS 140-2에 의해 금지되어 있습니다. MongoDB 드라이버는 MD5 지원을 중단하고 향후 릴리스에서 MD5 생성을 제거할 예정입니다. 파일 다이제스트가 필요한 애플리케이션은 이를 GridFS 외부에서 구현하고
files.metadata
에 저장해야 합니다.filemd5 명령에서 반환된 전체 파일의 MD5 해시입니다. 이 값은
String
유형입니다.
files.contentType
더 이상 사용되지 않습니다.
선택 사항GridFS 파일에 유효한 MIME 유형입니다. 애플리케이션 전용입니다.
GridFS 파일의 MIME 유형과 관련된 정보를 저장하려면
files.metadata
를 사용하세요.
files.aliases
더 이상 사용되지 않습니다.
선택 사항. 별칭 문자열의 배열입니다. 애플리케이션 전용입니다.
GridFS 파일의 MIME 유형과 관련된 정보를 저장하려면
files.metadata
를 사용하세요.
GridFS Indexes
GridFS는 효율성을 위해 chunks
및 files
컬렉션 각각에 인덱스를 사용합니다. GridFS 사양을 준수하는 드라이버는 편의를 위해 이러한 인덱스를 자동으로 생성합니다. 또한 애플리케이션의 요구 사항에 맞게 원하는 대로 추가 인덱스를 생성할 수도 있습니다.
chunks
인덱스
GridFS는 files_id
및 n
필드를 사용하여 chunks
컬렉션에서 고유한 복합 인덱스를 사용합니다. 이렇게 하면 다음 예시와 같이 청크를 효율적으로 조회할 수 있습니다.
db.fs.chunks.find( { files_id: myFileID } ).sort( { n: 1 } )
GridFS 사양을 준수하는 드라이버는 읽기 및 쓰기 (write) 작업 전에 이 인덱스가 존재하는지 자동으로 확인합니다. GridFS 애플리케이션의 특정 동작은 관련 드라이버 설명서에서 확인하세요.
이 인덱스가 없는 경우 mongosh
:를 사용하여 다음 작업을 실행하고 인덱스를 만들 수 있습니다:
db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );
files
인덱스
GridFS는 filename
및 uploadDate
필드로 files
컬렉션의 인덱스를 사용합니다. 이 인덱스를 사용하면 다음 예시와 같이 파일을 효율적으로 조회할 수 있습니다.
db.fs.files.find( { filename: myFileName } ).sort( { uploadDate: 1 } )
GridFS 사양을 준수하는 드라이버는 읽기 및 쓰기 (write) 작업 전에 이 인덱스가 존재하는지 자동으로 확인합니다. GridFS 애플리케이션의 특정 동작은 관련 드라이버 설명서에서 확인하세요.
이 인덱스가 없는 경우 mongosh
:를 사용하여 다음 작업을 실행하고 인덱스를 만들 수 있습니다:
db.fs.files.createIndex( { filename: 1, uploadDate: 1 } );
[1] | (1, 2) GridFS의 맥락에서 청크라는 용어의 사용은 샤딩의 맥락에서 청크라는 용어 사용과 관련이 없습니다. |
GridFS 샤딩
GridFS와 관련하여 files
및 chunks
의 두 가지 컬렉션을 고려해야 합니다.
chunks
컬렉션
chunks
컬렉션을 샤딩하려면 { files_id : 1, n : 1
}
또는 { files_id : 1 }
을(를) 샤드 키 인덱스로 사용합니다. files_id
는 ObjectId이며 단조롭게 변경됩니다.
filemd5
를 실행하여 업로드가 성공적으로 이루어졌는지 확인하지 않는 MongoDB 드라이버의 경우 chunks
컬렉션에 해시된 샤딩을 사용할 수 있습니다.
MongoDB 드라이버가 filemd5
를 실행하는 경우 해시된 샤딩을 사용할 수 없습니다. 자세한 내용은 SERVER-9888을 참조하세요.
files
컬렉션
files
컬렉션은 크기가 작고 메타데이터만 포함되어 있습니다. GridFS에 필요한 키 중 어느 것도 샤드된 환경에서 균등하게 배포되는 데 적합하지 않습니다. files
를 샤딩하지 않은 상태로 두면 모든 파일 메타데이터 문서가 프라이머리 샤드에 저장됩니다.
files
컬렉션을 반드시 샤딩해야 하는 경우 가능하면 애플리케이션 필드와 함께 _id
필드를 사용합니다.