복제
몽고DB를 실제 서비스로 사용하기 위해서 복사본을 여러 서버상에 보관하고 사용하게 할 수 있다. 몽고DB에서 지원하는 복제 셋을 생성하여 복제를 설정할 수 있다. 클라이언트 요청을 처리하는 Primary 서버 한대와 복사본을 갖는 Secondary서버 여러대로 이루어진다.
Connection Format(연결형식)
몽고DB의 인스턴스 간 연결, 사용자 시스템에서 어떠한 몽고 DB의 인스턴스에 연결 하기 위해서 사용하는 포멧을 Connection String URI Format 이라고 한다.
Standard Connection String Format(표준 연결 문자열 형식)
MongoDB의 인스턴스에 연결되는 URI의 표준 형식이다.
mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]
DNS Seed List Connection Format(DNS Seed List 연결 형식)
몽고DB 버전 3.6부터 DNS Seed List라는 새로운 연결 방식을 지원한다.
DNS를 사용하여 사용 가능한 서버 목록을 구성하여 배포 유연성을 높이고 클라이언트 재구성 없이 서버를 변경할 수 있다.
mongodb+srv://server.example.com/
복제 셋 설정
3-노드(노드가 3개인) 복제 셋을 설정하는 방법을 진행해본다.
몽고DB가 고가용성 및 재해 복구를 처리하는 방법을 이해할 수 있다.
DNS Seedlist 연결 형식을 사용하여 복제 셋에 연결하는 방법을 지정한다.
DNS를 사용하면 몽고 DB 복제 셋 멤버를 호스팅 하는 서버를 클라이언트를 재구성 할 필요없이 변경할 수 있다.
./mongod --replSet mdbDefGuide --dbpath ~/workspace/tool/data/rs1 --port 27017 --oplogSize 200
./mongod --replSet mdbDefGuide --dbpath ~/workspace/tool/data/rs2 --port 27018 --oplogSize 200
./mongod --replSet mdbDefGuide --dbpath ~/workspace/tool/data/rs3 --port 27019 --oplogSize 200
rs1, rs2, rs3 이라는 디렉토리 3개를 만들어 3-노드 복제 셋을 구성한다.
각각 파워쉘이나 명령 프롬포트에서 진행을 한다.
각각 별도의 mongod프로세스가 실행 되며, 해당 위치에 데이터베이스의 정보가 쌓이게 된다.
복제 셋의 기본은 하나의 복제 셋 내의 세 노드가 서로 멤버간 연결을 할 수 있어야한다. 몽고DB 3.6 부터는 모두 로컬호스트(127.0.0.1)에 바인딩 되어진다. 각 복제셋의 멤버가 다른 IP 주소에도 바인딩이 필요하다면 mongod 실행시 실행 옵션 --bind_ip를 추가하거나, 인스턴스 구성파일의bind_ip를 사용해야한다.
./mongo --port 27017
다른 터미널을 사용하여 mongod port 27017에 연결을 한다.
이제 세개의 노드를 하나의 복제 셋으로 만드는 작업을 진행한다.
//복제 셋 구성 도큐먼트
rsconf = {
"_id" : "mdbDefGuide",
"members" : [
{
"_id" : 0,
"host" : "localhost:27017"
},
{
"_id" : 1,
"host" : "localhost:27018"
},
{
"_id" : 2,
"host" : "localhost:27019"
}
]
}
//구성 도큐먼트로 복제 셋 시작
rs.initiate(rsconf)
_id 값은 복제셋의 이름이고, 정수이다. 그리고 고유한 값이어야한다.
rs.status()
복제 셋의 구성을 볼 수 있다.
rs.${무언가..}, 즉 rs 보조자 함수는 복제 보조자 함수를 포함하는 전역 변수이다. rs.help()를 실행하여 내용을 볼 수 있다.
복제 셋은 입력과 출력을 하는 대표, primary를 선출해야한다. 예시를 따라 27017 포트의 인스턴스를 프라이머리로 선택하였다.(과반수에 의해 선정)
데이터를 마스터에 넣고 뺀 다음 secondaray 에서 잘 복제해가는지 확인 할 수 있다.
secondaryConn = new Mongo("localhost:27018")
secondaryDB= secondaryConn.getDB("test")
슬레이브에 대한 연결을 인스턴스 화 한다.
접근 기타 오류
error not master and slaveOk=false
https://hackolade.com/help/MongoDBerrornotmasterandslaveOkf.html
복제 셋에서 rs.secondaryOk() 명령어를 사용한다. 복제 셋이 마스터 하위의 노드가 되겠다고 하는 명령어이다. (읽기 작업에 대한 허용)
rs.help()를 참고하며 활용하면 복제 셋 구성을 변경하는것이 쉽다는 것을 알 수 있다.
멤버를 제거하고 추가할 수 있으며 reconfig를 통해 재구성 할 수 있다.
복제 셋 설계
과반수(majority)의 개념
복제 셋의 프라이머리를 선출하려면 멤버의 과반수 이상이 필요하다. 즉 최소 3개 이상의 노드부터 복제 셋을 구성할 수 있다.
복제 셋의 프라이머리 선출은 데이터의 최신 유무, 우선순위, 프라이머리에 도달할 수 있는가 등으로 검사를 수행한다.
복제 셋 멤버는 서로 2초마다 heartbeat(ping)을 보낸다.
10호 이내 heartbeat가 없다면 해당 멤버는 불량 멤버가 되며 접근할 수 없는 것으로 선정된다.
복제 셋의 구성요소
동기화
몽고DB는 프라이머리가 수행한 쓰기를 모두 포함한 로그 oplog를 보관하여 복제를 수행한다.
해당 로그는 제한 컬렉션이며 세컨더리는 이 컬렉션에 복제를 위한 연산을 쿼리한다.
다른 동기화 유형으로 복제를 통해 동기화를 수행한다.
참고
Connection format : https://www.mongodb.com/docs/manual/reference/connection-string/#std-label-connections-standard-connection-string-formatd
'컴퓨터 > database' 카테고리의 다른 글
몽고디비를 사용하면서 느낀점 (0) | 2022.10.08 |
---|---|
[MongoDB] 몽고DB 후다닥 시작하기 - 6 (집계 프레임워크) (0) | 2022.07.10 |
[MongoDB] 몽고DB 후다닥 시작하기 - 4 (인덱스) (0) | 2022.06.27 |
[MongoDB] 몽고DB 후다닥 시작하기 - 3 (0) | 2022.06.26 |
[MongoDB] 몽고DB 후다닥 시작하기 - 2 (0) | 2022.06.26 |