몽고db 레플리카 / backup /구성
mongodb replica set 설정 절차
- replica set 의 각 member 들을 실행
- 이중 한 mongod instance 에 mongosh(command 는
mongo
이다.) 를 실행한다. 이때 1번째 node 주소를 넣어서 접속하자.mongo --host mongo1:27017
- 그리고 shell 에서
rs.initiate()
를 실행한다.(아래 참고) rs.conf()
를 하면 설정된 내역이 보인다. 이 내용이 mongodb data 에 저장된 내용이기에, 한번rs.initiate
를 하고나면, 다음에 mongodb 를 restart 를 해도 다시 rs.initiate 를 해줄 필요는 없다.(참고:Replica Set Configuration — MongoDB Manual)rs.status()
를 하면 누가 primary 인지 확인할 수 있다.rs.initiate()
가 된 이후에 mongod 를 restart 하면 자동으로 알아서 replicaset 을 구성하는데, 최초에 primary 를 정하기 위해 election 을 한다. 그래서 뜨자마자rs.status()
를 때리는 경우에 모두가 SECONDARY 로 있다가 election 에 의해 PRIMARY 가 정해진다.(추측)
rs.initiate( {
_id : "rs0",
members: [
{ _id: 0, host: "mongodb0.example.net:27017" },
{ _id: 1, host: "mongodb1.example.net:27017" },
{ _id: 2, host: "mongodb2.example.net:27017" }
]
})
/* rs.status() */
{
"set" : "dbrs",
...
"members" : [
{
"_id" : 0,
"name" : "mongo1:27017",
"health" : 1.0,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 1070,
"optime" : {
"ts" : Timestamp(1642120547, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2022-01-14T00:35:47.000Z"),
"lastAppliedWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"lastDurableWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1642119527, 1),
"electionDate" : ISODate("2022-01-14T00:18:47.000Z"),
"configVersion" : 1,
"configTerm" : 2,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "mongo2:27017",
"health" : 1.0,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1032,
"optime" : {
"ts" : Timestamp(1642120547, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1642120547, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2022-01-14T00:35:47.000Z"),
"optimeDurableDate" : ISODate("2022-01-14T00:35:47.000Z"),
"lastAppliedWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"lastDurableWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"lastHeartbeat" : ISODate("2022-01-14T00:35:48.162Z"),
"lastHeartbeatRecv" : ISODate("2022-01-14T00:35:47.266Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "mongo1:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 2
},
{
"_id" : 2,
"name" : "mongo3:27017",
"health" : 1.0,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1032,
"optime" : {
"ts" : Timestamp(1642120547, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1642120547, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2022-01-14T00:35:47.000Z"),
"optimeDurableDate" : ISODate("2022-01-14T00:35:47.000Z"),
"lastAppliedWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"lastDurableWallTime" : ISODate("2022-01-14T00:35:47.494Z"),
"lastHeartbeat" : ISODate("2022-01-14T00:35:48.163Z"),
"lastHeartbeatRecv" : ISODate("2022-01-14T00:35:47.265Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncSourceHost" : "mongo1:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1,
"configTerm" : 2
}
],
...
}
priority 조정 방법
priority 가 조정되면, 조정된 값은 mongodb 가 꺼졌다가 켜져도 유지된다.
cfg = rs.conf()
cfg.members[0].priority = 2
rs.reconfig(cfg)
auth 를 사용하면 key 가 필요하다.
3개의 node 가 있다면, 3개가 다 같은 key file 을 사용해야 한다.
키파일 생성은 아래처럼 하면 된다.
$ openssl rand -base64 756 > /var/lib/mongo/replica_set_key
$ chmod 400 /var/lib/mongo/replica_set_key
그리고 이 key file 의 path 를 지정해 주면 된다.
parameter 로 직접 넘길 수도 있고,
mongod --auth --keyFile /var/lib/mongo/replica_set_key --port 27017 --dbpath /var/lib/mongodb
또는 configuration file 에 설정을 해줄 수도 있다.
# mongod.conf
...
#processManagement:
security:
authorization: enabled
keyFile: /var/lib/mongo/replica_set_key
...
replicaSet의 port 변경시
기존의 replicaSet 의 port 를 변경하는 경우이다. 예를 들어 현재 27017 로 replica set 이 구성되어 있는 mongodb 를 port 27018로 replicaSet을 구성하는 경우
먼저 모든 mongod 를 다 내리자.
그리고 모든 node의 monogd port 를 변경
primary node 를 띄우자.
기존의 rs 정보를 삭제 [ref. 3]
use local db.system.replset.find() db.system.repset.remove({"_id": "rs0"}) db.system.replset.find()
primary node 외의 node 에서 dbPath 의 data 를 모두 지우고, 모든 node 를 전부 띄운다(run).
dbPath 를 안지우고, 다른 secondary node를 띄우면, node의 replica set ID 가 맞지 않는다는 error 가 나온다.
- mongodb - Getting “replica set IDs do not match, ours:<>,remote node’s: <>” while trying to run replicaset of config servers - Stack Overflow
- database - replica set configuration incompatible - Stack Overflow
... "errmsg" : "Our replica set ID of xxxxx did not match that of 13.76.170.50:27017, which is xxxxxx", ...
그래서 primary 노드 외에 다른 node의 dbPath(
mongod.conf
에 설정된) 의 데이터를 지운다. dbPath 의 owner 설정에 주의해야 할 수 있다.mv /myapps/mongo/data/ /myapps/mongo/data_20220418 mkdir /myapps/mongo/data && chowner mongod:mongod /myapps/mongo/data/
그리고 실행을 하면, secondary node 로 data 가 다시 복사된다. 그리고 cluster 연결이 잘된다.
rs.initiate()
을 다시 한다.rs.initiate( { _id : "rs0", members: [ { _id: 0, host: "cluster1.mylocal.com:27018" }, { _id: 1, host: "cluster2.mylocal.com:27018" }, { _id: 2, host: "cluster3.mylocal.com:27018" } ] })
cluster 연결이 되고 나서, primary node 로 사용했던 1번째 node의 status 가
RECOVERING
상태에서 돌아오지 않아서, 1번째 node의 mongod 를 stop 하고, dbPath 를 지운후에 다시 띄웠다.- primary node 에서
rs.status()
를 확인하면"Could not find member to sync from"
이란 message가 보인다. 그래서rs.syncFrom
를 했는데, 변화가 없었다. 그래서 그냥 dbPath 를 지웠다.
- primary node 에서
See Also
- 쿠…sal: [컴][db] mongodb 를 production 에서 배포시 확인할 사항
- Change Hostnames in a Replica Set — MongoDB Manual
- 쿠...sal: [컴][db] mongodb, replica set
댓글 없음:
댓글 쓰기