DB/MongoDB

몽고DB 12강. 샤딩

JJJAEOoni 2022. 5. 4. 12:42
반응형

 

하둡 : 대용량 데이터를 분석할 수 있는 플랫폼

 

데이터를 모을 때 기본적으로 분산 처리한다.

수천대의 분산된 컴퓨터에 대용량 파일을 저장할 수 있는 기능을 제공하는 분산 파일 시스템(HDFS; Hadoop File System)

 

1000mB 동영상 10개를 저장할 때 5개의 컴퓨터에 분산저장을 한다고 하면

동영상 10개를 2개씩 나눠서 저장하는게 아닌

1000mB를 200mB씩 나눠서 분산 저장하는 개념이다.

분산 저장을 하둡이 해준다.

 

 

분산된 데이터를 다시 합치기 위해서는 하둡이 메타 데이터를 알고 있어야 한다.

어디에 얼마만큼 저장되어 있는지 알아야 동영상을 실행하기 위해 모을 수 있기 때문이다.

 

분산 저장한 데이터를 다시 합치는 것을 맵 리듀스라고 한다.

 

우리가 사용하려는 몽고DB도 마찬가지로 분산 저장을 지원한다.

 

I/O는 병렬 처리가 필수적이다.

 

빅데이터를 사용할 때는 분산 저장해서 비정형으로 넣어야한다!!

 

빅데이터는 수집할 때 I/O가 많이 일어나기 때문에 기존 RDB에 저장하지 않는다.

데이터가 너무 크니까!!

 

이렇게 큰 데이터를 분산해서 저장하면 검색하기가 어렵기 때문에

오픈소스로 풀려있는 몽고 DB, 하둡, 엘라스틱 서치를 사용한다.

 


 

매일매일 1초마다 데이터를 수집하여 엄청나게 많이 쌓인 비정형 데이터를

효과적으로 분석하고 검색하는데 가장 좋은 게 엘라스틱 서치이다.

 

엘라스틱 서치는 정형, 비정형, 숫자, 문자 등 모든 데이터를 분석하고

매우 빠르게 검색하는데 특화되어있다.

 

엘라스틱 서치(Elasticsearch) : 분산형 검색 및 분석 엔진

 


 

샤딩 : 분산 저장 한 데이터를 잘 검색할 수 있게 하기 위한 기능

 

빠르게 넣고 빠르게 찾아낼 수 있다.

바로 config 서버 덕분이다.

 

config 서버에 내가 어떤 데이터를 어디에 저장했는지 기록해두는 것이다.

 

 

config 서버에 mongod를 3개 가지고 있다.

config 서버도 레플리카 셋으로 구성되어 있다.

 

mongos 서버는 데이터를 저장할 때 config 서버에 기록하고,

데이터를 찾을 때 config 서버를 참고한다.

 

즉, config 서버는 모든 컨텍스트를 알고 있다.

config 서버가 인덱스, 목차의 역할을 한다.

 

레플리카 셋 3개를 구축하는 것을 샤드라고 한다.

 

다만 3개가 복제되는 게 아닌 데이터를 분산시키기 위한 세트이다.

무결성과 상관없이 빠르게 저장하고 빠르게 찾기 위함이다.

 


 

내가 1~6 데이터에서 4를 찾는 게 빠르까, 4~6 데이터에서 4를 찾는게 빠를까?

당연히 데이터의 범위가 적을수록 빠르다.

 

파티셔닝(수평적 분할) 하여 데이터를 분산 저장하면 검색도 빨라지는 것이다.

 

어디에 저장되어있는지 config 서버에 색인하는 게 복잡하긴 하지만

이 구성을 몽고가 자동으로 해준다! 샤드에서!!

 


 

클라이언트는 mongos 서버에 붙는다.

mongos 서버는 라우터이다.

 

어떤 식으로 라우팅 될까?

 

데이터가 들어왔을 때 왼쪽? 오른쪽? 가운데?

어느 서버로 보낼지 샤드키 설정에 따라 결정한다.

 

메타 데이터를 참고해서 전체 구성이 어떻게 되어있는지 기반에 따라 필요한 곳에 저장해준다.

 

들어오는 순서대로 막 분산 저장한다면 config 서버가 없어도 되겠지만 저장하는 방법이 따로 있다.

 

즉, mongos는 프론트 컨트롤러와 같다.

 

 

mongos의 포트 번호가 20000번이라면

클라이언트는 20000번으로만 접속하면 된다.

 

20000번에 데이터 a를 insert 하기만 하면

얘가 알아서 적절한 샤드의 프라이머리 서버로 들어가게 된다.

 

그러면 세컨더리 서버들이 heartbeat를 보내며 살아있는지 확인하고,

프라이머리 서버의 Oplog에는 a가 insert 되는 명령어가 저장되며

그 명령어를 동기화하기 위해 세컨더리 서버들이 RS Sync 스레드로 계속 확인한다.

그리고 변경을 감지하면 동기화한다.

 

샤드는 복제 시스템이 아니기 때문에 오른쪽, 왼쪽 샤드에는 a 데이터가 없다.

 

그리고 config 서버에는 a는 2번 서버에 있다는 정보와,

2번 서버의 포트 번호가 20001이라는 기록도 되어있다.

 

 

2번 샤드의 프라이머리 서버가 죽으면 hreatbeat를 주고받던 세컨더리 서버가 프라이머리 서버가 죽었음을 확인하고

세컨더리 서버 중 하나가 투표를 통해 프라이머리 선출권을 얻게 되어 프라이머리 서버가 된다.

 

config 서버에도 a 데이터가 저장되어있는 주소가 업데이트된다.

 


 

근데 오른쪽에 보니까 mongos 서버가 하나 더 있다. 이게 뭘까?

얘도 20000번 mongos 서버와 똑같은 시스템이 만들어져 있다.

 

mongos 서버가 뻗으면 옆으로 옮겨갈 수 있게!

 

이때 mongos 서버가 뻗었을 때 다른 mongos로 갈 수 있게 해주는 것은 샤딩과 관계없이

앞단에 로드 밸런서를 두어 mongos를 옮겨갈 수 있게 컨트롤러를 우리가 설계해주어야 한다.

 

그럼 로드밸런서가 꺼지면??

네트워크 로드 밸런서라고 물리적인 장비(L4 장비)가 있는데 엄청 비싸고 좋다. 안 꺼진다!!

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형