MongoDB Replica Set에서 Primary 지정하기

TaeHye0n·2024년 4월 1일
1

pmeet

목록 보기
3/5
post-thumbnail
post-custom-banner

갑자기 어플리케이션 실행 시 아래와 같은 예외가 발생했다.

org.springframework.data.mongodb.UncategorizedMongoDbException:
Command failed with error 10107 (NotWritablePrimary): 'not primary' on server localhost:27017.

이유는 yml에서 연결한 mongo1이 primary가 아니기 때문이다.

docker exec -it mongo1 mongosh -u pmeet_user -p pmeet_pwd --authenticationDatabase admin

먼저 컨테이너에 진입해서

rs.config()

를 통해 priority를 체크해보자

myReplicaSet [direct: secondary] test> rs.conf()
{
  _id: 'myReplicaSet',
  version: 1,
  term: 26,
  members: [
    {
      _id: 0,
      host: 'mongo1:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long('0'),
      votes: 1
    },
    {
      _id: 1,
      host: 'mongo2:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long('0'),
      votes: 1
    },
    {
      _id: 2,
      host: 'mongo3:27017',
      arbiterOnly: false,
      buildIndexes: true,
      hidden: false,
      priority: 1,
      tags: {},
      secondaryDelaySecs: Long('0'),
      votes: 1
    }
  ],
  protocolVersion: Long('1'),
  writeConcernMajorityJournalDefault: true,
  settings: {
    chainingAllowed: true,
    heartbeatIntervalMillis: 2000,
    heartbeatTimeoutSecs: 10,
    electionTimeoutMillis: 10000,
    catchUpTimeoutMillis: -1,
    catchUpTakeoverDelayMillis: 30000,
    getLastErrorModes: {},
    getLastErrorDefaults: { w: 1, wtimeout: 0 },
    replicaSetId: ObjectId('66090e7a42f84beac35b9a70')
  }
}

전부 같은 우선순위를 가지고 있어 자동선출로 인해 mongo1이 secondary로 되어있고, mongo2가 primary로 되어있다.

그래서 primary인 mongo2 컨테이너에 접속해서

myReplicaSet [direct: primary] test> var cfg = rs.conf()

myReplicaSet [direct: primary] test> cfg.members[0].priority=2

myReplicaSet [direct: primary] test> rs.reconfig(cfg)

를 입력해주면 mongo1이 primary로 바뀌게 된다.

profile
왜? 에 대해 생각하려고 노력하는 개발자
post-custom-banner

0개의 댓글