mongodb replica set 和 nodejs中使用mongoose鏈接replica

一.mongodb replication 介紹

  官網上的第一句話就是Replication is the process of synchronizing data across multiple servers.翻譯過來就是replication(複製)是跨多個服務器同步的過程,基本原理就是一個主服務器和不少從服務器經過同步日誌的方式來達到數據一致的目的,而且有且只有一個主服務器,在mongodb中也叫主節點(primary node)負責寫操做,而從服務器,也叫次要節點(secondary nodes)只需複製主服務器的一個叫oplog 的日誌來與主服務器的數據同步,若是主服務器不幸掛掉,那麼mongo的引擎會自動觸發一次選舉,選出新的主服務器(或者半數以上投票),若是無法完成選舉,票數相同等狀況,整個集羣將會變成只讀狀態沒法寫入。mongo也有一個角色叫作仲裁者(Arbiter),它不存儲和同步數據,只是做爲一個維持權威或者心跳數據的存在避免節點過少沒法完成選舉,其也幫助主從服務器判斷狀態,其能夠用一些性能較差的機器或者虛擬機扮演。javascript

  做爲一個前端以上是我能作出的最好的解釋了。下面直接開擼,簡單幾步幾行代碼帶你們搭建一個mongo replicahtml

 

二.mongodb replica set

  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

  以上就是簡單的創建過程,如今已經能夠在從服務器看到主服務器插入的數據了。

  

   

三.在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"
};

  

因此過程如上所述,有問題能夠留言告知,以爲好的點一下推薦~ 

相關文章
相關標籤/搜索