当我尝试连接到密钥"状态"通过jdbc,并插入文档,它说缺少shardKey
我的所有分片(2个没有,个别副本集的所有部分)和配置服务器(1个,副本集的一部分)已启动并运行,我可以使用mongos终端插入文档,但无法使用Java插入文档驱动程序。 mongodb版本是2.6.5。
package dao;
import util.InstanceFactory;
import com.mongodb.DB;
import com.mongodb.MongoClient;
import org.apache.log4j.Logger;
public class MongoConnector {
private static MongoConnector mongoConnectorInstance;
private DB DbConnection;
public static DB getConnection(String dbName) {
MongoConnector.mongoConnectorInstance = InstanceFactory.instantiateAsSingleton(MongoConnector.class);
if (MongoConnector.mongoConnectorInstance.DbConnection == null) {
synchronized (MongoConnector.mongoConnectorInstance) {
if (MongoConnector.mongoConnectorInstance.DbConnection == null) {
MongoConnector.mongoConnectorInstance.DbConnection = MongoConnector.mongoConnectorInstance
.getDbConnection(dbName);
}
}
}
return MongoConnector.mongoConnectorInstance.DbConnection;
}
private DB getDbConnection(String dbName) {
DB db = null;
try {
MongoClient mongoClient = new MongoClient("some ip address of mongos", 27017);
// Now connect to your databases
db = mongoClient.getDB(dbName);
System.out.println("Connect to database successfully");
} catch (Exception e) {
System.err.println(e.getClass().getName() + ": " + e.getMessage());
}
return db;
}
}
现在,当我尝试使用具有以下功能的其他类插入文档时,我得到shard key not present code 61
public static boolean insert(DBObject object, String table) {
boolean status = false;
if (object != null) {
try {
DB db = MongoConnector.getConnection("somedb");
DBCollection collection = db.getCollection(table);
//System.out.println(collection);
if (collection == null) {
db.createCollection(table, null);
}
collection.insert(object);
status = true;
} catch (Exception e) {
MongoDao.logger.error("Could not insert in database" + e);
}
}
return status;
}
即将插入的对象看起来像
DBobject o=new BasicDBObject("SomeColumn":"somevalue")
.append("shardKey":"UP");
MongoDAO.insert(o,"sometable");
我错过了一些配置连接到我的分片吗?
答案 0 :(得分:1)
如果分片键为state
,则问题在于构建文档:
DBobject o = new BasicDBObject("SomeColumn" : "somevalue")
.append("shardKey" : "UP");
应该看起来像
DBobject o = new BasicDBObject("SomeColumn" : "somevalue")
.append("State" : "UP");
看起来你没有正确设置分片键。
此外,还有一些关于分片设置的其他说明:
你说你有1个配置服务器。使用3.除了根本不关心的小型测试部署之外,不要使用1个配置服务器。使用3个配置服务器。
您说您的分片键有36个可能的值。这可能太少了。使用36个可能的值,您可以在分片之间分配最多36个可能的块。少量潜在的块会使MongoDB很难或不可能平衡分片之间的数据量。您需要重新考虑您的分片键。选择分片键是扩展MongoDB部署的关键部分,做出正确的选择需要大量有关系统用例的知识;您可以从手册中的some advice on choosing shard keys开始。