Docker搭建mongodb主從複製集羣(nodejs+mongoose)

爲什麼需要搭建mongodb集羣?

  1. 數據備份
  2. 數據恢復
  3. 讀寫分離

首先我們先準備一個nodejs實例
以express腳手架爲例
http://www.expressjs.com.cn/starter/generator.html

先配置node連接mongodb的配置信息

const mongoose = require('mongoose');
mongoose.connect(
  "mongodb://192.168.77.137:27017,192.168.77.137:27018/test?replicaSet=rs", //連接多個數據庫用來配合主從集羣
  {
    useNewUrlParser: true,
    poolSize: 5,
    readPreference: "secondary" //集羣配置
  });
//判斷連接是否生效
const conn = mongoose.connection;

conn.on("open", () => {
    console.log('mongodb連接成功');
})
conn.on("error", () => {
    console.log('mongodb連接失敗');
});

骨架和路由的配置

var express = require('express');
var router = express.Router();
const mongoose = require("mongoose");
const user = mongoose.model('user', mongoose.Schema({
  username: { type: String },
  password: { type: String },
  user_ssh: { type: String }
}, { collection: "user", versionKey: false, strict: true }));

/* GET home page. */
router.get('/', function (req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/test', async function (req, res, next) {
  const data = await user.find({username:"zzw"});
  res.send(data);
});

router.get('/add', async function (req, res, next) {
  const data = await user.create({username:"zzw"});
  res.send(data);
});

router.get('/err', function (req, res, next) {
  process.exit();
});
module.exports = router;

更多配置請看這裏

primary	//默認模式,所有的讀操作都從當前副本集主節點
primaryPreferred	//多數情況下,從主節點讀取數據,但是如果主節點不可用了,會從從節點讀取
secondary	//所有讀操作都從副本集的從節點讀取
secondaryPreferred	//多數情況下, 從從節點進行讀操作,但是如果從節點都不可用了,從主節點讀取
nearest	//從副本集中延遲最低的成員讀取,不考慮成員的類型

然後我們可以開始配置mongodb集羣了

保證您的機器已經安裝了docker
https://www.docker.com/

安裝mongodb

1. docker search mongo  //搜索所有mongo鏡像
2. docker pull mongo   //拉取官方鏡像
3. docker imsages   //查看所有鏡像
4. docker run -p 27017:27017 -v $PWD -d mongo //$pwd選擇當前目錄爲mongodb工作目錄,也可以自己指定
5. docker ps -a //查看mmongo工作狀態

在這裏插入圖片描述

爲了方便演示,我們採用一主一從的方式

因爲是一主一從,所以我們啓動兩個mongodb的docker容器,如果您搭建一主多從,則多啓動幾個容器即可

docker run -p 27017:27017 -v $PWD -d mongo --noprealloc --smallfiles --replSet rs

docker run -p 27018:27017 -v $PWD -d mongo --noprealloc --smallfiles --replSet rs

//$pwd指定當前目錄爲mongodb的工作目錄
//noprealloc
默認false:使用預分配方式來保證寫入性能的穩定,預分配在後臺進行,並且每個預分配的文件都用0進行填充。這會讓MongoDB始終保持額外的空間和空餘的數據文件,從而避免了數據增長過快而帶來的分配磁盤空間引起的阻塞。
設置noprealloc= true來禁用預分配的數據文件,會縮短啓動時間,但在正常操作過程中,可能會導致性能顯著下降
//smallfiles
smallfiles:是否使用較小的默認文件。默認爲false,不使用。
設置爲true,使用較小的默認數據文件大小。smallfiles減少數據文件的初始大小,並限制他們到512M,也減少了日誌文件的大小,並限制他們到128M。
如果數據庫很大,各持有少量的數據,會導致mongodb創建很多文件,會影響性能
//replSet
使用此設置來配置複製副本集。指定一個副本集名稱作爲參數,所有主機都必須有相同的名稱作爲同一個副本集。

更詳細的mongodb.conf配置文件解析鏈接
https://my.oschina.net/pwd/blog/399374

現在我們已經啓動了兩個mongodb容器了
在這裏插入圖片描述

接下來就需要配置mongodb的集羣文件了

//以剛運行的27017端口的mongodb數據庫爲主節點進入數據庫
//一次執行一下命令
mongo --port 27017   //連接數據庫
myconf = {"_id":"rs","members":[{"_id":0,"host":"192.168.77.111:27017"},{"_id":1,"host":"192.168.77.137:27018"}]}  //配置mongodb集羣文件
rs.initiate(myconf)   //初始化配置文件

此時我們的mongodb配置文件已經初始化完畢

rs.isMaster();  //查看主節點配置信息
rs.slaveOk();  //設置爲從節點
rs.status();     //查看狀態
rs.conf();        //查看配置

在這裏插入圖片描述

現在我們的主從複製集羣已經搭建完畢了,我們可以在主節點添加數據同步至從節點,也可以根據mongoose配置的策略進行從節點的讀取

如何查看讀取了哪一個從節點?

先進入端口爲27017和27018的數據庫

db.setProfilingLevel(level)
level:
0: 關閉
1: 記錄慢查詢
2: 記錄所有操作

爲了測試,我們先講等級設置爲1,記錄所有操作

db.system.profile.find() //查詢所有操作記錄

27017下可以看到插入記錄
在這裏插入圖片描述

27018下可以看到查詢記錄
在這裏插入圖片描述

ts://命令執行時間

info://命令的內容

query://代表查詢

order.order: //代表查詢的庫與集合

reslen://返回的結果集大小,byte數

nscanned://掃描記錄數量

nquery://後面是查詢條件

nreturned://返回記錄數及用時

millis://所花時間

同樣的我們也可以在local數據集下oplog.rs集合中查看所有的增刪改操作記錄,也正是這個文件保證了主從數據的一致性

參考鏈接:
https://blog.csdn.net/adparking/article/details/41823393 //數據監控
https://blog.csdn.net/jhc23/article/details/81099281 //日誌監控
https://my.oschina.net/pwd/blog/399374 //mongodb配置文件解析
https://www.cnblogs.com/jinjiangongzuoshi/p/9301062.html //主從搭建步驟
https://www.cnblogs.com/Joans/p/7723554.html //oplog.rs集合解析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章