MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。
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. 启动主服务器
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Master --port 27017 --master
mongod --config Master.conf
mongod --bind_ip 127.0.0.1 --dbpath ~/development/mongoDBdata/Slave --port 27018 --source 127.0.0.1 --slave
mongod --config Slave.conf
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" }
mongo 127.0.0.1:27018 use foolbar db.persons.find(); >>>{ "_id" : ObjectId("53e0e9afa341791bae80ebc2"), "name" : "tom", "job" : "SE" }
db.persons.insert({"name":"Jack","job":"CT"}); >>>not master
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)
主从复制配置简单,但是如本文开头所说,主从复制的最大问题在于主服务器的单点故障问题,因此在生产环境中,主从复制使用较少,下一篇将介绍复制的另一种方式副本集复制,这种方式解决了主服务器的单点故障问题(主服务器挂了,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"}会把新启动的独立服务器变为从服务器。