一.mongodb replication 介紹
官網上的第一句話就是Replication is the process of synchronizing data across multiple servers.翻譯過來就是replication(復制)是跨多個服務器同步的過程,基本原理就是一個主服務器和很多從服務器通過同步日志的方式來達到數據一致的目的,並且有且只有一個主服務器,在mongodb中也叫主節點(primary node)負責寫操作,而從服務器,也叫次要節點(secondary nodes)只需復制主服務器的一個叫oplog 的日志來與主服務器的數據同步,如果主服務器不幸掛掉,那么mongo的引擎會自動觸發一次選舉,選出新的主服務器(或者半數以上投票),如果沒法完成選舉,票數相同等情況,整個集群將會變成只讀狀態無法寫入。mongo也有一個角色叫做仲裁者(Arbiter),它不存儲和同步數據,只是作為一個維持權威或者心跳數據的存在避免節點過少無法完成選舉,其也幫助主從服務器判斷狀態,其可以用一些性能較差的機器或者虛擬機扮演。
作為一個前端以上是我能做出的最好的解釋了。下面直接開擼,簡單幾步幾行代碼帶大家搭建一個mongo replica
二.mongodb replica set
1.系統介紹
a.mac osx 10.10
b.mongodb 3.2.0
2.節點建點
首先需要去你選擇的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端口
//終端下進入 mongo localhost:10001 //進入后輸入初始化方法 rs.initiate({_id:"gabriel",members:[ {_id:1,host:"localhost:10001"}, {_id:2,host:"localhost:10002"}, {_id:3,host:"localhost:10003"}, ]})
收到如下信息就成功了。
{ "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
以上就是簡單的建立過程,現在已經可以在從服務器看到主服務器插入的數據了。
三.在nodejs中使用mongoose連接replica 數據庫
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" };
所以過程如上所述,有問題可以留言告知,覺得好的點一下推薦~