复制是跨多个服务器同步数据的过程。复制在不同的数据库服务器上提供数据的多个副本,从而提供冗余并提高数据可用性。复制可防止数据库丢失单个服务器。复制还允许您从硬件故障和服务中断中恢复。通过增加数据拷贝,您可以将其中一个用于灾难恢复、报告或备份。
为什么选择复制?
确保数据安全
高(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()。
共享是跨多台机器存储数据记录的过程,是MongoDB满足数据增长需求的方法。随着数据大小的增加,单个机器可能不足以存储数据,也不能提供可接受的读写吞吐量。切分解决了水平缩放的问题。通过分片,您可以添加更多的机器来支持数据增长以及读写操作的需求。
为什么要分片?
在复制中,所有写操作都将转到主节点
延迟敏感的查询仍将转到主机
单个副本集限制为12个节点
当活动数据集很大时,内存不够大
本地磁盘不够大
垂直缩放太昂贵
MongoDB中的分片
下图显示了MongoDB中使用分片集群的分片。
在下图中,有三个主要部件−
分片——分片用于存储数据。它们提供了高可用性和数据一致性。在生产环境中,每个分片都是一个单独的副本集。
配置服务器—配置服务器存储集群的元数据。该数据包含集群数据集到分片的映射。查询路由器使用此元数据将操作定向到特定分片。在生产环境中,分片集群正好有3个配置服务器。
查询路由器——查询路由器基本上是mongo实例,与客户端应用程序接口,并将操作引导到适当的分片。查询路由器处理操作并将其目标定位到分片,然后将结果返回给客户端。一个分片集群可以包含多个查询路由器来划分客户端请求负载。客户端向一个查询路由器发送请求。通常,分片集群有许多查询路由器。
转储MongoDB数据
要在MongoDB中创建数据库备份,应该使用mongodump命令。此命令将服务器的全部数据转储到转储目录中。有许多选项可用于限制数据量或创建远程服务器的备份。
语法
mongodump命令的基本语法如下−
>mongodump
实例
启动mongod服务器。假设您的mongod服务器运行在本地主机和端口27017上,打开命令提示符并转到mongodb实例的bin目录,然后键入命令mongodump
考虑mycol集合具有以下数据。
>mongodump
该命令将连接到运行在127.0.0.1和端口27017的服务器,并将服务器的所有数据备份到/bin/dump/目录。以下是命令−的输出
以下是可用于mongodump命令的可用选项列表。
语法 | 描述 | 例子 |
---|---|---|
mongodump --host HOST_NAME --port PORT_NUMBER | 此命令将备份指定mongod实例的所有数据库。 | mongodump --host tutorialspoint.com --port 27017 |
mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY | 此命令将仅备份指定路径上的指定数据库。 | mongodump --dbpath /data/db/ --out /data/backup/ |
mongodump --collection COLLECTION --db DB_NAME | 此命令将仅备份指定数据库的指定集合。 | mongodump --collection mycol --db test |
还原数据
为了恢复备份数据,使用MongoDB的mongorestore命令。此命令从备份目录中恢复所有数据。
语法
mongorestore命令的基本语法是−
>mongorestore
以下是命令−的输出
在准备MongoDB部署时,您应该尝试了解应用程序在生产中的表现。开发一种一致的、可重复的方法来管理您的部署环境是一个好主意,这样您就可以在投入生产后将任何意外情况降至最低。
最好的方法包括对设置进行原型设计、进行负载测试、监控关键指标,并使用这些信息来扩展设置。该方法的关键部分是主动监控整个系统—这将帮助您了解生产系统在部署之前的运行状况,并确定需要在哪里增加容量。例如,深入了解内存使用量的潜在峰值可能有助于在写锁起火之前将其扑灭。
为了监控您的部署,MongoDB提供了以下一些命令—
mongostat
该命令检查所有正在运行的mongod实例的状态和数据库操作的返回计数器。这些计数器包括插入、查询、更新、删除和游标。命令还显示您遇到页面错误的时间,并显示锁定百分比。这意味着内存不足、写容量不足或存在一些性能问题。
要运行该命令,请启动mongod实例。在另一个命令提示符中,转到mongodb安装的bin目录并键入mongostat。
D:\set up\mongodb\bin>mongostat
以下是命令−的输出
mongotop
该命令跟踪并报告MongoDB实例在集合基础上的读写活动。默认情况下,mongotop每秒返回信息,您可以相应地更改信息。您应该检查此读写活动是否符合您的应用程序意图,并且一次不会对数据库进行过多的写入,不会频繁地从磁盘读取数据,也不会超过您的工作集大小。
要运行该命令,请启动mongod实例。在另一个命令提示符中,转到mongodb安装的bin目录并键入mongotop。
D:\set up\mongodb\bin>mongotop
若要更改mongotop命令以减少返回信息的频率,请在mongoop命令后指定一个特定的数字。
D:\set up\mongodb\bin>mongotop 30
上面的示例将每30秒返回一次值。
除了MongoDB工具之外,10gen还提供了一个免费的托管监控服务MongoDB管理服务(MMS),该服务提供一个仪表板,并为您提供整个集群的指标视图。