문제

SO에 대한 파일 관리 및 대규모 프로젝트 내 저장에 관한 매우 좋은 질문이 있습니다.

DB에 이미지 저장 - 예, 아니오?
바이너리 데이터를 데이터베이스에 저장하시겠습니까, 아니면 파일 시스템에 저장하시겠습니까?

첫 번째는 훌륭한 통찰력을 갖고 있으며 내 프로젝트에서는 DB 경로가 아닌 파일 경로로 이동하기로 결정했습니다.

파일 시스템 사용에 대한 주요 사항은 백업입니다.하지만 우리 시스템에는 훌륭한 백업 구성표가 있으므로 걱정할 필요가 없습니다.

다음 경로는 실제 파일을 저장하는 방법입니다.그리고 파일 위치를 항상 정적으로 유지하고 데이터베이스 측면에 가상 디렉터리 시스템을 만드는 방법에 대해 생각해 보았습니다.따라서 파일에 대한 링크는 변경되지 않습니다.

내가 구축하고 있는 시스템에는 하나의 전역 파일 관리 기능이 있으므로 모든 사용자가 모든 파일에 액세스할 수 있습니다.그러나 파일 경로를 사용한 많은 사람들은 물리적 디렉터리 크기에 대해 이야기합니다(예를 들어 모든 파일이 하나의 디렉터리 내에 있는 경우).

따라서 제 질문은 이러한 정적 파일용 폴더를 만드는 데 필요한 몇 가지 팁이나 모범 사례 방법이 무엇인지, 또는 가상 디렉터리 경로를 전혀 사용해서는 안 되는지입니다.

(도움이 된다면 프로젝트는 LAMP 스택(PHP)에 있습니다)

도움이 되었습니까?

해결책

한 가지 방법은 각 파일에 고유 번호를 할당하고 이를 사용하여 실제 파일 위치를 찾는 것입니다.그런 다음 해당 번호를 사용하여 파일 시스템의 다른 디렉터리에 파일을 배포합니다.예를 들어 다음과 같은 구성표를 사용할 수 있습니다.

/images/{0}/{1}/{2}

{0}: file_number % 100
{1}: (file_number / 100) % 100
{2}: file_number

다른 팁

나는 얼마 전 많은 파일을 호스팅하는 웹사이트에서 이 문제에 직면한 적이 있습니다.우리가 한 일은 GUID(파일의 기본 키 필드이기도 함)를 가져오는 것이었습니다(예:BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301) 다음과 같은 파일을 저장합니다./B/C/C/BCC46E3F-2F7A-42b1-92CE-DBD6EC6D6301/filename.ext

여기에는 다음과 같은 장점이 있습니다.

  • 여러 서버로 파일 서버를 확장할 수 있으며 각 서버에 특정 디렉터리를 할당할 수 있습니다.
  • 파일 이름을 바꿀 필요는 없습니다
  • 귀하의 디렉토리는 고유함을 보장합니다.

도움이 되었기를 바랍니다!

단일 디렉토리에 과도한 수의 항목이 생성되는 것을 방지하려면 파일 이름 부분을 기준으로 디렉토리를 생성하는 것이 좋습니다.예를 들어 d7f5ae9b7c5a.png라는 파일이 있는 경우 media/d7/f5/d7f5ae9b7c5a.png에 저장할 수 있습니다.파일 이름이 모두 16진수인 경우 최종 레벨까지 단일 디렉토리의 항목 수가 256개로 제한됩니다.

  1. 사용자 이미지 1개 ~ 100kb, 데이터베이스에 10,000명의 사용자가 있다고 가정하면 각 사용자는 평균 5개의 이미지를 갖게 되므로 5테라바이트의 DB를 갖게 되며 각 이미지 출력은 DB를 통해 실행되며 이 추가 DB 트래픽은 일반 DB 서버 성능입니다....이를 방지하기 위해 DB 클러스터를 사용할 수 있지만 비용이 많이 든다고 가정해 보겠습니다.

  2. 라이브 데이터베이스의 오류에 대한 사용자 보고서(테스트 중 - 모두 올바르게 작동함), 개발자 컴퓨터에서 덤프를 생성하고 압축을 풀려면 어떻게 해야 합니까?시간은 얼마나 걸릴까요?

  3. 어느 순간 CDN에 이미지를 넣기로 결정할 수 있다면 소스 코드에는 어떤 변화가 생길까요?

나는 보통 다음과 같은 접근 방식을 취합니다.

업로드된 파일을 저장하는 폴더를 가리키는 애플리케이션에 대한 전역 설정 변수가 있습니다.데이터베이스에 파일의 상대 경로를 저장합니다(설정 변수가 가리키는 경로에 따라).

따라서 파일이 /www/uploads/image.jpg에 있는 경우 설정 변수는 /www/uploads를 가리키며 데이터베이스 행에는 image.jpg가 있습니다.이는 애플리케이션에서 시스템 디렉터리 구조를 분리하는 유연한 방법입니다.

또한 관련 데이터베이스 테이블을 기반으로 디렉터리의 파일 저장소를 조각화할 수 있습니다.user_reports 테이블과 user_photos 테이블이 있다고 가정해 보겠습니다.user_reports와 관련된 파일은 /www/uploads/user_reports에 저장됩니다.사용자 업로드 수가 많은 경우 조각화를 더욱 추가로 구현할 수 있습니다.사용자가 2009년 3월 20일에 파일을 업로드했다고 가정해 보겠습니다. 파일 이름은 report.pdf이므로 /www/uploads/user_reports/2009/03/20/report.pdf에 저장합니다.

Apache와 PHP가 파일을 관리하는 방법에 대해서는 많이 말할 수 없지만 ext3 파일 시스템에 대해서는 말할 수 있습니다.ext3은 동일한 디렉토리에 많은 수의 파일이 있어도 문제가 없는 것 같습니다.최대 백만 개의 파일로 테스트했습니다.디렉터리를 생성하기 전에 파일 시스템에서 dir_index 옵션이 활성화되어 있는지 확인하십시오.dump2fs를 실행하여 확인하고 tune2fs를 실행하여 이 옵션을 변경할 수 있습니다.파일을 하위 디렉터리 트리로 해싱하는 것은 여전히 ​​유용할 수 있습니다. 왜냐하면 명령줄 도구는 디렉터리 내용을 나열하는 데 여전히 문제가 있을 수 있기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top