0

在我的 Ubuntu 服务器上,我有一个依赖于 MongoDB 的 Ruby on Rails 应用程序。我经常使用Mongoid将对象注入数据库,但是当注入大量对象时,我编译了大量的哈希并使用 mongo Shell 方法db.collection.insert()注入它:

ObjectName.collection.insert([{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}])

批量插入时间对我来说是一个瓶颈。例如,批量插入 150000 个对象需要 23 秒。是否可以以使批量插入更快的方式分配资源?

4

1 回答 1

0

您可以尝试使用 mongoid gem

batch = [{_id: BSON::ObjectId('5671329e4368725951010000'), name: "foo"}, {_id: BSON::ObjectId('567132c94368725951020000'), name: "bar"}]

Post.collection.insert(batch) #lest Post is the model

或者你可以通过Ruby MongoDb Driver

require 'mongo'
mongo_client = Mongo::MongoClient.new
coll = mongo_client['test_db']['test_collection']
bulk = coll.initialize_ordered_bulk_op
batch.each do |hash|
  bulk.insert(hash)
end
bulk.execute

如果你想通过 mongo 查询以同样的方式。您可以关注批量插入

对于增加数据,您可以使用分片

分片是跨多台机器存储数据记录的过程,是 MongoDB 满足数据增长需求的方法。随着数据大小的增加,单台机器可能不足以存储数据,也无法提供可接受的读写吞吐量。分片解决了水平缩放的问题。通过分片,您可以添加更多机器来支持数据增长和读写操作的需求。

不同的缩放比例

垂直扩展添加更多 CPU 和存储资源以增加容量。通过增加容量进行扩展具有局限性:具有大量 CPU 和大量 RAM 的高性能系统比小型系统更昂贵。此外,基于云的提供商可能只允许用户配置较小的实例。因此,垂直缩放具有实际的最大能力。相比之下,分片或水平扩展将数据集划分并将数据分布在多个服务器或分片上。每个分片都是一个独立的数据库,这些分片共同构成一个逻辑数据库。

于 2015-12-16T10:25:11.550 回答