1. 什么是Replication
数据复制是为了使数据得到最大的可用性,避免单点故障的发生,MongoDB支持在服务器之间进行数据的异步复制,来满足数据的最终一致性。但是同一时刻只有一台服务器是可以写的。当只有一台master时,数据的强一致性就可以得到保障。但当用户从slaves上去读数据时,这里只能保障数据的最终一致性。目前MongoDB提供了三种Replication方式,Matser/Matser, Matser/Slave,Replica Sets
注意:
如果你使用的是v1.6版本以下的MongoDB,你可能使用前两种模式,第三种模式在v1.6.0版本中才提供。另外,v1.6.0版本的Replic Sets还不支持--auth这个参数,不过在v1.7.0版本中就提供了。
Replica sets是一种结合了Master/Slave模式与自动数据容错、自动恢复的综合体。Replica sets也是"Replica Pairs version 2"。
一个Replica set是一组mongod节点的集成,每个节点上的数据都是冗余的,以此来保证数据的可用性。
一般配置一个两步,启动Replica set集合中的每一个节点,再对其建立关系。这里我们用三个节点来做
建立数据库目录与启动服务:
mkdir -p /data/r0 mkdir -p /data/r1 mkdir -p /data/r2 mongod --replSet foo --port 27017 --dbpath /data/r0 mongod --replSet foo --port 27017 --dbpath /data/r1 mongod --replSet foo --port 27017 --dbpath /data/r2
建立相应的关系:
这时你要登陆到其中的一个节点上去,运行如下命令
mongo localhost:27017 [kyle@arete ~$]$ mongo localhost:27017 MongoDB shell version: 1.5.7 connecting to: localhost:27017/test > config = {_id: 'foo', members: [ {_id: 0, host: 'localhost:27017'}, {_id: 1, host: 'localhost:27018'}, {_id: 2, host: 'localhost:27019'}] } > rs.initiate(config); { "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
你可以用如下命令显示其状态:
> rs.status() { "set" : "foo", "date" : "Mon Aug 02 2010 11:39:08 GMT-0400 (EDT)", "myState" : 1, "members" : [ { "name" : "arete.local:27017", "self" : true, }, { "name" : "localhost:27019", "health" : 1, "uptime" : 101, "lastHeartbeat" : "Mon Aug 02 2010 11:39:07 GMT-0400", }, { "name" : "localhost:27018", "health" : 1, "uptime" : 107, "lastHeartbeat" : "Mon Aug 02 2010 11:39:07 GMT-0400", } ], "ok" : 1 }
打开一个MongoDB服务
$ ./mongod --replSet foo
登陆到已经存在的Replica Sets的主节点上去,运行如下命令
$ ./mongo MongoDB shell version: ... connecting to: test > rs.add("broadway:27017"); { "ok" : 1 }
添加完以后,它会运行相应的数据同步操作。
这是一种最普通的数据复制方式,一般要启动两个服务,一个是Master,另一个是Slave
$ bin/mongod --master [--dbpath /data/masterdb/] $ bin/mongod --slave --source <masterhostname>[:<port>] [--dbpath /data/slavedb/]
其中要注意的是Master有一个参数叫--oplogSize,它是指定编辑日志的大小,这个日志是用来对slave进行数据同步用的,默认是磁盘的5%。
Replica Sets主要是提供一种节点出故障后的自动选举功能,就是当这个set中的primary故障后,它会自动选举出一个节点做为primary,而不是整个set变成只读的。
replica set可以通过如下配置方式来模拟Master/Slave模式
$ # run mongod instances with "--replSet mysetname" parameter $ # then in the shell: $ mongo --host M > cfg = { > _id : 'mysetname', > members : [ > { _id : 0, host : 'M', priority : 1 }, > { _id : 1, host : 'S', priority : 0, votes : 0 } > ] > }; > rs.initiate(cfg);
http://www.mongodb.org/display/DOCS/Replica+Sets
http://www.mongodb.org/display/DOCS/Replica+Set+Tutorial
http://www.mongodb.org/display/DOCS/Master+Slave