当前位置: 首页 > news >正文

【Mongodb】Master-Slave 复制

mongodb的主从复制是最常见的复制模式,这种模式是非常灵活的并且可以用来做备份,failover 故障切换, 拓展读等等,最常见的方式是 一主一备或者一主多备,每个slave 都知道主库的地址 即主库的ip地址和端口号。
如下图:
22664653_201110301852211.jpg
                                                一主一备模式
22664653_201110301852311.jpg
                                                   一主多备 模式
mongodb 启动master 的方式是 
./mongod --master 
启动slave 模式执行
./mongod --slave --source master_address (主库的ip地址和端口)
例如 例子是在同一个主机:
主库:./mongod --master --dbpath=/opt/monogdata/data --port=60000
从库:./mongod --slave --dbpath=/opt/monogdata/slavedata/ --port=60010 --source=127.0.0.1:60000
异机的例子:
主库:./mongod --master --dbpath=/opt/monogdata/data --port=60000
从库:./mongod --slave --dbpath=/opt/monogdata/slavedata/ --port=60010 --source=10.250.7.220:60000
所有的slave库必须从一个主库进行复制,到目前为止,现在的版本还不支持从备库进行复制即级联形式的复制,因为slaves 并不保持他们自己的oplog。对于一对多形式的主从复制对于从库并没有数量的限制,但是设置从库时必须考虑主库 IO方面的压力。
下面介绍一些比较重要的且常见的选项
--slavedelay 
  延迟应用主库的oplog,和oracle 的dataguard 中的 delay 关键字的作用一直,单位为秒。如果在主库进行误操作,设置延迟应用,这样可以一个维护窗口进行恢复数据。
--fastsync 
 Start a slave from a snapshot of the master node. This option allows a slave to bootstrap much faster than doing a full sync, 
 if its data directory is initialized with a snapshot of the master’s data. 
##以主库的一个快照为基础,启动一个slave。当快照中已经保存了主库的数据字典,这样可以比从库进行完全同步要快##
--autoresync 
   ##自动执行一个完整的同步操作##
  Automatically perform. a full resync if this slave gets out of sync with the master 
--oplogSize 
  ##主库的oplog的大小以M 为单位。##  
添加和删除源库
之前说过可以在开始启动的时候直接指定 --source 来标识主库,也可以在启动slave之后,在local 库中添加主(源)库的信息,比如:
加入在本机上已经有一个主库在localhost:27017端口,我们可以启动一个不带 --source参数的slave 
$ ./mongod --slave --dbpath ~/dbs/slave --port 27018 
启动之后,执行添加操作:
> use local 
> db.sources.insert({"host" : "localhost:27017"}) 
例子:
在主库:
[mongodb@rac2 bin]$ ./mongod --master -port=27017 --dbpath=/opt/mongodata  &
[1] 6715
[mongodb@rac2 bin]$ Sun Oct 30 17:34:08 [initandlisten] MongoDB starting : pid=6715 port=27017 dbpath=/opt/mongodata master=1 64-bit host=rac2
[mongodb@rac2 bin]$ ./mongo 127.0.0.1:27017
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27017/test
> db.yql.insert({id:1,val:"this is on master!"});
> db.yql.find();
{ "_id" : ObjectId("4ead1b21da034cce224fca6f"), "id" : 1, "val" : "this is on master!" }
> db.yql.insert({id:1,val:"this is on master and this message will be send to slave!"});
> db.yql.find();
{ "_id" : ObjectId("4ead1b21da034cce224fca6f"), "id" : 1, "val" : "this is on master!" }
{ "_id" : ObjectId("4ead1bd7da034cce224fca70"), "id" : 1, "val" : "this is on master and this message will be send to slave!" }
在备库
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27018
MongoDB shell version: 2.0.1
connecting to: 127.0.0.1:27018/test
> use local
switched to db local
> db.sources.insert({"host" : "10.250.7.249:27017"}); 
> db.sources.find();
{ "_id" : ObjectId("4ead1b68b868f3c88da3b06f"), "host" : "10.250.7.249:27017", "source" : "main", "syncedTo" : { "t" : 1319967596000, "i" : 1 }, "dbsNextPass" : { "test" : true }, "incompleteCloneDbs" : { "test" : true } }
> use test
switched to db test
> db.yql.find();
{ "_id" : ObjectId("4ead1b21da034cce224fca6f"), "id" : 1, "val" : "this is on master!" }
> db.yql.find();
{ "_id" : ObjectId("4ead1b21da034cce224fca6f"), "id" : 1, "val" : "this is on master!" }
{ "_id" : ObjectId("4ead1bd7da034cce224fca70"), "id" : 1, "val" : "this is on master and this message will be send to slave!" }
如果你要更换master ,比如从 10.250.7.249 更换为 10.249.197.220 则执行
> db.sources.insert({"host" : "10.250.7.220:27017"}); 
> db.sources.remove({"host" : "10.250.7.249:27017"});
####但我实验的过程中是如下情况,remove 删除不了!???#####
> db.sources.find();
{ "_id" : ObjectId("4ead250e6c7e8620f17d8ebb"), "host" : "10.250.7.249:27017", "source" : "main", "syncedTo" : { "t" : 1319970116000, "i" : 1 } }
> db.sources.remove({"host" : "10.250.7.249:27017"}); 
> db.sources.find();
{ "_id" : ObjectId("4ead25ed6c7e8620f17d8ebc"), "host" : "10.250.7.249:27017", "source" : "main", "syncedTo" : { "t" : 1319970276000, "i" : 1 } }
注意:如果从库从不同的主库上接受日志,对于同样的集合collections,mongodb会自动合并他们,当然这样做并不保证完全正确。 对于此种情况,最好指定不同的命名空间。

相关文章:

  • 解决前端文件修改后浏览器页面未更新的问题
  • 【烈日炎炎战后端】Redis(6.1万字)
  • UIScrollView视差模糊效果
  • 真正的上锁前,为何要调用preempt_disable()来关闭抢占的case【转】
  • 【烈日炎炎战后端】Linux(0.3万字)
  • POJ3159 Candies(最短路径:SPFA+链表+栈)
  • 【烈日炎炎战后端】SpringMVC(0.5万字)
  • 【shell 脚本】两种登录方式
  • 【烈日炎炎战后端】Spring(2.1万字)
  • tcpdump统计http请求
  • 产品经理技能之MRD的笔记之一
  • 【烈日炎炎战后端】消息队列(1.0万字)
  • css笔记:如何让一个div居于页面正中间
  • 【烈日炎炎战后端】Git(0.1万字)
  • R语言 如何为图片添加文字说明(转载)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 08.Android之View事件问题
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • CSS相对定位
  • EventListener原理
  • JAVA 学习IO流
  • Java教程_软件开发基础
  • jdbc就是这么简单
  • oldjun 检测网站的经验
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • React 快速上手 - 07 前端路由 react-router
  • Spring声明式事务管理之一:五大属性分析
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • vue--为什么data属性必须是一个函数
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 高程读书笔记 第六章 面向对象程序设计
  • 基于组件的设计工作流与界面抽象
  • 码农张的Bug人生 - 初来乍到
  • 微信公众号开发小记——5.python微信红包
  • 为视图添加丝滑的水波纹
  • 正则学习笔记
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • Spring Batch JSON 支持
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • # Maven错误Error executing Maven
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (13)Hive调优——动态分区导致的小文件问题
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (四) 虚拟摄像头vivi体验
  • (四)JPA - JQPL 实现增删改查
  • (译) 函数式 JS #1:简介
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)EOS中账户、钱包和密钥的关系
  • (转)shell中括号的特殊用法 linux if多条件判断