현재 우리 회사는 약 600만개의 상품데이터를 가지고 있다.
디비엔진도 Myisam이다! 트랜잭션도 없고 테이블락밖에 없다
현재는 그나마 상품정제를 통해서 상품수를 좀 줄여나가면서 db관리를 해나가고 있는데
이보다 더 큰 상품개수를 가지고 있는 오픈마켓 이커머스 서비스들은 데이터베이스를 어떻게 관리하고 있을까?
단순히 RDBMS를 테이블을 잘 정규화해서 쓴다던가 하는 내용은 너무 모호한 것 같다는 생각이 들어서 정리하고자한다.
2억개의 데이터를 저장하고 보관하려면 데이터의 특성,용도,접근 패턴등에 따라서 달라질 수 있다
1. 데이터의 종류와 크기를 확인해보자
- 텍스트 데이터인가? 로그, 메타데이터, 메시지등을 담은 데이터인가?
- 숫자 데이터인가? 통계, 측정값등을 저장하는 데이터인가?
- 이미지,비디오인가? 대용량 파일들을 저장하는가?
2. 데이터베이스 선택
- RDBMS : 구조화된 데이터에 적합 / 데이터 무결성을 보장, 강력한 쿼리성능을 보여주지만 수평적인 확장이 어렵다(스키마 변경이 어렵다)
- NoSQL : 비구조화된 데이터에 적합 / 수평확장이 용이하고, 스키마를 유연하게 변경할 수 있음, 하지만 복잡한 쿼리성능은 RDBMS에 비해 떨어질 수 있다.
3. 파일스토리지 - 대용량 데이터인 경우
- HDFS(하둡 파일 시스템) : 대용량 파일을 분산 저장하는 방식
- Amazon S3 : 클라우드 기반 객체 스토리지
> 장점은 대규모 데이터를 저장할 수 있고, 수평확장이 용이하다. 단, 복잡한 쿼리나 트랜잭션에는 부적합하다.
4. 데이터 웨어하우스 - 분석 가능한 정보의 중앙 리포지토리? 중앙 데이터 모임? 이런느낌,,,
- Amazon Redshift
- Google BigQuery
- Snowflake
이런 도구들이 있고, 고성능 분석쿼리, 대용량 데이터처리를 할 수 있지만
실시간 데이터 처리에는 부적합하다. (OLTP?) - 통계를 낼때 잘 쓰는 기구?인 것 같다
5. 데이터 저장 전략
1) 데이터 샤딩 및 파티셔닝💛
- 샤딩 : 데이터를 여러 데이터베이스의 인스턴스로 나누어서 저장
(수평적인 분할(파티셔닝)과 비슷. 샤딩은 실제 DB서버를 분리하지만 수평적 파티셔닝은 동일한 DB서버내에서 테이블을 분할하는 것이다)
- 파티셔닝 : 한 데이터베이스 내에서 데이터를 논리적으로 나누어 저장(수직적인 분할)
2) 데이터 압축 및 인덱싱
- 압축 : 저장 공간 절약
- 인덱싱 : 빠른 검색과 접근을 위한 인덱스 생성하기
6. 결론 - 시나리오에 따른 데이터 저장 전략
1) 로그 데이터 저장
- Elasticsearch: 실시간 검색 및 분석
- Logstash/Kibana: 데이터 수집 및 시각화
2) 사용자 데이터 저장
- RDBMS (MySQL, PostgreSQL): 사용자 정보, 트랜잭션 데이터
- Redis/Memcached: 캐싱을 통한 빠른 접근
3) 빅데이터 분석
- Hadoop/Spark: 대규모 데이터 처리 및 분석
- Amazon Redshift: 대용량 데이터 분석
아무튼 2억개의 데이터를 단순히 저장하고 관리할건데 어떡할래? 라는 질문에는
어떤 데이터를 어떤 방식으로 사용하고 싶은데? 라는 질문부터 해야할 것 같다.
만약 검색을 빠르게 하고 싶다면 검색엔진인 ES를 사용해야할 것 이고,
대용량 데이터를 통해 통계를 내고싶다면 데이터웨어하우스( Redshift ?) 를 사용할 것이고
그 외로 쇼핑몰이라면 단순 상품에 대한 데이터를 저장하고 싶다면 RDBMS를 사용할 것 같다.
=> 내가 다루고자 하는 데이터의 크기와 다루고자하는 기능에 대해서 생각하고 도구를 결정해야 한다.
그리고 그 다음으로는 데이터 저장 전략을 고민해봐야할 것 같다.6ㅅ6
데이터 저장 전략에는 샤딩이 있고 파티셔닝이 있다.
샤딩은 수평분할 파티셔닝은 수직분할
쇼핑몰에서 2억개의 상품을 저장하고 관리해야한다면 어떻게 관리해야할까?
등록날짜로 관리한다고 친다면, 아마 샤딩을 통해서 상품 데이터를 나눠서 관리할 것 같다.
그러니까 답변을 정리하자면,,
우선 쇼핑몰에서 2억개의 상품을 관리한다고 가정한다면, 상품 데이터를 담는 테이블을 정규화를 통해 잘 나눈다.
그리고 인덱스로 설정하면 좋을 만한 컬럼을 찾아서 인덱스 설정을 진행해주고,
음,, 등록날짜를 기준으로? 아니면 데이터를 샤딩해서 저장할 것 같다. 정도의 답변을 할 것 같다
샤딩할지 파티셔닝할지는 그때 정해지는 기준따라서 달라지는 것 같다
또한 RDBMS에 저장할 데이터와 noSql에 저장할 데이터를 나눠서 관리할 것 같다.
🎇 RDBMS기준으로 봤을때 🎇
파티션 : 암튼 디비내에서 물리적으로 특정 기준을 가지고(value range, hash, key, 등등)잘라놓음 + 인덱싱도 파티션 내부에서만 생성됨
샤딩 : DB 서버조차 분리해버려(korea server, russia server)
'트러블 슈팅 (+궁금증해결)🚀' 카테고리의 다른 글
계속 늘어나는 대규모 시스템을 어떻게 구축해 나아가야할까 (1) | 2024.06.02 |
---|---|
트러블 슈팅이라기엔 애매하지만,, 라라벨에서 controller로 있던 파일들을 service패턴으로 ~ (0) | 2024.05.28 |
HttpStatus cannot be resolved to a variable in 스프링부트 (0) | 2024.03.24 |
flutter 안드로이드 웹뷰 디버깅 (0) | 2024.02.23 |
모바일 자판이 열린 상태에서 페이지를 이동하는 경우에 viewport가 깨지는 문제 해결 (1) | 2024.02.08 |