MongoDB 复制是指将 MongoDB 数据库中的数据从一个节点复制到另一个节点的过程。复制有助于在相互独立但彼此具有相同数据的多个副本之间实现数据可靠性、高可用性和扩展性。MongoDB 复制过程中需要指定一个作为主节点、即主服务器(primary)的节点,其他节点则被称为从节点(secondary)。
本文将为您提供一个包含 MongoDB 复制的完整攻略。在此过程中,我们将创建三个 MongoDB 节点,并从主节点复制数据到从节点。
步骤 1:安装 MongoDB
首先需要安装 MongoDB,具体安装方法可参考官方文档。在本例中,我们使用 Ubuntu 系统并使用 apt 安装 MongoDB:
sudo apt-get install mongodb
步骤 2:创建目录
创建三个目录,其中一个目录用于存储主节点数据,另外两个用于存储从节点数据。在本例中,我们创建了以下目录:
mkdir -p /data/db1
mkdir -p /data/db2
mkdir -p /data/db3
步骤 3:启动主节点
启动主节点并指定一个唯一的标识符。在本例中,我们启动了一个名为 myPrimary 的主节点:
mongod --replSet mySet --dbpath /data/db1 --port 27017
如上所示,--replSet
参数用于指定副本集名称,--dbpath
参数用于指定数据存储路径,--port
参数用于指定 MongoDB 监听端口。
步骤 4:连接到主节点
在另一个终端窗口中连接到主节点,如下所示:
mongo --host localhost:27017
步骤 5:初始化副本集
在与主节点建立连接后,在 MongoDB shell 中执行以下命令以初始化副本集:
rs.initiate()
执行该命令后,将出现以下响应:
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "localhost:27017",
"ok" : 1
}
mySet:SECONDARY>
其中,mySet
是我们初始化的副本集名称。
步骤 6:添加从节点
现在,我们将添加两个从节点。打开另外两个终端窗口并在其中分别执行以下命令:
mongod --replSet mySet --dbpath /data/db2 --port 27018
mongod --replSet mySet --dbpath /data/db3 --port 27019
在连接到主节点的窗口中,执行以下命令:
rs.add("localhost:27018")
rs.add("localhost:27019")
以上两个命令分别将从节点 1 和从节点 2 添加到副本集中。
步骤 7:查看副本集状态
执行以下命令来查看副本集状态:
rs.status()
执行该命令后,将出现以下响应:
{
"set" : "mySet",
"date" : ISODate("2021-09-08T08:17:08.388Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"uptime" : 1962,
"optime" : {
"ts" : Timestamp(1631100965, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1631100965, 1),
"t" : NumberLong(1)
},
"ok" : 1,
"operationTime" : Timestamp(1631100965, 1)
}
其中,myState
为 1 表示当前节点为主节点,myState
为 2 则表示当前节点为从节点。optime
表示主节点已提交的最新操作的时间戳。
步骤 8:在主节点插入数据
现在,我们可以在主节点插入数据。在连接到主节点的 shell 中,执行以下命令:
use myDb
db.myCollection.insert({"name": "John"})
步骤 9:查看从节点数据
我们可以通过在从节点 shell 中执行以下命令来查看从节点的数据:
use myDb
db.myCollection.find()
执行该命令后,将看到与主节点插入的数据相同的数据。此时,复制已经开始工作了!
总结
在本文中,我们介绍了 MongoDB 复制的过程,并为您提供了包括代码示例的详细攻略。通过实践,您可以更好地了解 MongoDB 复制的原理和使用方法,并在自己的项目中应用它,从而实现数据可靠性、高可用性和扩展性。