문제

현재 InnoDB 테이블에 Blob으로 저장된 이미지 (Max. 6MB)가 있습니다. 데이터의 규모가 증가함에 따라 야간 백업이 느리게 증가하고 일반 성능을 방해합니다.

따라서 이진 데이터는 파일 시스템으로 이동해야합니다. (파일에 대한 포인터는 DB에 보관됩니다.)

데이터에는 관계와 같은 트리가 있습니다.

- main site
  - user_0
    - album_0
    - album_1
    - album_n
  - user_1
  - user_n
etc...

이제 데이터가 디렉토리 구조를 고르게 배포하기를 원합니다. 이것을 어떻게 달성해야합니까?

시도해 볼 수있을 것 같아요 MD5('userId, albumId, imageId'); 그리고 내 디렉토리 경로를 얻으려면 결과 문자열을 자르십시오.

  /var/imageStorage/f/347e/013b/c042/51cf/985f7ad0daa987d.jpeg

이를 통해 첫 번째 문자를 서버에 매핑하고 여러 서버에 디렉토리 구조를 균등하게 배포 할 수 있습니다.

그러나 이것은 할 것입니다 ~ 아니다 사용자 당 이미지를 구성하여 여러 서버에 1 앨범의 이미지를 전파 할 수 있습니다.

내 질문은 다음과 같습니다.
사용자/앨범 데이터를 함께 유지하면서 파일 시스템에 이미지 데이터를 균형 잡힌 방식으로 저장하는 가장 좋은 방법은 무엇입니까?

나는 올바른 방향으로 생각하고 있습니까? 아니면 이것이 모든 일을하는 잘못된 방법입니까?

업데이트:
나는 갈 것이다 md5(user_id) 가장 높은 레벨에서 분할을위한 스트링 슬라이스. 그런 다음 모든 사용자 데이터를 동일한 버킷에 넣습니다. 이렇게하면 사용자 데이터를 서로 밀접하게 저장하면서 데이터를 균일하게 배포 할 수 있습니다.

  /var
   - imageStorage
     - f/347e/013b
       - f347e013bc04251cf985f7ad0daa987d
         - 0
           - album1_10
             - picture_1.jpeg
         - 1
           - album1_1
             - picture_2.jpeg
             - picture_3.jpeg
           - album1_11
             - picture_n.jpeg
         - n
           - album1_n

디렉토리 당 앨범 수를 더 작게 유지하기 위해 앨범을 뒤에서 분할 (그 아이디어가 마음에 듭니다)을 사용할 것이라고 생각합니다 (대부분의 사용자에게는 필요하지 않지만).

감사!

도움이 되었습니까?

해결책

userID를 뒤에서 나누십시오. 예를 들어

UserID = 6435624 
Path = /images/24/56/6435624

백업의 경우 MySQL 복제를 사용하고 백업하는 동안 문제 (예 : 잠금)를 피하기 위해 슬레이브 데이터베이스를 백업 할 수 있습니다.

다른 팁

파일 이름을 다른 디렉토리로 분산시키는 데있어 한 가지는 MD5 파일 이름을 다른 하위 디렉터로 분할하는 것을 고려하면 (일반적으로 좋은 아이디어), 완전한 해시를 파일 이름으로 유지하고 처음 몇 숯을 디렉토리 이름으로 복제하는 것이 좋습니다. 이렇게하면 디렉토리를 이동해야 할 때 파일을 쉽게 식별 할 수 있습니다.

예를 들어

abcdefgh.jpg-> a/ab/abc/abcdefgh.jpg

파일 이름이 균일하게 분산되지 않은 경우 (해시가 아님), 짝수 분포를 얻는 분할 방법을 선택하십시오.

고유 한 사진 ID가 주어진이 전략을 사용하고 있습니다

  • 문자열을 뒤집습니다
  • 홀수의 숫자가 있으면 Zerofill it it e -Zero와 함께 zerofill
  • 문자열을 2 자리 하위 문자열로 청킹하십시오
  • 아래와 같이 경로를 구축하십시오

    17 >> 71 >> /71.jpg
    163 >> 0361 >> /03/61.jpg
    6978 >> 8796 >> /87/96.jpg    
    1687941 >> 01497861 >> /01/49/78/61.jpg
    

이 방법은 각 폴더에 최대 100 개의 사진과 100 개의 하위 폴더가 포함되며로드는 왼쪽 폴더 사이에 골고루 분포됩니다.

또한 파일에 도달하려면 사진의 ID 만 있으면 다른 메타 데이터가 포함 된 그림 테이블을 읽을 필요가 없습니다. 사용자 데이터는 실제로 함께 저장되지 않으며 ID-Path 관계는 예측 가능하며 귀하의 요구에 따라 다릅니다.

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