官网上的第一句话就是Replication is the process of synchronizing data across multiple servers.翻译过来就是replication(复制)是跨多个服务器同步的过程,基本原理就是一个主服务器和不少从服务器经过同步日志的方式来达到数据一致的目的,而且有且只有一个主服务器,在mongodb中也叫主节点(primary node)负责写操做,而从服务器,也叫次要节点(secondary nodes)只需复制主服务器的一个叫oplog 的日志来与主服务器的数据同步,若是主服务器不幸挂掉,那么mongo的引擎会自动触发一次选举,选出新的主服务器(或者半数以上投票),若是无法完成选举,票数相同等状况,整个集群将会变成只读状态没法写入。mongo也有一个角色叫作仲裁者(Arbiter),它不存储和同步数据,只是做为一个维持权威或者心跳数据的存在避免节点过少没法完成选举,其也帮助主从服务器判断状态,其能够用一些性能较差的机器或者虚拟机扮演。javascript
做为一个前端以上是我能作出的最好的解释了。下面直接开撸,简单几步几行代码带你们搭建一个mongo replicahtml
1.系统介绍前端
a.mac osx 10.10java
b.mongodb 3.2.0node
2.节点建点mongodb
首先须要去你选择的mongodb数据文件存放的文件夹新建三个数据库,用来模拟三台不通的机器,博主的路径以下数据库
cd /data/db mkdir nodeOne nodeTwo nodeThree
3.启动三个数据库(dbpath),而且端口(--port 1000x),集群名称(--replSet gabriel),关闭日志选项(--nojournal),守护进程方式启动,会自动拉起(--fork),日志目录(--logpath)。服务器
mongod --dbpath /data/db/node1 --port 10001 --replSet gabriel --nojournal --fork --logpath /data/db/node1.log mongod --dbpath /data/db/node2 --port 10002 --replSet gabriel --nojournal --fork --logpath /data/db/node2.log mongod --dbpath /data/db/node3 --port 10003 --replSet gabriel --nojournal --fork --logpath /data/db/node3.log
4.顺便链接一个服务器,作初始化操做,这里博主连入10001端口app
//终端下进入 mongo localhost:10001 //进入后输入初始化方法 rs.initiate({_id:"gabriel",members:[ {_id:1,host:"localhost:10001"}, {_id:2,host:"localhost:10002"}, {_id:3,host:"localhost:10003"}, ]})
收到以下信息就成功了。socket
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
此时会发现终端上的输出已经有了变化。
//从单个一个 > //变成了 gabriel:OTHER>
5.查询状态
rs.status()
在返回中,参数set后面为集群名称,每一个members下面能够看到他们各自的状况,其中stateStr是角色,主节点为(PRIMARY)。
6.进入主节点插入数据,进入从节点查看数据
//博主主节点在10001接口 mongo localhost:10001 //切换数据库,插入一条数据,依次输入 use gabdb db.user.insert({dataid:10001}) db.user.find()
切换到从节点,你会发现使用show dbs 会报错,是由于尚未开启权限,输入rs.slaveOk();就能够顺利访问了。
//切换从节点 mongo localhost:10002 //无权限查询 show dbs //报错 2016-01-06T14:48:53.155+0800 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and slaveOk=false", "code" : 13435 } : //开启 gabriel:SECONDARY> rs.slaveOk() gabriel:SECONDARY> show dbs
以上就是简单的创建过程,如今已经能够在从服务器看到主服务器插入的数据了。
1.版本介绍
a.nodejs 0.10.25
b.mongoose 3.8.8
c.connect-mongo 0.8.2 (低版本有官方bug,慎用)
2.配置以下
var mongoose = require('mongoose'), //mongoose配置 var opts = { db: { native_parser: true }, server: { poolSize: 5 , auto_reconnect: true, socketOptions: {keepAlive: 1} }, replset: { rs_name: 'gabriel' } } //mongoose链接 app.db = mongoose.connect(config.mongodb.repUri, opts); app.db.on('error', console.error.bind(console, 'mongoose connection error: ')); app.db.once('open', function () { //and... we have a data store }); //config.mongodb.repUri 以下 exports.mongodb = { repUri:"mongodb://localhost:10001,localhost:10002,localhost:10003/gabdb" };
因此过程如上所述,有问题能够留言告知,以为好的点一下推荐~