본문 바로가기
Back Side/DBMS > MongoDB

[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (2) - 로컬에서 Replica Set 구성하기

by developerBeluga 2022. 7. 12.
728x90
반응형

 

https://bcoding-lab.tistory.com/293?category=868268 

 

[MongoDB] Transaction 트랜잭션 개념부터 실습까지 (1) - Transaction numbers are only allowed on a replica set member

Transaction이란 예를 들어, 위 그림과 같이 4개의 데이터를 지운다고 과정을 하도록 하겠습니다. 순차적으로 작업을 하던 중 C에서 에러로 인해 데이터 삭제가 불가능한 상태가 되었습니다. C,D는

bcoding-lab.tistory.com

지난 1편에서 트랜잭션을 하기 위해서는 Replica Set 환경 구성이 필수라는 것을 알았다.

무려 이틀에 걸쳐 Replica Set을 구성하였는데, 정말 에러란 에러는 다 만난 것 같다.

 

아래는 내가 만난 에러들이다.

- Error connecting to 127.0.0.1:27018 :: caused by :: Connection refused

- "errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 127.0.0.1:27018 failed with Error connecting to 127.0.0.1:27018 :: caused by :: Connection refused"

- "error":"NotYetInitialized: Cannot use non-local read concern until replica set is finished initializing.

혹시 이런 에러가 있다면 아래에서 설명할 Replica Set 구성하기가 도움이 되시길 🙏

 

 

0) mongod 끄기

brew services stop mongodb/brew/mongodb-community

기존의 port와 mongod를 사용한다면 현재 사용하고 있는 mongod를 꺼주는 것이 좋다.

 

brew services list

mongodb-community status 값이 none이나 stop이면 된다.

 

1) 새로운 폴더 만들어주기

 

 

 

dbPath로 가서 기존 폴더 옆에 mongodb1이라고 새로운 파일을 만든다.

당연히 이름은 뭘 하든 상관없다.

 

dbPath는 mongod.conf에 storage 아래에 명시되어져 있다.

혹시 mongod.conf 파일이 어디에 있는지 모르는 사람은 아래 글을 보는걸 추천 ✅

https://bcoding-lab.tistory.com/295?category=868268 

 

[MongoDB] mongod.conf 설정 파일 찾기 - masOS의 경우

MongoDB에서 트랜잭션을 위해 리플리카셋을 설정을 시도하던 중 설정 파일을 찾을 수 없었다. vi /etc/mongod.conf 물론 위 코드로 바로 열어서 편집해줄 수 있긴 하다. (나의 경우 '아니 편집이 가능하

bcoding-lab.tistory.com

 

 

2) mongod 실행시키기

mongod --replSet <레플리카셋 이름> --dbpath <DB 경로>  --port <port 번호>

// 예시
mongod --replSet abc --dbpath /opt/homebrew/var/mongodb/  --port 27017

터미널에 위와 같이 코드를 쳐준다.

그럼 잘 되는 사람도 있겠지만 나는 잘 안되었다.

 

나의 경우 "error":"NotYetInitialized: Cannot use non-local read concern until replica set is finished initializing." 말만 터미널에 나오기만 했다.

찾아보니 터미널을 끄지 말고 다른 터미널을 켜서 하라는 말이 있어서 해봤다니 성공!

 

해당 터미널은 살려두고 새로운 터미널을 킨다.

mongod --replSet abc --dbpath /opt/homebrew/var/mongodb1/  --port 27018

다른 서버도 DB 경로와 port를 다르게 해주고 돌려준다.

여기에서도 계속 error가 나온다면 우선 터미널을 끄지 말고 계속 해라.

 

또 새로운 터미널을 킨다.

mongo --port 27017

먼저 연결해준 27017에 접속해준다.

 

매우 접속이 잘 되는 것을 확인 할 수 있다!

 

 

 

3) replSet 설정하기

인제 replSet을 구성해줄 것이다.

rs.initiate({
    _id:"abc",
    members:[
    	{ _id: 0, host:"127.0.0.1:27017" },
        { _id: 1, host:"127.0.0.1:27018" }
    ] 
})

mongo 쉘에 위에 _id에는 위에서 설정한 레플리카셋 이름을 넣어주고 members에는 서버들을 넣어준다.

 

 

 

4) 확인하기

Replica Set 환경이 잘 구성되었는지 확인해보자.

rs.status()

위 코드를 mongo 쉘에 쳐보면 바로 알 수 있다.

 

이렇게 members에 설정해준대로 만들어지면 우선 안심해도 된다.

 

mongo --port 27018

가장 중요한 두번째 서버에 접근해보도록 하자.

아무런 에러 없이 잘 들어가진다면 Replica Set 구성에 성공한 것이다.

 

이렇게 첫번째와 두번째에 이름이 다르게 나온다.

Primary가 클라이언트와 직접적으로 정보를 주고 받는다.

근데 Primary에서 장애가 발생하면 공유 받은 DB를 Secondary가 받게 된다.

 

 

 

5) 간단한 예제

use testdb

db.createCollection("testcollection")

show dbs

먼저 Primary 서버에 차례대로 입력한다.

(서버에 들어가는 방법은 터미널에 mongo --port [port 번호] 을 입력해주면 된다)

매우 잘 만들어진 것을 알 수 있다.

 

// Secondary에서는 read operation이 막혀있으므로 풀어주기
rs.secondaryOk()

show dbs

다음 Secondary 서버로 와서 확인해준다.

과연 아무런 것도 안해줬는데 공유가 되었을까? 두근두근

 

미쳤다..

너무 신기하다 🫢

 

 

 

참고

https://stackoverflow.com/questions/70081140/mongodb-replica-set-cannot-use-non-local-read-concern-until-replica-set-is-fin

 

MongoDB Replica Set : Cannot use non-local read concern until replica set is finished initializing

I tried to create a replica set following instruction such as : https://hevodata.com/learn/mongodb-replica-set-3-easy-methods/ Sadly, I have a problem at the first step : Problem The command : mon...

stackoverflow.com

 

 

 

 

 

728x90
반응형

댓글