mongodb replica set 和 nodejs中使用mongoose連線replica

GabrielChenCN發表於2016-01-06

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

  

所以過程如上所述,有問題可以留言告知,覺得好的點一下推薦~ 

相關文章