MyException - 我的异常网
当前位置:我的异常网» 数据库 » [MongoDB学习笔记1]MongoDB主从复制

[MongoDB学习笔记1]MongoDB主从复制

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
[MongoDB学习笔记一]MongoDB主从复制

MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。

 

事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。
本文介绍MongoDB的主从复制模式,需要指明的是因为在这种模式下,主从复制集群存在单点故障,即主服务器挂了,则整个复制集群就挂了,因为客户端只能往主服务器上写数据,而不能往从数据上写数据,这种读写模式称为读写分离

Master/Slave主从复制

 
1. 主从集群搭建配置(以一个Master和一个Slave为例):
主服务器启动配置参数:

 

port=27017
bind_ip=127.0.0.1
dbpath=~/development/mongoDBdata/Master
master=true

 

 

从服务器启动配置参数

 

port=27018
bind_ip=127.0.0.1
dbpath=~/development/mongoDBdata/Slave
slave=true
source=127.0.0.1:27017

 

 

2. 启动主服务器

   
  注意(--master没有true作为值)
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Master --port 27017 --master
 
3. 启动从服务器
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018 --source 127.0.0.1 --slave
 
4. 主服务器写数据
    使用Mongo的Shell命令解释器,在主服务器上创建一个数据库foobar,创建一个集合Persons,然后插入一个文档({"name": "Tom","job":"SE"})
mongo 127.0.0.1:27017
use foolbar
db.persons.insert({"name":"tom","job":"SE"});
db.persons.find();
>>>{ "_id" : ObjectId("53e0e9afa341791bae80ebc2"), "name" : "tom", "job" : "SE" }
 
5. 在从服务器上查找插入的文档({"name": "Tom","job":"SE"})
mongo 127.0.0.1:27018
use foolbar
db.persons.find();
>>>{ "_id" : ObjectId("53e0e9afa341791bae80ebc2"), "name" : "tom", "job" : "SE" }
 
6. 在从数据库做插入文档操作({"name": "Jack","job":"CT"})
db.persons.insert({"name":"Jack","job":"CT"});
>>>not master
   可见在从服务器上不能执行写操作,写操作只能在主服务器上执行,然后同步到从服务器上。这里有个时间的延时,如果客户端往主服务器上写数据请求返回,然后请求从数据库上相应的数据,如果主从数据还没有完成同步,那么客户端从服务器上有可能得到过时无效的数据或者根本取不到数据
 
7.主服务器日志(前台运行的方式打开,能够方便的在命令行终端看到这些信息)
Tue Aug  5 22:15:01.954 [initandlisten] waiting for connections on port 27017
Tue Aug  5 22:16:56.748 [initandlisten] connection accepted from 127.0.0.1:59106 #1 (1 connection now open)
Tue Aug  5 22:16:57.923 [slaveTracking] build index local.slaves { _id: 1 } --local.slaves是什么??
Tue Aug  5 22:16:57.948 [slaveTracking] build index done.  scanned 0 total records. 0.024 secs
Tue Aug  5 22:25:29.076 [initandlisten] connection accepted from 127.0.0.1:59247 #2 (2 connections now open)
Tue Aug  5 22:26:55.931 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.ns, filling with zeroes...
Tue Aug  5 22:26:56.011 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.ns, size: 16MB,  took 0.079 secs
Tue Aug  5 22:26:56.024 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.0, filling with zeroes...
Tue Aug  5 22:26:56.386 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.0, size: 64MB,  took 0.361 secs
Tue Aug  5 22:26:56.386 [FileAllocator] allocating new datafile ~/development/mongoDBdata/Master/foolbar.1, filling with zeroes...
Tue Aug  5 22:26:56.386 [conn2] build index foolbar.persons { _id: 1 } ---时时的创建索引
Tue Aug  5 22:26:56.387 [conn2] build index done.  scanned 0 total records. 0 secs
Tue Aug  5 22:26:56.387 [conn2] insert foolbar.persons ninserted:1 keyUpdates:0 locks(micros) w:456090 455ms
Tue Aug  5 22:26:56.516 [FileAllocator] done allocating datafile ~/development/mongoDBdata/Master/foolbar.1, size: 128MB,  took 0.129 secs
Tue Aug  5 22:26:57.295 [initandlisten] connection accepted from 127.0.0.1:59273 #3 (3 connections now open)
Tue Aug  5 22:26:57.659 [conn3] end connection 127.0.0.1:59273 (2 connections now open)
Tue Aug  5 22:27:14.189 [conn2] end connection 127.0.0.1:59247 (1 connection now open)
Tue Aug  5 22:37:32.765 [initandlisten] connection accepted from 127.0.0.1:59454 #4 (2 connections now open)
Tue Aug  5 22:37:32.768 [conn4] end connection 127.0.0.1:59454 (1 connection now open)
                                                            
说明:‘
1. 上面的日志是只在创建一个文档的前提下产生的,因此只有一条关于编译索引的日志
2. 上面的链接数包括Shell客户端链接和从数据库的链接,对于主从服务器,它们之间保持心跳链接,如果过了10秒得不到彼此的应答,那么认为彼此链接断开
 
8. 总结

 

 主从复制配置简单,但是如本文开头所说,主从复制的最大问题在于主服务器的单点故障问题,因此在生产环境中,主从复制使用较少,下一篇将介绍复制的另一种方式副本复制,这种方式解决了主服务器的单点故障问题(主服务器挂了,Mongo集群自动从从服务器中选出一个Leader来做主服务器)

 

9. mongoDB关于Master-Slave的配置选项

 

Master/slave options (old; use replica sets instead): //不推荐使用主从复制,推荐使用副本集
  --master                     master mode //作为主服务器启动MongoDB
  --slave                       slave mode //作为从服务器启动MongoDB
  --source arg              when slave: specify master as <server:port> //针对从服务器配置,指定主服务器(server:port)
  --only arg                  when slave: specify a single database to replicate //针对从服务器配置,只针对主服务器的一个数据库进行复制,其它的数据库不复制
  --slavedelay arg      specify delay (in seconds) to be used when applying master ops to slave //针对主服务器配置,指定主从复制的时间间隔,
  --autoresync            automatically resync if slave data is stale //针对从服务器的设置,数据过期自动同步

 

10. Master/Slave的动态配置

 

10.1 上面配置的Master和Slave是在启动时指定了以Master启动还是以Slave启动,MongoDB也支持在运行时由Javascript命令终端动态的对Master和Slave进行配置。

首先可以在从节点的local.sources集合中察看主服务器的server:port以及同步的状态(为什么127.0.0.1没有端口信息?难道是因为默认端口不显示?)

 

use local
db.sources.find()
>>>{ "host" : "127.0.0.1", "source" : "main", "syncedTo" : Timestamp(1407254957, 1) }

 

 10.2 停止从服务器,使用如下命令启动服务器(没有指定--source和--slave)

 

mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018

 做use local; db.persons.find();操作,发现有一条记录,所以,看到这条文档,以为着这个服务器上次作为Slave启动的,它的Slave角色没有改变,如果不带--slave和--source参数启动,那么主从复制不再维持,主服务器的数据更新不会同步到这台机器,只有以Slave的参数启动才能接收主服务器的数据同步

{ "host" : "127.0.0.1", "source" : "main", "syncedTo" : Timestamp(1407254957, 1) }

 

10.3 对于全新的数据库,比如删除目录~/development/mongoDBData/Slave之后,再执行10.2的启动脚本,此时通过在local.sources添加一个文档{"host":"127.0.0.1:27017"}会把新启动的独立服务器变为从服务器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

文章评论

程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
一个程序员的时间管理
一个程序员的时间管理
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
代码女神横空出世
代码女神横空出世
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
编程语言是女人
编程语言是女人
每天工作4小时的程序员
每天工作4小时的程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
10个调试和排错的小建议
10个调试和排错的小建议
中美印日四国程序员比较
中美印日四国程序员比较
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
我是如何打败拖延症的
我是如何打败拖延症的
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
Java程序员必看电影
Java程序员必看电影
那些争议最大的编程观点
那些争议最大的编程观点
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员都该阅读的书
程序员都该阅读的书
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
 程序员的样子
程序员的样子
总结2014中国互联网十大段子
总结2014中国互联网十大段子
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
为什么程序员都是夜猫子
为什么程序员都是夜猫子
鲜为人知的编程真相
鲜为人知的编程真相
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
老程序员的下场
老程序员的下场
程序员应该关注的一些事儿
程序员应该关注的一些事儿
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
旅行,写作,编程
旅行,写作,编程
如何成为一名黑客
如何成为一名黑客
程序员和编码员之间的区别
程序员和编码员之间的区别
程序员的鄙视链
程序员的鄙视链
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有