시작
현재 메신저 서비스를 보면 다른 테이블에서 Message 테이블을 참조할 일은 딱히 보이지 않는다.
Message를 FK로 사용할 일이 없다면 관계형보단 일반적으로 I/O가 빠른 Nosql을 사용해도 되지않을까?
MongoDB를 알아보자.
Document는 JSON {} 형태로 구성된다.
Field는 Column처럼 고정되지 않고 자유로운 key : value 형태이다.
value는 boolean, array([ ]), null, nested한 document({ }) 등이 가능하다.
Document
{
_id: ObjectId('64f9eb1cdb80f40007827e02'),
text: '안녕하세요',
'boolean': true,
array: [
1,
2,
3,
4
],
empty: null
}
하나의 Document는 다음과 같은 field를 가진다. ( _id라는 key에 ObjectId타입의 value )
ObjectId는 PK와 같은 고유한 키를 의미한다.
차이점은 PK는 DBMS가 직접 부여하고 ObjectId는 클라이언트에서 생성한다.
Router(mongos)는 ObjectId를 보고 데이터가 존재하는 Shard에서 데이터를 요청할 수 있는데 Sharding된 데이터를 빠르게 가져오기 위해 클라이언트에서 key를 생성한다는 듯 하다.
ObejctId는 12bytes binary data로 다음과 같이 구성된다.
Unix Timestamp(4bytes) + Random Value(5bytes) + Count(3bytes)
MongoDB의 분산 시스템
복제
Master-Slave 구성
Master 장애시 Slave에서 Master 선출
샤딩(Sharding)
대용량 데이터를 저장하기 위한 방법으로 소프트웨어적으로 db를 분산시켜 처리하는 구조
샤딩 방식에는 테이블 단위 분리, 테이블 자체 분할이 있다.
위 이미지를 보면 앞의 말을 이해할 수 있다.
'Router(mongos)는 ObjectId를 보고 데이터가 존재하는 Shard에서 데이터를 요청할 수 있다.'
맵 리듀스(Map Reduce)
한 대 이상의 하드웨어를 활용해 데이터를 분산하여 연산하고 다시 합치는 기술로 맵과 리듀스 단계로 나누어 처리한다.
참고 자료
https://kciter.so/posts/about-mongodb
https://www.youtube.com/watch?v=81JnYGT2HVQ&list=PL9mhQYIlKEheyXIEL8RQts4zV_uMwdWFj&index=4
'프로젝트 > Wallet-Messenger-Service' 카테고리의 다른 글
Message service 아키텍처 (0) | 2023.08.27 |
---|---|
회비관리 메신저 서비스 - ERD, API (0) | 2023.08.08 |
회비 관리 메신저 서비스 - 와이어프레임, ERD, API, 브런치 (0) | 2023.07.31 |
메신저 서비스 프로젝트 ERD, API 설계 (0) | 2023.07.31 |