MongoDB 复制
复制是将数据同步到多个服务器的过程。通过多个数据库服务器上的数据副本,复制提供了冗余和增加数据可用性的功能。复制保护数据库免受单个服务器丢失的影响。复制还可以帮助您从硬件故障和服务中断中恢复。通过数据的额外副本,您可以将其中一个用于灾难恢复、报告或备份。
为什么要进行复制
- 保护数据安全
- 数据高可用性(24*7)
- 灾难恢复
- 无维护停机时间(如备份、索引重建、压缩)
- 读扩展(可以从多个副本中读取)
- 副本集对应用程序透明
MongoDB中的复制如何工作
MongoDB通过副本集实现复制。副本集是托管相同数据的一组 mongod 实例。在副本集中,一个节点是主节点,接收所有写操作。其他实例(如次要节点)从主节点应用操作,以便它们具有相同的数据集。副本集只能有一个主节点。
- 副本集是由两个或多个节点组成的组(通常需要至少3个节点)。
-
在副本集中,一个节点是主节点,其余节点是次要节点。
-
所有数据都从主节点复制到次要节点。
-
在自动故障转移或维护时,将选举主节点并选出一个新的主节点。
-
故障节点恢复后,它将再次加入副本集,并作为次要节点工作。
下图是MongoDB复制的典型示意图,其中客户端应用程序始终与主节点交互,然后主节点将数据复制到次要节点。
副本集功能
- 一个由N个节点组成的集群
- 任何一个节点都可以成为主节点
- 所有写操作都发送到主节点
- 自动故障转移
- 自动恢复
- 通过一致性选举选择主节点
设置副本集
在本教程中,我们将把独立的MongoDB实例转换为一个副本集。要转换为副本集,需要按照以下步骤操作:
- 关闭已运行的MongoDB服务器。
-
通过指定–replSet选项启动MongoDB服务器。–replSet的基本语法如下:
mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
示例
mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
-
它将在端口27017上启动一个名为rs0的mongod实例。
-
现在打开命令提示符并连接到这个mongod实例。
-
在Mongo客户端中,发出以下命令 rs.initiate() 来初始化一个新的副本集。
-
要检查副本集配置,发出以下命令 rs.conf() 。要检查副本集的状态,发出以下命令 rs.status() 。
向副本集添加成员
要向副本集添加成员,请在多台机器上启动mongod实例。现在启动一个mongo客户端并发出以下命令 rs.add()。
语法
rs.add() 命令的基本语法如下:
>rs.add(HOST_NAME:PORT)
示例
假设你的mongod实例名称是 mongod1.net 并且它正在运行在端口 27017 。为了将此实例添加到副本集中,请在Mongo客户端中执行以下命令 rs.add() 。
>rs.add("mongod1.net:27017")
>
你只能在连接到主节点时将mongod实例添加到副本集中。要检查是否连接到主节点,可以在mongo客户端中发出以下命令 db.isMaster()