Mongoose 是一个 Node.js 下的 MongoDB 驱动程序,对于开发者来说是非常方便的数据库操作工具。在大规模的系统中,为了处理海量数据,使用 Mongoose 的 Sharding 功能可以帮助我们更轻松地扩展数据库。
什么是 Sharding?
Sharding 是一种横向扩展数据库的解决方案,它将数据分成多个分片(Shard),每个分片都是独立的,存储一部分数据。这样可以扩展数据库的存储能力和读写能力,同时也可以提高数据库的可用性。
Mongoose 中的 Sharding
前面我们说过,Mongoose 是一个 MongoDB 驱动程序,它支持使用 MongoDB 的 Sharding 功能来扩展数据库。在 Mongoose 中启用 Sharding 需要配置 Mongoose 连接的选项。
配置 Sharding
可以通过 Mongoose 的 createConnection 方法来启用 Sharding:
// www.javascriptcn.com code example
const mongoose = require('mongoose');
const uri = 'mongodb://hostname1:port1,hostname2:port2,hostname3:port3/database';
const options = {
useNewUrlParser: true,
useUnifiedTopology: true,
shardStrategy: function (collection) {
return Math.floor(Math.random() * 3);
}
};
mongoose.createConnection(uri, options);以上配置中,shardStrategy 是一个函数,用于根据 Collection 名称决定哪个 Shard 需要存储该 Collection。在此示例中,我们将其设置为随机挑选一个 Shard。
分片键
在使用 Sharding 时,需要指定一个分片键(Shard Key)。分片键是区分数据所属 Shard 的依据,每个文档都会被映射到一个 Shard 上,这里的映射是通过分片键的哈希值来实现的。
下面是示例代码:
// www.javascriptcn.com code example
const schema = new mongoose.Schema({
title: String,
start: Date,
end: Date
});
schema.index({ start: 1 });
const UserModel = mongoose.model('UserModel', schema);
// 切换到测试数据库
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
// 开启 Sharding
UserModel.createCollection(function(err) {
if (err) throw err;
var options = { 'shardKey': { 'start': 1 } };
UserModel.collection.createIndex(options, function () {});
});
// 在其中一条数据
var user = new UserModel({
title: 'test1',
start: new Date(),
end: new Date()
});
user.save();以上示例代码将一个新的 Collection 成为了可分片的集合,MongoDB 内容鉴别器将此作为自动分片的信号。当 Mongoose 把数据插入到 Collection 时,基于确认的分片键(start)哈希值,会把数据插入到特定 Shard。
Sharding 的自动重平衡
实际环境中,如果利用 Sharding 分叉数据库集合,数据数量肯定不会均匀地分布在每个 Shard 上。在某些情况下,这将导致某些 Shard 上负担太重,而其他 Shard 上没有负载。这时就需要自动重平衡。
Mongoose 中支持自动重平衡。默认情况下,它会检测到数据的不平衡,然后把它们移动到一个新的 Shard 上。其内部循环每 5 秒检查一次,是否应该运行自动平衡。
要手动运行自动平衡,可以调用 shardsAutoBalancing,如下所示:
UserModel.shardsAutoBalancing(true, function (err) {
if (err) throw err;
});在上面的代码中,UserModel 是一个使用分片键为 start 的分片集合。
小结
Sharding 是一种用于横向扩展数据库的解决方案。在 Mongoose 中启用 Sharding 需要配置 Mongoose 连接的选项。分片键是区分数据所属 Shard 的依据,每个文档都会被映射到一个 Shard 上。使用 Mongoose 的 Sharding 功能可以帮助我们更轻松地扩展数据库,同时也可以提高数据库的可用性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d64e3aa941bf7134c02d0c