구글 드라이브와 비슷한 웹 스토리지 서비스를 만드려 한다.
서버 내부의 디렉토리 구조 설계에 대해 생각해보고, AI님과 나눈 대화를 바탕으로 간단히 정리해 보았다.
구글 드라이브와 같이 다수의 사용자가 존재할 때, 실제 파일은 서버에 어떻게 저장하는 것이 좋을까?
어떤 서버를 저장소로 사용할 것인지(클라우드, 온프레미스 등...)는 논외로 한다.
해당 파일 서버 내의 '디렉토리 구조'에 대해서 말하는 것.
일단 한 가지만 주제에 놓고 이야기해보자.
첫째: 사용자의 UI를 그대로 따라가면 될까? 아니면 별도의 전략을 갖춰야 할까?
사용자는 UI상에서 디렉토리를 만들고, 삭제하고, 위치를 옮길 수 있다.
이 시각적인 경로를 서버 내에서도 그렇게 구현해야 할까?
(사용자마다 루트 디렉토리 하나를 만들고, 내부 구조는 사용자가 만드는 그대로 적용)
그렇지 않다는 생각이 들었는데, 이유는 다음과 같다.
1. 서버의 관리전략을 사용자에게 맡기게 됨.
서버 내의 설계가 어떻게 변경될지가 사용자에게 달리게 된다.
사용자가 어떻게 서비스를 사용하냐에 따라서 서버 내 디렉토리 구조가 바뀌므로, 여기서 발생하는 문제는 예상하기 힘들다.
설계는 서버 관리자가 예상할 수 있어야 한다.
2. 파일 찾기/읽기 등의 성능이 사용자에 따라 달라짐
한 디렉토리에 모든 파일을 몰아넣는 사용자는 파일 검색 속도의 지연이 발생할 것이다.
파일을 적절히 분산시키는 사용자는 지연이 덜 일어날 것이다. 일관성 없는 서비스 품질이 예상된다.
위와 같은 사유로, 화면의 보이는 디렉토리 구조를 서버에서 따라가지 않기로 했다.
별도의 테이블 설계와 애플리케이션 로직 구현을 사용할 예정.
둘째: 파일을 한 디렉토리에 몰아넣을까? 아니면 적절히 분산해야 할까? 어떤 방식으로 분산할까?
첫째에서 이미 언급했듯이 하나의 디렉토리에 파일을 몰아 넣는 것은 파일 검색의 지연을 일으키므로
당연히 피해야 한다.
(물론 아주 한정적인 인원이 한정적인 용량 제한으로 사용하는 서비스일 경우,
어차피 파일 경로를 DB에 저장하므로 하나의 디렉토리에 다 때려넣어도 상관은 없다)
그렇다면 분산을 해야 하는데, 어떻게 분산할까?
1. 사용자마다 폴더를 나눈다.
- 첫째에서 언급했던 바도 '분산'에 해당된다. 이 방법을 채택하지 않을 이유는 이미 언급했다.
2. 날짜마다 폴더를 나눈다(일정 기간을 기준으로, 해당 기간 안에 생성된 자원은 모두 해당 폴더에 저장한다)
- (사용량이 매우 일정하고 예측 가능할 경우)괜찮은 방식이라 생각한다. 파일을 적절히 나눌 수 있고,
관리하는 입장에서도 시각적으로 직관적이다. '기간별 사용량'이라는 약간의 통계정보가 될 수 있음.
- 다만 사용량이 많은 기간과 적은 기간마다 디렉토리 크기가 크게 달라질 가능성이 있다.
3. 해시테이블 자료구조와 유사하게 폴더를 샤딩하여 관리한다 (이 방법으로 결정)
- 사용자가 어떤 기간동안 어떻게 사용하든 크게 영향받지 않는다.서버 관리자의 통제권이 늘어난다.
- 어떤 데이터가 어떤 샤드에 있는지는 DB에 기록한다. 파일 경로의 추적이 어렵지 않다.
- 다만 "기간별로 폴더를 나눈다"에서 얻을 수 있는 통계정보의 이점이 줄어드는데,
통계 로직과 데이터는 애초에 별도로 관리했어야 할 일이라는 생각이 든다.
따라서 샤드 사이즈가 10이라고 가정했을 때
shard_00, shard_01...shard_09 까지의 디렉토리를 미리 생성해 놓고
파일 메타데이터가 저장될 DB 내 'File 테이블의 PK'에 '해시코드+모듈러 연산'을 한 값으로 샤드를 찾아
해당 디렉토리에 저장하기로 결정했다.
샤드를 늘려야 할 땐?
1. 샤드를 찾아가는 로직에 샤드 샤용량 별 가중치를 부여하는 로직이 필요할 듯 하다.
그렇다면 단순히 샤드를 추가하고, 애플리케이션 코드에서 샤드 사이즈를 조절하는 것 만으로 분산 설정이 완료될 것이다.
그렇다면 남아 있는 문제는?
'샤드 사용량 한계치에 영향을 주는 요소는 '총 파일 용량'과 '파일의 개수'중 무엇일까?'
'적정 샤드 사용량이란 어느 정도인가?'
의 결론을 내는 것이 되겠다. 해당 질문에 섣불리 결론을 내긴 어렵고 직접 테스트해보는 것이 정확할 듯 하다.
'클라우드 저장소 만들기' 카테고리의 다른 글
클라우드 저장소 만들기 - UUID PK, 어떻게 만들어서 어떻게 저장할까? (1) | 2025.03.02 |
---|---|
클라우드 저장소 만들기 - PK 결정, UUID vs Auto Increment (0) | 2025.02.28 |