MongoDB의 ReplicaSet을 구성할 때 PRIMARY-SECONDARY-ARBITER 형태로 구성하려 했는데,

rs.initiate() 를 하고 보면 PRIMARY-SECONDARY-SECONDARY로 구성되어 있다.

이럴 땐 원래 ARBITER로 구성하려 했던 서버를 ReplicaSet에서 삭제하고 rs.addArb() 로 다시 추가해주면 된다.


// 상태확인

shard_001:PRIMARY> rs.status()

{

    "set" : "shard_001",

    "date" : ISODate("2015-09-09T23:53:33Z"),

    "myState" : 1,

    "members" : [

        {

            "_id" : 0,

            "name" : "shard-001-primary.bloodguy.com:27018",

            "health" : 1,

            "state" : 1,

            "stateStr" : "PRIMARY",

            "uptime" : 54488,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "self" : true

        },

        {

            "_id" : 1,

            "name" : "shard-001-secondary.bloodguy.com:27018",

            "health" : 1,

            "state" : 2,

            "stateStr" : "SECONDARY",

            "uptime" : 53336,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "lastHeartbeat" : ISODate("2015-09-09T23:53:32Z"),

            "lastHeartbeatRecv" : ISODate("2015-09-09T23:53:31Z"),

            "pingMs" : 1,

            "syncingTo" : "shard-001-primary.bloodguy.com:27018"

        },

        // 이 서버는 원래 ARBITER로 하려고 했는데 SECONDARY로 추가되어 있다

        {

            "_id" : 2,

            "name" : "shard-001-arbiter.bloodguy.com:27018",

            "health" : 1,

            "state" : 2,

            "stateStr" : "SECONDARY",

            "uptime" : 53336,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "lastHeartbeat" : ISODate("2015-09-09T23:53:32Z"),

            "lastHeartbeatRecv" : ISODate("2015-09-09T23:53:33Z"),

            "pingMs" : 1,

            "syncingTo" : "shard-001-primary.bloodguy.com:27018"

        }

    ],

    "ok" : 1

}


// ARBITER로 구성하려 했으나 SECONDARY로 추가되어 있는 서버를 ReplicaSet에서 삭제

shard_001:PRIMARY> rs.remove('shard-001-arbiter.bloodguy.com:27018')


// 확인

shard_001:PRIMARY> rs.status()

{

    "set" : "shard_001",

    "date" : ISODate("2015-09-09T23:53:33Z"),

    "myState" : 1,

    "members" : [

        {

            "_id" : 0,

            "name" : "shard-001-primary.bloodguy.com:27018",

            "health" : 1,

            "state" : 1,

            "stateStr" : "PRIMARY",

            "uptime" : 54488,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "self" : true

        },

        {

            "_id" : 1,

            "name" : "shard-001-secondary.bloodguy.com:27018",

            "health" : 1,

            "state" : 2,

            "stateStr" : "SECONDARY",

            "uptime" : 53336,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "lastHeartbeat" : ISODate("2015-09-09T23:53:32Z"),

            "lastHeartbeatRecv" : ISODate("2015-09-09T23:53:31Z"),

            "pingMs" : 1,

            "syncingTo" : "shard-001-primary.bloodguy.com:27018"

        }

    ],

    "ok" : 1

}



이제 삭제한 서버로 가서 mongod를 중지한 후 data를 지우고 mongod를 재시작한다.

// mongod를 접속해보면 상태가 REMOVED로 되어 있는 것을 확인할 수 있다

// 여튼 mongod shutdown

shard_001:REMOVED> use admin

switched to db admin

shard_00:REMOVED> db.shutdownServer()

// mongo shell을 빠져나옴

> quit()


// 데이터 삭제

[root@shard-001-arbiter]# rm -rf MONGO_DATA_PATH/*


// mongod 재시작

[root@shard-001-arbiter]# MONGO_BIN_PATH/mongod -f MONGO_CONF_PATH



다시 PRIMARY로 가서 ARBITER로 추가.

// ARBITER 추가

shard_001:PRIMARY> rs.addArb('shard-001-arbiter.bloodguy.com:27018')

{ "down" : [ "shard-001-arbiter.bloodguy.com:27018" ], "ok" : 1 }


// rs.status()를 해보다가 추가한 서버의 stateStr이 ARBITER로 되는 것을 확인했으면 완료

shard_001:PRIMARY> rs.status()

{

    "set" : "shard_001",

    "date" : ISODate("2015-09-09T23:53:33Z"),

    "myState" : 1,

    "members" : [

        {

            "_id" : 0,

            "name" : "shard-001-primary.bloodguy.com:27018",

            "health" : 1,

            "state" : 1,

            "stateStr" : "PRIMARY",

            "uptime" : 54488,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "self" : true

        },

        {

            "_id" : 1,

            "name" : "shard-001-secondary.bloodguy.com:27018",

            "health" : 1,

            "state" : 2,

            "stateStr" : "SECONDARY",

            "uptime" : 53336,

            "optime" : Timestamp(1441842796, 1),

            "optimeDate" : ISODate("2015-09-09T23:53:16Z"),

            "lastHeartbeat" : ISODate("2015-09-09T23:53:32Z"),

            "lastHeartbeatRecv" : ISODate("2015-09-09T23:53:31Z"),

            "pingMs" : 1,

            "syncingTo" : "shard-001-primary.bloodguy.com:27018"

        },

        // ARBITER로 추가되었다

        {

            "_id" : 2,

            "name" : "shard-001-arbiter.bloodguy.com:27018",

            "health" : 1,

            "state" : 7,

            "stateStr" : "ARBITER",

            "uptime" : 112,

            "lastHeartbeat" : ISODate("2015-09-10T00:16:49Z"),

            "lastHeartbeatRecv" : ISODate("2015-09-10T00:16:50Z"),

            "pingMs" : 1

        }

    ],

    "ok" : 1

}





[참고]

http://docs.mongodb.org/manual/tutorials/convert-secondary-into-arbiter/






Posted by bloodguy
,