爲什麼需要搭建mongodb集羣?
- 數據備份
- 數據恢復
- 讀寫分離
首先我們先準備一個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集合解析