MongoDB 持久化
复制
MongoDB复制是将数据同步在多个服务器的过程。
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。
-
保障数据的安全性
-
数据高可用性 (24*7)
-
灾难恢复
-
无需停机维护(如备份,重建索引,压缩)
-
分布式读取数据
MongoDB复制是主从结构:一主一从或一主多从
主从节点设置
-
启动一个MongoDB服务,连接后使用命令rs.initiate()来启动一个新的副本集
-
使用rs.conf()来查看副本集的配置,使用rs.status()命令查看副本集状态
-
-
添加从节点:使用rs.add(HOST_NAME:PORT)方法来添加副本集的成员
-
使用命令db.isMaster()判断当前运行的Mongo服务是否为主节点
-
MongoDB中只能通过主节点将Mongo服务添加到副本集中,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。
分片
分片:是另一种集群,当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
-
复制所有的写入操作到主节点
-
延迟的敏感数据会在主节点查询
-
单个副本集限制在12个节点
-
当请求量巨大时会出现内存不足。
-
本地磁盘不足
-
垂直扩展价格昂贵
下图展示了在MongoDB中使用分片集群结构分布:
上图中主要有如下所述三个主要组件:
-
Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障
-
Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
-
Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。
备份和恢复
备份
mongodump命令可以导出所有数据到指定目录中
mongodump -h dbhost -d dbname -o dbdirectory
-
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-
-d:需要备份的数据库实例,例如:test
-
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。
恢复
mongorestore 命令恢复备份的数据
mongorestore -h <hostname><:port> -d dbname <path>
-
--host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017
-
--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
-
--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
-
<path>:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
你不能同时指定 <path> 和 --dir 选项,--dir也可以设置备份目录。
-
--dir:
指定备份的目录
你不能同时指定 <path> 和 --dir 选项。
监控
MongoDB中提供了mongostat 和 mongotop 两个命令来监控MongoDB的运行情况
mongostat
mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出;进入mongodb\bin执行mongostat命令
mongotop
mongotop也是mongodb下的一个内置工具,跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的间隔为一秒
进入mongodb\bin执行mongotop命令,可以在后面指定间隔时间