Loading...

DB/MongoDB / / 2022. 5. 3. 16:42

몽고DB 11강. 리플리카 셋 실습, 저널링

반응형

https://blog.naver.com/getinthere/222302852437

 

몽고DB 6강 - 리플리카 셋

한 개의 Primary 서버와 두 개의 Secondary 서버로 구성됨. Primary 서버에서 데이터를 받으면 Seconda...

blog.naver.com

 

 

1. mobaXterm 실행

터미널 창 여러개 띄우는것보다 mobaXterm의 탭으로 서버 여러개 띄우는게 편하다.

cmd shell로 띄울 수도 있다.

 

우클릭해서 cmd 선택

2. 폴더 생성

 

Windows 경로

mkdir c:\mongo
mkdir c:\mongo\var1
mkdir c:\mongo\var2
mkdir c:\mongo\var3

 

Linux 경로

mkdir /home/mobaxterm/mongo
mkdir /home/mobaxterm/mongo/var1
mkdir /home/mobaxterm/mongo/var2
mkdir /home/mobaxterm/mongo/var3

 

var1을 프라이머리 서버로,

var2, var3을 세컨더리 서버로 사용할 것이다.

 

 

3. 서버 3대 실행

 

경로에 쌍따옴표를 꼭 붙여야 함에 유의하자.

 

3개의 서버가 downSet이라는 이름을 가지고 있기 때문에 하나로 묶을 수 있다.

아직 묶인 상태는 아니기 때문에 설정을 따로 해줘야한다.

 

mongod --replSet downSet --dbpath "c:\mongo\var1" --port 10000
mongod --replSet downSet --dbpath "c:\mongo\var2" --port 10001
mongod --replSet downSet --dbpath "c:\mongo\var3" --port 10002

 

 

총 3개의 탭을 열어 3개의 서버를 실행시켜준다.

아직 프라이머리 서버와 세컨더리 서버 설정해준것은 없다!!

 

 

4. config 설정으로 리플리카셋 동기화 시작

 

10000번 포트로 접속해서 변수를 하나 만들어준다.

 

포트번호, IP주소, 리플리카셋 이름을 제외하고는 고정이다.

리플리카셋 이름은 서버 실행할 때 지정해놓은 이름(downSet)이기 때문에 이것만 신경쓰면 되겠다.

 

mongo localhost:10000

let config = {_id:"downSet", members:[{_id:1, host:"localhost:10000"}, {_id:2, host:"localhost:10001"}, {_id:3, host:"localhost:10002"}]};

 

이제 반영만 해주면 된다.

 

rs.initiate(config);

 

 

5. 서버 동작 확인

mongo localhost:10000

 

6. 리플리카 셋 상태 확인

 

실제로 잘 반영되었는지 확인해보자.

rs.status();

 

7. 리플리카셋 마스터 확인

 

마스터(프라이머리 서버)가 누군지 알려주는 명령어이다.

 

db.isMaster()

 

8. Primary 서버에서 값 넣기

 

프라이머리 서버에 값을 넣어봐야 세컨더리 서버에 값이 복제되는지 확인할 수 있겠다.

 

db : 현재 내가 위치한 db를 확인해보니 test db에 있다.

 

show dbs; : 만들어져 있는 데이터베이스 목록을 봤을 땐 test db가 존재하지 않는다.

 

내부에 데이터가 save 될 때 생성되는 것이다.

 

db.users.save({id:1, username:"ssar"});

 

 

9. Secondary 서버에서 값 동기화 확인

 

10001번으로 들어가서 find 해보자.

동기화는 잘 되었는데 세컨더리 서버에서 읽을 수 있는 설정을 해줘야한다.

 

mongo localhost:10001
rs.secondaryOk();
db.users.find();

 

10. Primary에서 Secondary 데이터 확인

11. Primary가 죽었을 때 데이터 동기화 프로세스

 

스프링에서 프라이머리 서버가 꺼졌을 때 DB 연결이 끊길 것이다.

앞단에 라우터를 둬서 프라이머리 서버가 꺼졌을 때 세컨더리 서버로 넘어갈 수 있도록 설정해줘야한다.

 

프라이머리 서버를 종료시켜보자.

프라이머리 서버가 돌고있는 cmd 창에서 Ctrl + C 눌려주면 된다.

 

10000번이 돌고있는지 파이프라인을 걸어서 확인해준다.

 

netstat -ano | grep 1000*

 

10001번에 접속해있는 cmd 창에서 rs.status( );를 입력해보면

10001번이 PRIMARY 서버로 설정되어있는 것을 확인할 수 있다.

 

 

10000번 포트가 죽어있는 상태에 10001번 서버에 insert를 하면

10000번은 데이터를 하나만 가지고있다.

 

나중에 10000번을 직접 켜주면 자동 동기화 될 것이다.

 

mongod --replSet downSet --dbpath "c:\mongo\var1" --port 10000 // 서버 실행
mongo --port 10000 // 서버 접속
rs.secondaryOk(); // 읽기 지원
db.users.find();

 

10000번 포트 서버가 SECONDARY 서버로 바뀌었고

서버를 켜니 자동으로 동기화가 완료되었다.

 

 

 

12. Primary 우선순위 조건

13. heartbeat 주기 설정

 

14. 저널링이란?

 

프라이머리 서버(A)에 a라는 데이터가 1초에 들어왔다.

1번 세컨더리 서버(B)는 oplog를 확인하는데 1.5초가 걸리고,

2번 세컨더리 서버(C)는 oplog를 확인하는데 2초가 걸린다고 하자.

 

A 서버가 1.3초에 죽는다고 하면 a라는 데이터는 유령 데이터가 된다.

 

 

이를 위해 저널링 시스템의 역할이 나온다.

 

a 데이터가 1초에 들어오자마자 저널링 시스템이 데이터를 파일에 기록해둔다.

그리고 A 서버가 죽은 후 B 서버가 프라이머리 서버가 되었다고 해보자.

 

 

그리고 A 서버를 다시 직접 실행시켜 부활시키면

프라이머리 서버(B)의 Oplog 동기화하고,

유실되었던 데이터는 저널링 시스템이 프라이머리 서버(B)에 push 해준다.

 

저널링은 동기화 시간 타이밍 때문에 사용한다.

데이터 유실을 방지할 수 있다.

 

 

 

15. 저널링 없이 리플리카셋 구성

16. Primary 데이터 동기화 시점 변경

17. oplogsizeMB 설정 방법

18. 현재 Oplog 크기 확인 방법

 

 

[출처]

 

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

 
반응형