MongoDB에서 DB를 생성하고 컬렉션을 막 샤딩을 했다가 지우고 이것저것 하다가,

실제로 클라이언트 프로그램에서 insert 등을 수행할 때 다음과 같은 에러를 만날 수 있다.

 

setShardVersion failed host: HOSTNAME:PORT { oldVersion: Timestamp 0|p, ns: "DBNAME.COLLECTION", version: Timestamp 2000|3, globalVersion: Timestamp 1000|4, errmsg: client version differs from config's for collection 'DBNAME.COLLECTION'", ok: 0.0 }

 

 

좀 뒤적거려보니 원인은 각 mongos 프로세스가 캐시하고 있는 데이터와 실제 config 서버의 데이터 사이에 sync가 맞지 않아서 일어나는 에러이다.

 

해결책은 각 mongos 프로세스의 캐시를 강제로 flush 하는 것이다.

 

모든 mongos 서버에 접속해서 아래의 명령어를 수행해주면 된다.

 

db.adminCommand("flushRouterConfig")

 


서버 하나에 접속해서 하는 방법


mongos> use config

switched to db config

mongos> var mongoses = db.mongos.find()

mongos> while (mongoses.hasNext()) { new Mongo(mongoses.next()._id).getDB("admin").runCommand({flushRouterConfig: 1}) }

{ "flushed" : true, "ok" : 1 }


 

 

참고: http://docs.mongodb.org/manual/reference/commands/#flushRouterConfig

 

Posted by bloodguy
,