栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MongoDB(二)备份恢复、导入导出、主从复制、副本集集群

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MongoDB(二)备份恢复、导入导出、主从复制、副本集集群

一、备份和恢复

MongoDB提供了备份和恢复的功能,分别是mongodump和mongorestore,可以使用如下命令:

1、备份:mongodump
// 语法
mongodump -h host -d dbname -o directory -u username -p pwd
// 示例,将本地test1数据库的数据备份到D:Javamongo_dump文件夹下面
mongodump -h 127.0.0.1 -d test1 -o D:Javamongo_dump -u testAdmin -p 123456
  • 新建如下目录:D:Javamongo_dump
  • 新打开一个cmd命令行窗口执行:mongodump -h 127.0.0.1 -d test1 -o D:Javamongo_dump -u testAdmin -p 123456
    注:因为启动mongodb的时候添加了–auth,所以这里需要用户名和密码,如果启动的时候没有添加–auth,这里就不需要-u和-p了,mongodump -h 127.0.0.1 -d test1 -o D:Javamongo_dump 就可以了

    在查看刚刚新建的mongo_dump文件夹里面已经有备份的数据了
命令选项释义
-h-h后面的值是MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d-d的后面的值是需要备份的数据库实例名称,例如:test1
-c指定数据库里面的集合
-o-o后面的值是备份的数据存放的位置,例如:D:Javamongo_dump,该目录需要提前建立,在备份完成后,系统自动在mongo_dump目录下建立一个test1目录,这个目录里面存放该数据库实例的备份数据
-u-u的后面的值是登陆账号
-p-u的后面的值是登陆账号的密码
–authenticationDatabase指定认证的数据库
–authenticationMechanism指定认证的算法 ,默认值 SCRAM-SHA-1
2、恢复:mongorestore
// 语法
mongorestore -h dbhost -d dbname dbdirectory
// 示例,将D:Javamongo_dumptest1文件夹下备份的数据恢复到本地的test1数据库
mongorestore -h 127.0.0.1 -d test1 D:Javamongo_dumptest1  -u testAdmin -p 123456 --authenticationDatabase test1

注:test1是要恢复的数据库名称,D:Javamongo_dumptest1是前面备份的test1的数据文件路径。

二、导出和导入 1、导出:mongoexport
// 语法
mongoexport -h dbhost -d dbname -c collectionname -o dir -u username -p pwd
// 示例,将本地test1数据库中的user集合的数据导出到D:Javamongo_dump123.json
mongoexport -h 127.0.0.1 -d test1 -c user -o D:Javamongo_dump123.json -u testAdmin -p 123456


导出后可以在文件夹下面看到导出的数据

2、导入:mongoimport
// 语法
mongoimport -h dbhost -d dbname -c collectionname -o dir -u username -p pwd
// 示例,将D:Javamongo_dump123.json中备份的数据恢复到本地test1数据库中的user集合
mongoimport -h 127.0.0.1 -d test1 -c user D:Javamongo_dump123.json -u testAdmin -p 123456
二、主从复制

MongoDB提供的主从复制的功能,基本的方式就是设置一个主节点,一个或多个从节点,每个从节点配置主节点的ip端口即可。
接下来启动一个主节点和一个从节点,(之前的cmd窗口全部关掉):

1、启动主节点
  • 新建如下目录文件夹:D:Javamongo_master

  • 新打开一个cmd,使用命令启动主节点:mongod --dbpath D:Javamongo_master --port 27000 --master
    (注:–port指定端口号,–master表示自己是主节点)

  • 新打开一个cmd,连接上主节点:mongo 127.0.0.1:27000

2、启动从节点
  • 新建如下目录文件夹:D:Javamongo_slave
  • 新打开一个cmd,使用命令启动主节点:mongod --dbpath D:Javamongo_slave --port 27001 --slave --source 127.0.0.1:27000
    (注:–port指定端口号,–slave表示自己是从节点,–source指定主节点的ip和端口)
  • 新打开一个cmd,连接上从节点:mongo 127.0.0.1:27001
3、测试主从复制数据
  • 1、连接上主节点后新建一个test2数据库,然后创建一个user集合,向user集合中插入一条数据
  • 2、连接上从节点后查看test2数据库的user集合中是否有数据,执行show dbs查询数据库,这个时候会报错。这是正常的,因为从库默认是不允许读写的,可以通过rs.secondaryOk();来解决。


    可以看到主库的数据全部同步到了从库里面
三、副本集集群

MongoDB除了提供主从复制,还提供副本集,可以搭建高可用集群。MongoDB不推荐主从复制,推荐建立副本集(Replica Set)来保证主节点服务挂了,可以有其他服务顶上,程序正常运行,多个服务节点的数据都是一样的,后台自动同步。副本集比传统的Master-Slave主从复制有改进的地方就是它可以进行故障的自动转移,如果我们停掉主节点,那么剩余成员会再自动选举一个节点作为节点,副本集总有一个活跃点(primary)和一个或多个备份节点(secondary)。

1、创建如下三个路径文件夹,分别对应三个节点
  • D:Javamongo_node1
  • D:Javamongo_node2
  • D:Javamongo_node3
2、分别启动三个节点
  • 启动节点1:
    mongod --dbpath D:Javamongo_node1 --logpath D:Javamongo_node1logs.txt --logappend --port 10001 --replSet test

  • 启动节点2:
    mongod --dbpath D:Javamongo_node2 --logpath D:Javamongo_node2logs.txt --logappend --port 10002 --replSet test

  • 启动节点3:
    mongod --dbpath D:Javamongo_node3 --logpath D:Javamongo_node3logs.txt --logappend --port 10003 --replSet test
    (注: --logpath指定日志路径,–port 指定端口号,–replSet 指定副本集名称)

3、初始化节点

初始化节点(只能初始化一次):随便登录一个节点,我登陆10001为例,
新开一个cmd窗口,执行如下命令:

// 连接上端口为10001的mongodb
mongo 127.0.0.1:10001
// 定义一个config配置节点
config={_id:"test",members:[{_id:1,host:"127.0.0.1:10001","priority":3},
{_id:2,host:"127.0.0.1:10002","priority":2},{_id:3,host:"127.0.0.1:10003","priority":1}]}
// 初始化配置
rs.initiate(config)

(注: test就是上面启动三个节点–replSet 后面的test名称,members:就是节点配置, host:节点的ip和端口,priority:权重,范围从1~1000,越大的数字,权重比越大,越容易成为主库)

查询当前10001节点的状态: rs.status()

test:OTHER> rs.status()
{
        "set" : "test",// 集群名称
        "date" : ISODate("2021-11-06T08:52:32.565Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1636188751, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1636188751, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1636188751, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1636188751, 1),
                        "t" : NumberLong(1)
                }
        },
        "members" : [
                {
                        "_id" : 1,
                        "name" : "127.0.0.1:10001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",// 主节点
                        "uptime" : 259,
                        "optime" : {
                                "ts" : Timestamp(1636188751, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2021-11-06T08:52:31Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1636188748, 1),
                        "electionDate" : ISODate("2021-11-06T08:52:28Z"),
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                },
                {
                        "_id" : 2,
                        "name" : "127.0.0.1:10002",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",// 从节点
                        "uptime" : 14,
                        "optime" : {
                                "ts" : Timestamp(1636188737, 1),
                                "t" : NumberLong(-1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1636188737, 1),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("2021-11-06T08:52:17Z"),
                        "optimeDurableDate" : ISODate("2021-11-06T08:52:17Z"),
                        "lastHeartbeat" : ISODate("2021-11-06T08:52:30.697Z"),
                        "lastHeartbeatRecv" : ISODate("2021-11-06T08:52:32.190Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "127.0.0.1:10001",
                        "syncSourceHost" : "127.0.0.1:10001",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 1
                },
                {
                        "_id" : 3,
                        "name" : "127.0.0.1:10003",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",// 从节点
                        "uptime" : 14,
                        "optime" : {
                                "ts" : Timestamp(1636188737, 1),
                                "t" : NumberLong(-1)
                        },
                        "optimeDurable" : {
                                "ts" : Timestamp(1636188737, 1),
                                "t" : NumberLong(-1)
                        },
                        "optimeDate" : ISODate("2021-11-06T08:52:17Z"),
                        "optimeDurableDate" : ISODate("2021-11-06T08:52:17Z"),
                        "lastHeartbeat" : ISODate("2021-11-06T08:52:30.700Z"),
                        "lastHeartbeatRecv" : ISODate("2021-11-06T08:52:32.160Z"),
                        "pingMs" : NumberLong(0),
                        "lastHeartbeatMessage" : "",
                        "syncingTo" : "127.0.0.1:10001",
                        "syncSourceHost" : "127.0.0.1:10001",
                        "syncSourceId" : 1,
                        "infoMessage" : "",
                        "configVersion" : 1
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1636188751, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1636188751, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}
4、测试集群数据
  • 在主库中新建test3数据,创建一个user集合,并向里面插入一条数据
  • 连接上从库10002,mongo 127.0.0.1:10002,查看所有数据库show dbs,这个时候也会报错,和主从复制一样,从库默认不能读写,使用rs.secondaryOk()解决。然后查看主库保存的数据,可以看到主库保存的数据
  • 测试主库挂掉,看看会不会重新选出主节点,直接把启动主节点10001端口的cmd窗口关掉

    然后在从节点10002执行 rs.status()看看现在主节点是谁,可以看到10002已经成为了主节点

    如果刚刚挂掉的10001节点又重新启动上线了,mongodb会自动加入到这个集群里面
5、集群添加节点和删除节点
  • 1、添加节点
    集群创建好之后我们也可以手动添加新的节点进去,创建一mongo_node4文件夹:D:Javamongo_node4

启动节点4:
mongod --dbpath D:Javamongo_node4 --logpath D:Javamongo_node4logs.txt --logappend --port 10004 --replSet test
在主节点执行命令:rs.add(“127.0.0.1:10004”),格式rs.add(“ip:端口”)

在查看是否已经将10004加入到集群

  • 2、删除节点
    在主节点执行rs.remove(“127.0.0.1:10004”)即可删除对应节点
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/434267.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号