MongoDB备份、索引、复制

心不动则不痛 提交于 2020-02-01 20:14:11

1. 数据备份与恢复

数据备份:mongodump命令来备份MongoDB数据,可以导出所有数据到指定目录中
    mongodump -h dbhost -d dbname -o dbdirectory
        -h: 服务器地址,也可以指定端⼝号
        -d: 需要备份的数据库名称
        -o: 备份的数据存放位置
        
数据恢复:mongorerstore命令来恢复备份的数据
    mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
        -h:MongoDB所在服务器地址
        -d:需要恢复的数据库实例
        --directoryperdb:备份数据所在位置
        --drop:恢复时先删除当前数据,然后恢复备份数据(恢复后备份后添加修改的数据都会被删除,慎用)

2. 索引

索引通常能够极大的提高查询的效率,如果没有索引MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录

这种扫描全集合的查询效率是非常的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的

索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构

创建索引:db.col.ensureIndex({KEY:1}) 
    - Key值为你要创建的索引字段,1为指定按升序创建索引,-1为降序
    
    - 在默认情况下创建的索引均不是唯一索引,创建唯一索引:设置unique参数为true
查看集合索引:db.col.getIndexes()
删除集合索引:db.col.dropIndex('索引名字')

db.t1.find({name:'test10000'}).explain('executionStats'):查看查询时间

联合索引:使用某个字段不能区分一个文档(多个字段)
    db.col.ensureIndex({KEY:1, kEY2:1}) 

ensureIndex() 接收可选参数,可选参数列表如下:

3. MongoDB复制

在MongoDB中,有两种复制模式:
    - Master-Slave 模式:主从复制
    - Replica Sets 模式:副本集
    
所谓复制,就是在多个服务器上存储数据副本,提高数据的可用性
复制的特点:
    - 保障数据的安全性
    - 数据高可用性 (24*7)
    - 灾难恢复
    - 无需停机维护(如备份,重建索引,压缩)
    - 分布式读取数据
    
复制的原理:
    - mongodb的复制至少需要两个节点,其中一个是主节点负责处理客户端请求,其余的都是从节点负责复制主节点上的数据
    - 主节点记录所有操作到oplog文件,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

3.1 主从复制

主从复制是MongoDB最常用的复制模式,用来进行数据库同步备份,实现数据的读写分离
缺点:主从复制只有一个主节点,当主节点故障时,不能自动故障转移即自动切换到从节点上继续工作

主从配置常用模式:一主一从、一主多从

主从配置:
    - 创建cluster目录,在该目录创建master和slave目录分别存放主从节点数据文件
    - 主节点:mongod --dbpath xxxx\cluster\master --port 10000 --master
    - 从节点:mongod --dbpath xxxx\cluster\slave --port 10001 --slave --source localhost:10000  (指定跟随的主节点)

3.2 副本集

官方推荐使用副本集,副本集不仅可以实现数据冗余备份、读写分离,还可以进行自动故障转移
副本集使用选举机制(算法),选举出当前最优节点作为活跃节点,当活跃节点挂掉,选举机制会选举出新的节点作为活跃节点对外提供服务,其他节点继续作为复制节点;当之前活跃节点恢复,会自动作为非活跃节点(备份节点)存在
    
副本集配置:
    - 创建node1、node2、node3三个目录作为三个节点的数据存放目录
    - 启动三个节点:每个节点都是一个mongodb示例(名字相同,表示三个示例属于一个副本集)
        mongod --dbpath xxx\node1 --port 10001 --replSet 副本集名
        mongod --dbpath xxx\node2 --port 10002 --replSet 副本集名
        mongod --dbpath xxx\node3 --port 10003 --replSet 副本集名
    - 登录到任意一个节点进行副本集初始化工作:rs.initiate()
    - 副本集添加成员:只能通过主节点将Mongo服务实例添加到副本集中
        - 判断Mongo服务是否为主节点:db.isMaster() 
        - 添加成员:rs.add("host:port")
        rs.initiate({"_id":"副本集名","members":[ {"_id":1,"host":"localhost:10001"}, {"_id":2,"host":"localhost:10002"}, {"_id":3,"host":"localhost:10003"} ]})

查看副本集信息:
    - 查看配置:rs.conf()
    - 查看副本集状态:rs.status()

参考文章:

  1. https://blog.csdn.net/wp94302948/article/details/79603443
  2. https://blog.csdn.net/qq_37142346/article/details/82824132
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!