특정 shard에 문제가 발생했거나, 낡은 서버를 새로운 서버로 교체하기 위해 shard를 제거해야 할 경우 아래 순서에 따라 진행하면 됨.

MongoDB 3.0 버전 기준이고, 버전에 따라 주의사항이 다르므로 반드시 버전에 맞는 공식문서를 확인해야 함.

 

// mongos 접속
[root@mongos]# $MONGO_BIN/mongo localhost:27017

// 인증
mongos> use admin
mongos> db.auth('ID', 'PASSWD')

// balancer 동작 중 확인
mongos> sh.getBalancerState()
true

// config DB에서 제거할 shard 확인
mongos> use config
mongos> db.shards.find()
{ "_id" : "shard_001", "host" : "shard_001/shard-001-primary:27018,shard-001.secondary:27018"}
{ "_id" : "shard_002", "host" : "shard_002/shard-002-primary:27018,shard-002.secondary:27018"}
{ "_id" : "shard_003", "host" : "shard_003/shard-003-primary:27018,shard-003.secondary:27018"}
{ "_id" : "shard_004", "host" : "shard_004/shard-004-primary:27018,shard-004.secondary:27018"}

// 제거할 shard는 shard_001 이라고 가정함

// admin DB에서 삭제 시작
mongos> use admin
mongos> db.runCommand({removeShard: 'shard_001'})
// 아래와 같은 값이 출력된 것임
// remaining.chunks가 shard_001에 존재하는 chunk 수이고 이게 balancer에 의해 다른 shard로 전부 이동되어야 함
// 이게 엄청 오래 걸림
// (모든 chunk에 데이터가 담겨 있고 각 chunk가 이동에 20초가 걸린다 가정해도 (14310 x 20) / 86400 = 3.3일 이상 소요됨)
{
    "msg" : "draining ongoing",
    "state" : "ongoing",
    "remaining" : {
        "chunks" : NumberLong(14310),
        "dbs" : NumberLong(3)
    },
    "note" : "you need to drop or movePrimary theses databases",
    "dbsToMove" : [
        "db_product",
        "db_user",
        "db_order"
    ],
    "ok" : 1
}

// 중간중간에 db.runCommand({removeShard: 'shard_001'}) 해보면 remaining.chunks 수가 점점 줄어드는 것을 확인할 수 있음
{
    "msg" : "draining ongoing",
    "state" : "ongoing",
    "remaining" : {
        "chunks" : NumberLong(10172),
        "dbs" : NumberLong(3)
    },
    "note" : "you need to drop or movePrimary these databases",
    "dbsToMove" : [
        "db_product",
        "db_user",
        "db_order"
    ],
    "ok" : 1
}

// 확인하다보면 언젠가는 remaining.chunks 수가 0이 됨
{
    "msg" : "draining ongoing",
    "state" : "ongoing",
    "remaining" : {
        "chunks" : NumberLong(0),
        "dbs" : NumberLong(3)
    },
    "note" : "you need to drop or movePrimary these databases",
    "dbsToMove" : [
        "db_product",
        "db_user",
        "db_order"
    ],
    "ok" : 1
}

// 이젠 remaining.db를 처리할 차례
// 저건 shard_001이 primary shard인 DB를 뜻함
// sh.status() 출력값의 databases 부분에서 확인할 수 있음
// primary shard를 다른 shard로 변경해줘야 함
// 만약 unsharded collection이 있다면 바로 실행하지말고 반드시 MongoDB 문서를 참고해서 버전에 맞는 방법으로 실행해야 함
// unsharded collection이 없다면 그냥 아래 명령어로 처리하면 됨
mongos> db.runCommand({movePrimary: 'db_product', to: 'shard_004'})
{
    "primary" : "shard_004/shard-004-primary:27018,shard-004.secondary:27018",
    "ok" : 1
}

// 나머지 DB들도 동일한 방식으로 primaryShard를 변경해 줌

// 그리고 마지막으로 removeShard 명령어를 실행해서 completed를 확인하며 마무리
mongos> db.runCommand({removeShard: 'shard_001'})
{
    "msg" : "removeshard completed successfully",
    "state" : "completed",
    "shard" : "shard_001",
    "ok" : 1
}

// config DB에서 확인해보면 shard_001 shard가 사라졌음을 확인할 수 있음
mongos> db.shards.find().pretty()
{
    "_id" : "shard_002",
    "host" : "shard_002/shard-002-primary:27018,shard-002.secondary:27018"
}
{
    "_id" : "shard_003",
    "host" : "shard_003/shard-003-primary:27018,shard-003.secondary:27018"
}
{
    "_id" : "shard_004",
    "host" : "shard_004/shard-004-primary:27018,shard-004.secondary:27018"
}

 

 

 

 

Posted by bloodguy
,