情况:我正在做决定是否可以使用Mongodb作为我们的存储引擎,并且我被要求分析磁盘存储和带宽使用情况。特别是,我们应该每小时发送1TB的数据,因此如果没有来自客户端的压缩,它实际上是不可行的。可能相关(答案难以满足我的需要):MongoDB + wiredTiger + compression - is compression done on client or server?。
此外,这个问题的灵感来自useCompression
MySQL
自{3.0}版本(可能恐龙还在那时),因此我觉得奇怪的是我找不到类似的MongoDB。
摘要:
WiredTiger
存储引擎,所以我想我只需要为我的收藏设置它。到目前为止我做了什么。我创建了一个json
文件,其中包含我们需要从客户端发送到服务器的数据的实际样本,文件大小约为320K
。然后我使用了这个片段
URI uri = Library.class.getClassLoader().getResource("2437018803.json").toURI();
String search = Files.lines(Paths.get(uri)).collect(Collectors.joining("-"));
Map object = mapper.readValue(search, HashMap.class);
try (MongoClient mongoClient = new MongoClient(new ServerAddress("localhost", 27017));) {
MongoDatabase db = mongoClient.getDatabase("mydb");
System.out.println(mongoClient.getMaxBsonObjectSize());
MongoCollection<Document> collection = db.getCollection("test");
List<Document> documents = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Document doc = new Document();
doc.put("name", "MongoDB");
doc.put("type", "database");
doc.put("count", i);
doc.put("info", object);
documents.add(doc);
}
collection.insertMany(documents);
}
在此代码段运行时,我正在使用iftop
监控我的Mongo服务器,最后我读到了:
TX: cum: 20.2MB peak: 208b
RX: 3.34GB 208b
TOTAL: 3.36GB 416b
根据我的理解,我认为3.36GB的数据是通过网络发送的,这在某种程度上是兼容的(我写的是因为我真的不知道3.36GB如何在磁盘上变成5 - 怎么样?我错过了什么?)在客户端上完成db.test.stats(1024*1024)
以检查磁盘存储信息:
> db.test.stats(1024*1024)
{
"ns" : "mydb.test",
"count" : 7752,
"size" : 3875,
"avgObjSize" : 524272,
"numExtents" : 19,
"storageSize" : 5049,
"lastExtentSize" : 1315.140625,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 1,
"indexDetails" : {
},
"totalIndexSize" : 0,
"indexSizes" : {
"_id_" : 0
},
"ok" : 1
}
所以,从我开始的地方回来:我如何告诉我的客户以压缩方式发送数据,让服务器能够理解请求?有办法吗?如果需要,我不在乎更换司机,如果不符合我的需要,我不必坚持使用官方司机。