갑자기 어플리케이션 실행 시 아래와 같은 예외가 발생했다.
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로 바뀌게 된다.