DB/MongoDB

몽고DB 10강. 레플리카 셋

JJJAEOoni 2022. 5. 3. 15:12
반응형

 

 

레플리카 셋을 구성하는 3개의 서버는 서로 다 내부적으로 스레드가 돌고 있다.

연결되어있는 애랑 나랑 가지고 있는 데이터가 같은지 체크하는 스레드이다.

양쪽으로 비교해서 가지고있는 데이터가 같으면 동기화가 잘된 것이다.

 

이렇게 비교하는 주기가 짧다.

 

길면 해킹당할 수 있기 때문이다.

 

 

만약 하나의 서버에 바보 데이터를 천재로 해킹하여 바꿨을 때

오른쪽에 너 천재야? 물어봐서, 아니 바본데? 스코어 1:1

왼쪽에 너 천재야? 물어봐서, 아니 바본데? 스코어 2:1

 

천재라는 데이터가 바보로 동기화된다.

 

그렇기 때문에 한, 두대로는 만들지 않는다.

항상 3대 이상으로 만든다.

 

무결성과 신뢰성을 지키기 위해!

 

이때 내부적으로 돌고 있는 스레드를 heartbeat라고 한다.

이 heartbeat 스레드는 2초마다 pooling 방식으로 통신하며 서로 죽었는지 살았는지 확인한다.

 

 

이때 heartbeat 신호가 잡히지 않으면 그 서버는 죽은 것이라 판단한다.

죽은 서버가 프라이머리 서버이면 자동으로 세컨더리 서버 중 하나가 프라이머리 서버가 되어

외부에 연결하여 통신한다.

세컨더리 서버 중 프라이머리 서버로 선택되는 것은 랜덤으로 되기도 하고 로직이 있기도 하다.

 

B에게 변화가 생겼을 때 A가 알 수 있는 방법

1. A → B 계속 물어보기 "너 데이터 변했니?" : request(묻다) 방식 : pooling 방식 : 부하가 심하다.
2. B → A 먼저 알려주기 "나 데이터 변했어!" : push 방식 : 부하가 적은 대신 A를 기억하고 있어야 한다.

기억하는 방식은 메모리에 부하가 있다.

- 계속 소켓 연결을 유지하여 기억할 것인가? 애초에 소켓 연결을 끊지 않는다 : 부하가 심함 : stateful 한 상태
  → 처음 연결했을 때 A와 B가 서로 끊지 않겠다고 약속하기만 하면 된다. 웹 소켓 방식!!

- 변화가 생겼을 때 소켓을 연결하여 push 할 것인가? : stateful 한 척
  → 변화가 생겼을 때 바로 연결할 수 있으려면 A는 항상 대기를 하고 있어야 한다 = accept 상태
       최초에 요청할 때 기억하고 있을 거니까 대기하고 있으라는 프로토콜을 알려줘야 함 SSE 프로토콜

 

이 3가지 서버를 관리하기 위해 config 서버가 필요하다.

메타 데이터를 들고 있으면 항상 걔를 통해 그 세상을 볼 수 있다.

 

이는 깊숙이 들여다보지 않아도 그 세상을 볼 수 있기 때문에 빠르다.

 

그래서 메타 서버라고도 한다.

 

항상 프라이머리 서버가 데이터를 받고 데이터를 받는 쿼리oplog에 저장해두었다가

Secondary 서버는 해당 oplog동기화하여

자신의 서버로 복제한 뒤 쿼리를 실행하여 데이터를 복제하는 방식이다.

Oplog operation log 수행 로그

db.food.save({id:1});라고 명령이 들어오면

Oplog에는 명령이 실행된 결과가 아니라 명령어가 들어간다.

 

이 명령어가 실행되면 내부에 데이터는 저장이 될 거고 생사를 확인하는 Heartbeat Thread와 별개로

RS Sync Thread 라고 해서 동기화하는 스레드가 있다.

 

Oplog에 다른 게 있니?라고 프라이머리 서버에만 물어보는 스레드이다.

물어봐서 다른게 있으면 동기화한다.

 

레플리카 셋 핵심 : 데이터 복구(동기화, 복제) -> 데이터 유실 방지, 서버 생사 유지(꺼지지 않음, 데몬)

레플리카 셋의 서버가 3개인 이유 : 무결성이 더 확실히 지켜져서 안전하다.
PS가 죽었을 때 외부에 메타 서버가 있으면 얘가 정해주면 되는데 메타 서버가 없을 때 PS가 될 서버를 정할 수가 없다.
이때 투표를 해서 프라이머리 선출권을 받는다.

프라이머리 서버는 내부 알고리즘에 의해 투표를 통해 선출된다.

레플리카 셋 개념 : 복제 시스템 구축

 

내가 프라이머리 서버에만 데이터를 저장해놓으면 얘가 죽었을 때 문제가 생긴다.

그래서 얘를 프라이머리 서버라고 하고 다른 애들을 세컨더리 서버라고 한다.

 

세컨더리 서버를 하고 얘가 2초마다 프라이머리 서버에 신호를 보내.

RS Sync Thread 주기가 짧을수록 데이터 유실이 적다. 동기화 속도가 더 빠르니까.

짧으면 짧을수록 부하가 심해지기 때문에 적절한 시간을 정해야 한다.

 

 

 

 

[출처]

 

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

 
 
반응형