文档章节

MongoDB 3.4 副本集 搭建 + 备份恢复(超详细)

FenG_Vnc
 FenG_Vnc
发布于 2017/05/19 15:36
字数 1545
阅读 1.6K
收藏 99

MongoDB 3.4 副本集 搭建 + 备份恢复

mongodb 3.4 数据下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-amazon-3.4.4.tgz

安装准备 (三台机器)

192.168.0.188:27017(primary)   主节点
port=27017 #端口
dbpath= /usr/src/node1/data#数据文件存放目录
logpath= /usr/src/node1/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
fork=true #以守护程序的方式启用,即在后台运行
maxConns=500 #最大同时连接数
bind_ip=0.0.0.0 #只允许通过本机访问
noauth=true #不启用验证
#auth=true #启用验证
replSet=test       # 副本集名称
oplogSize=200   # 200M
keyFile = /usr/src/mongodb.key

192.168.0.188:27018(secondary)    从节点
port=27018 #端口
dbpath= /usr/src/node2/data#数据文件存放目录
logpath= /usr/src/node2/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
fork=true #以守护程序的方式启用,即在后台运行
maxConns=500 #最大同时连接数
bind_ip=0.0.0.0 #只允许通过本机访问
#noauth=true #不启用验证
#auth=true #启用验证
replSet=test       # 副本集名称
oplogSize=200   # 200M
keyFile = /usr/src/mongodb.key

192.168.0.188:27019(secondary)
port=27019 #端口
dbpath= /usr/src/node3/data#数据文件存放目录
logpath= /usr/src/node3/mongodb.log #日志文件存放目录
logappend=true #使用追加的方式写日志
fork=true #以守护程序的方式启用,即在后台运行
maxConns=500 #最大同时连接数
bind_ip=0.0.0.0 #只允许通过本机访问
#noauth=true #不启用验证
#auth=true #启用验证
replSet=test       # 副本集名称
oplogSize=200   # 200M
keyFile = /usr/src/mongodb.key

进入mongodb配置副本集

mongod --config /usr/src/node1/mongodb.conf   #启动主节点
连接主,在主上运行命令mongo

#创建认证的用户名admin跟密码123456
# db.createUser({user:"admin",pwd:"123456",  roles:[{role:"root",db:"admin"}]}); 
>use admin
>db.createUser(  
... {  
...     user:"admin",   
...     pwd:"123456",  
...     roles:[{role:"root",db:"admin"}]  
... }  
... );  
#配置认证以后需要打开主节点的配置文件选择启动验证

#然后配置一个密钥
root@ubuntu:openssl rand -base64 1024 /usr/src/mongodb.key
root@ubuntu:chmod 600 /usr/src/mongodb.key

#然后开启全部节点
mongodb --config /usr/src/node1/mongodb.conf
mongodb --config /usr/src/node2/mongodb.conf
mongodb --config /usr/src/node3/mongodb.conf

#进入主节点,验证密码
>use admin
>db.auth('admin','123456')
1


#然后配置副本集 priority 越大 成为 主的权重越大
> config={_id:"test",members:[{_id:0,host:"192.168.0.188:27017,priority:10"},{_id:1,host:"192.168.0.188:27018,priority:11"},{_id:2,host:"192.168.0.188:27019,priority:12"}]}
>rs.initiate(config)  #初始化配置
rs.status() //查看状态
{
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.0.188:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 9807,
		},
		{
			"_id" : 1,
			"name" : "192.168.0.188:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 9715,
		},
		{
			"_id" : 2,
			"name" : "192.168.0.188:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 9711,
		}
	],
	"ok" : 1
}
cfg = rs.conf()
# 配置延迟备份节点
cfg.members[2].priority = 0 
cfg.members[2].hidden = true  
cfg.members[2].slaveDelay = 3600 #延迟多少秒 
#重新配置使生效
rs.reconfig(cfg)

这样一来 副本集就搭建好了 然后做一下测试 (主备自动切换)

#首先我们停掉主节点
root     10049  0.6  0.5 739284 93844 ?        Sl   12:10   1:13 mongod --config /usr/src/node1/mongodb.conf
root     10137  0.6  0.6 743792 100336 ?       Sl   12:10   1:12 mongod --config /usr/src/node2/mongodb.conf
root     10221  0.5  0.3 545516 61560 ?        Sl   12:10   1:03 mongod --config /usr/src/node3/mongodb.conf

kill -9 10049

#停掉主节点,然后启动从节点
mongo 192.168.0.188:27018

	{
			"_id" : 0,
			"name" : "192.168.0.188:27017",
			"health" : 0,
			"state" : 8,
			"stateStr" : "(not reachable/healthy)",
			"uptime" : 0,
		},
		{
			"_id" : 1,
			"name" : "192.168.0.188:27018",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",  # 从节点已经代替主节点
			"uptime" : 11151,
		},
		{
			"_id" : 2,
			"name" : "192.168.0.188:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 11140,
		}

# 从节点已经代替主节点,那在启动主节点看看有没有自动切换
rs.status()
{
			"_id" : 0,
			"name" : "192.168.0.188:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",   #已经切换主节点
			"uptime" : 105,
		},
		{
			"_id" : 1,
			"name" : "192.168.0.188:27018",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 104,
		},
		{
			"_id" : 2,
			"name" : "192.168.0.188:27019",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
                }

可以看到 已经切换到主节点了

然后我们做一次备份还原数据的测试

创建两个测试表,一个test,一个tb1:
db.test.save({name:"apple"});
for(var i = 1; i <=100; i++) {db.tb1.insert({name:"hank"+i});}
再备份一次数据库
mongodump -h 192.168.0.188 -o /root/backcup/
进入数据库做一些操作

db.test.drop();
db.tb1.remove({});
db.tb1.insert({name:"xxxxxxxxxxxxxxxxxxxx"});
现在,我们要恢复到操作之前,怎么做呢,第一个就是用我们刚才全备直接restore回去,另外如果想恢复到任何一个点的话,那么就需要oplog

导出oplog
mongodump -h 192.168.0.188 -d local -c oplog.rs -o root/backup/
2017-05-19T15:26:15.686+0800	writing local.oplog.rs to 
2017-05-19T15:26:15.748+0800	done dumping local.oplog.rs (10458 documents)

使用bsondump 查看oplog日志 
root@ubuntu:~/backup/local# bsondump oplog.rs.bson |grep drop 对drop来进行过滤
{"ts":{"$timestamp":{"t":1495179002,"i":1}},"t":{"$numberLong":"15"},"h":{"$numberLong":"2437177398902103200"},"v":2,"op":"c","ns":"test.$cmd","o":{"drop":"test"}}

2017-05-19T15:27:36.202+0800	10458 objects found

找到这条记录以后 我们记住这个时间戳:{"t":1495179002,"i":1}}  然后我们使用mongorestore 
mongorestore -h 192.168.0.188 --oplogReplay --oplogLimit "1495179002:1" /root/backup/
2017-05-19T15:32:30.821+0800	no indexes to restore
2017-05-19T15:32:30.821+0800	finished restoring b_tuxi_logs.users (14 documents)
2017-05-19T15:32:30.863+0800	error: E11000 duplicate key error collection: tuxi2.pending index: _id_ dup key: { : ObjectId('591e540da26f3b893f77bac6') }
2017-05-19T15:32:30.863+0800	no indexes to restore
2017-05-19T15:32:30.863+0800	finished restoring tuxi2.pending (1 document)
2017-05-19T15:32:30.863+0800	no indexes to restore
2017-05-19T15:32:30.863+0800	finished restoring test.test (1 document)
2017-05-19T15:32:30.863+0800	no indexes to restore
2017-05-19T15:32:30.863+0800	finished restoring a.b (1 document)
2017-05-19T15:32:30.863+0800	restoring users from /root/backup/admin/system.users.bson
2017-05-19T15:32:31.458+0800	replaying oplog
2017-05-19T15:32:32.684+0800	oplog  577KB
2017-05-19T15:32:34.263+0800	oplog  2.03MB
2017-05-19T15:32:34.263+0800	done

a:PRIMARY> db.tb1.find()
{ "_id" : ObjectId("591e9f03c7fc4390ee9a9fa8"), "name" : "xxxxxxxxxxxxxxxxxxxx" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b3"), "name" : "hank1" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b4"), "name" : "hank2" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b5"), "name" : "hank3" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b6"), "name" : "hank4" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b7"), "name" : "hank5" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b8"), "name" : "hank6" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403b9"), "name" : "hank7" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403ba"), "name" : "hank8" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403bb"), "name" : "hank9" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403bc"), "name" : "hank10" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403bd"), "name" : "hank11" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403be"), "name" : "hank12" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403bf"), "name" : "hank13" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c0"), "name" : "hank14" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c1"), "name" : "hank15" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c2"), "name" : "hank16" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c3"), "name" : "hank17" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c4"), "name" : "hank18" }
{ "_id" : ObjectId("591e9da0f7a418c28d9403c5"), "name" : "hank19" }
Type "it" for more

可以看到 数据都已经恢复完全

结尾

mongodb的备份恢复 只要有oplog日志,并且根据日志的时间戳就可以恢复到任意一节点。并且因为oplog是一个增长的过程。所以需要根据业务情况来合理的设置oplog的日志大小。

© 著作权归作者所有

FenG_Vnc
粉丝 11
博文 24
码字总数 11100
作品 0
深圳
其他
私信 提问
加载中

评论(1)

各种打杂
各种打杂
get! 辛苦楼主
mongodb安装、连接,mongodb用户管理、创建集合、数据管理、备份恢复,副本集介绍、搭建、测试,分片介绍、搭建、测试,php的mongodb扩展、mongo扩展

21.26 mongodb介绍 21.27 mongodb安装 21.28 连接mongodb 21.29 mongodb用户管理 21.30 mongodb创建集合、数据管理 21.31 php的mongodb扩展 21.32 php的mongo扩展 21.33 mongodb副本集介绍 ...

tobej
2019/07/16
115
0
【0716】NoSQL——mogodb

21.26 mongodb介绍 介绍: 官网www.mongodb.com, 当前最新版3.4 C++ 编写,基于分布式的,属于 NoSQL 的一种 在 NoSQL 中是最像关系型数据库的 MongoDB 将数据存储为一个文档,数据结构由键...

alexis7gunner
2019/07/21
0
0
MongoDB学习:备份恢复(一)

本文主要介绍MongoDB副本集备份恢复的方法、常用命令,以及一些具体的操作过程,最后介绍一种备份方案。 一、备份方法 0、oplog 0.1 oplog是什么 oplog是一个 capped collection(有上限的集...

hs2021
2019/07/22
0
0
84.mongodb分片介绍 搭建 测试 及mongodb备份与恢复

21.36 mongodb分片介绍 21.37/21.38/21.39 mongodb分片搭建 21.40 mongodb分片测试 21.41 mongodb备份恢复 21.36 mongodb分片介绍 分片是由一个一个的副本集组成的 1.分片就是将数据库进行拆...

axin-linux
2019/04/01
21
0
MongoDB Upgrade a Replica Set to 3.4

MongoDB 副本集升级 前言 Part1:写在最前 本文讲解MongoDB副本集的升级方法,以及注意事项。本文的环境为MongoDB3.2升级MongoDB3.4,低版本升级3.4的话需要优先升级到3.2版本才可以。如果发现...

dbapower
2018/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android MVP 快速开发框架ZBLibrary

MVP 架构,提供一套开发标准(View,Data,Event)以及模板和工具类并规范代码。封装层级少,简单高效兼容性好。 OKHttp、UIL图片加载、ZXing二维码、沉浸状态栏、下载安装、自动缓存以及各种B...

boonya
24分钟前
33
0
printf的格式很长的论点是什么?

printf函数采用参数类型,例如%d或%i用于signed int 。 但是,我没有看到任何long价值的东西。 #1楼 如果您打算像我一样打印unsigned long long ,请使用: unsigned long long n;printf("...

技术盛宴
30分钟前
46
0
为BlueLake主题增加图片放大效果

fancyBox 是一个流行的媒体展示增强组件,可以方便为网站添加图片放大、相册浏览、视频弹出层播放等效果。优点有使用简单,支持高度自定义,兼顾触屏、响应式移动端特性,总之使用体验相当好...

CREATE_17
31分钟前
23
0
如何将现有的Git存储库导入另一个?

我在名为XXX的文件夹中有一个Git存储库,还有第二个名为YYY的 Git存储库。 我想将XXX存储库作为名为ZZZ的子目录导入YYY存储库,并将所有XXX的更改历史记录添加到YYY 。 之前的文件夹结构: ...

javail
45分钟前
22
0
JSP-Servlet入门2之JSP运行原理(一)

JSP全名为Java Server Pages,中文名叫java服务器页面,是一种动态页面技术 。实际上JSP是指在HTML中嵌入java脚本语言, 一、 JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局...

橘子_
今天
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部