특정 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"
}
'DataBase' 카테고리의 다른 글
[MongoDB] slow query 지속적으로 발생시 (0) | 2022.07.14 |
---|---|
[MongoDB] MongoDB 3.0 shard 제거 취소/중지 (stop removeShard) (0) | 2022.05.12 |
[MongoDB] config servers differ 에러 발생시 (0) | 2020.05.29 |
[MongoDB] Assertion: 10334:BSONObj size XXXXXXXX in invalid 오류 발생시 (0) | 2016.12.26 |
[MongoDB] 초간단 logRotate (0) | 2016.06.01 |