什么是 MongoDB 副本集
MongoDB 副本集是 MongoDB 中高可用性(high availability, HA)的解决方案之一。副本集可以容忍单个节点的故障,即使一个主节点(primary)失效,系统也可以自动地在副本节点(secondary)中选举出一个新的主节点。副本集还可以提高系统的读取性能,因为每个节点都可以提供服务的能力。副本集中一般包含一个主节点(primary)和多个副本节点(secondary),我们可以根据实际需求决定副本集中的节点数和复制策略。
MongoDB 副本集工作原理
MongoDB 副本集中的节点共有两种状态,一种是可用状态,包括主节点和副本节点,可以提供服务;另一种是已故障状态,例如网络故障、节点宕机等,无法提供服务。副本集中有且仅有一个主节点,它负责处理所有的写操作,并将写操作的结果异步地复制到副本节点上。当主节点失效时,副本集会选择一个副本节点作为新的主节点,成为唯一的可写节点。副本集还会自动地监控各个节点的状态,如果发现某个节点失效,则进行选举产生新的主节点。
如何搭建 MongoDB 副本集
步骤一:准备工作
在开始之前,您需要先安装 MongoDB。如果您还没有安装 MongoDB,请参考 MongoDB 的官方文档进行安装。
步骤二:启动 MongoDB 服务器
在启动 MongoDB 服务器时,我们需要指定一个端口和数据目录。例如,下面的命令将启动一个端口为 27017 的 MongoDB 服务器,并将数据目录指定为 /data/db。
$ mongod --port 27017 --dbpath /data/db
步骤三:初始化副本集
在初始化副本集之前,我们需要在 MongoDB 服务器上创建一个用户,以便副本集节点之间进行身份验证。例如,下面的命令创建了一个名为 admin 的管理员用户。
$ mongo
> use admin
> db.createUser({ user: "admin", pwd: "PASSWORD", roles: ["root"] })接着,我们可以通过以下命令来初始化一个名为 rs0 的副本集,其中包括了三个节点:
// www.javascriptcn.com code example
$ mongo --port 27017
> rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" },
{ _id: 1, host: "localhost:27018" },
{ _id: 2, host: "localhost:27019" }
]
})步骤四:添加副本节点
在副本集初始化后,我们可以根据实际需求添加或删除副本节点。例如,以下命令将向 rs0 副本集中添加一个名为 node4 的副本节点:
$ mongo --port 27017
> rs.add("node4:27017")步骤五:查看副本集状态
在完成副本集初始化和节点添加后,我们可以通过以下命令查看副本集状态:
$ mongo --port 27017 > rs.status()
以上命令将输出副本集状态的详细信息,包括各个节点的状态、主节点信息等。
示例代码
在 Node.js 应用程序中连接 MongoDB 副本集,可以使用 mongoose 库。下面是一个简单的示例代码:
// www.javascriptcn.com code example
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017,localhost:27018,localhost:27019/myapp?replicaSet=rs0', { useNewUrlParser: true });
const UserSchema = new mongoose.Schema({
name: String
});
const UserModel = mongoose.model('User', UserSchema);
const user = new UserModel({ name: 'Alice' });
user.save((err) => {
if (err) {
console.error(err);
} else {
console.log('saved to database');
}
});在上面的示例代码中,我们使用了 mongodb://localhost:27017,localhost:27018,localhost:27019/myapp?replicaSet=rs0 连接字符串来连接副本集。其中,27017、27018、27019 分别是副本集中三个节点的端口号;myapp 是数据库名;replicaSet=rs0 指定了使用名为 rs0 的副本集。在副本集中写入数据时,mongoose 库会自动将写操作发送到主节点,并等待其被复制到副本节点。读取数据时,mongoose 库会自动选择可用的节点进行查询。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d011e2e46428fe9ec9da64