[컴][db] mongodb replica set 설정 절차

몽고db 레플리카 / backup /구성

mongodb replica set 설정 절차

  1. replica set 의 각 member 들을 실행
  2. 이중 한 mongod instance 에 mongosh(command 는 mongo 이다.) 를 실행한다. 이때 1번째 node 주소를 넣어서 접속하자. mongo --host mongo1:27017
  3. 그리고 shell 에서 rs.initiate() 를 실행한다.(아래 참고)
  4. rs.conf() 를 하면 설정된 내역이 보인다. 이 내용이 mongodb data 에 저장된 내용이기에, 한번 rs.initiate 를 하고나면, 다음에 mongodb 를 restart 를 해도 다시 rs.initiate 를 해줄 필요는 없다.(참고:Replica Set Configuration — MongoDB Manual)
  5. 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을 구성하는 경우

  1. 먼저 모든 mongod 를 다 내리자.

  2. 그리고 모든 node의 monogd port 를 변경

  3. primary node 를 띄우자.

  4. 기존의 rs 정보를 삭제 [ref. 3]

    use local
    db.system.replset.find()
    db.system.repset.remove({"_id": "rs0"})
    db.system.replset.find()
  5. primary node 외의 node 에서 dbPath 의 data 를 모두 지우고, 모든 node 를 전부 띄운다(run).

    dbPath 를 안지우고, 다른 secondary node를 띄우면, node의 replica set ID 가 맞지 않는다는 error 가 나온다.

    ...
    "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 연결이 잘된다.

  6. 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" }
        ]
    })
  7. 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 를 지웠다.

See Also

  1. 쿠…sal: [컴][db] mongodb 를 production 에서 배포시 확인할 사항
  2. Change Hostnames in a Replica Set — MongoDB Manual
  3. 쿠...sal: [컴][db] mongodb, replica set 

Reference

  1. Deploy a Replica Set — MongoDB Manual
  2. MongoDB keyfile | How Keyfile works in MongoDB?
  3. How to reset MongoDB replica set settings - Server Fault
  4. replicaset - mongodb : could not find member to sync from - Stack Overflow

댓글 없음:

댓글 쓰기