https://bcoding-lab.tistory.com/293?category=868268
지난 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
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 서버로 와서 확인해준다.
과연 아무런 것도 안해줬는데 공유가 되었을까? 두근두근
미쳤다..
너무 신기하다 🫢
참고
댓글