[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
  可以使用1中指定的配置参数进行启动,把它保存在Master.conf文件中,那么,可以用如下脚本启动,当前的目录是Master.conf所在的目录
mongod --config Master.conf
 
3. 启动从服务器
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018 --source 127.0.0.1 --slave
 
    如果主服务器,也可以使用1中指定的关于从服务器的配置参数进行启动,把它保存在Slave.conf文件中,那么,可以用如下脚本启动,当前的目录是Slave.conf所在的目录
mongod --config Slave.conf

 

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"}会把新启动的独立服务器变为从服务器。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mongodb)