HI!,你好,我是zane,zanePerfor是一款最近我開發的一個前端性能監控平臺,如今支持web瀏覽器端和微信小程序段。html
我定義爲一款完整,高性能,高可用的前端性能監控系統,這是將來會達到的目的,現今的架構也基本支持了高可用,高性能的部署。實際上還不夠,在不少地方還有優化的空間,我會持續的優化和升級。前端
開源不易,若是你也熱愛技術,擁抱開源,但願能小小的支持給個star。linux
MongoDB 副本集(Replica Set)是有自動故障恢復功能的主從集羣,有一個Primary節點和一個或多個Secondary節點組成。
web
當主節點掛掉以後,會由多個副本節點選舉產生出新的主節點。(節點數請保持爲基數個)。mongodb
這樣就能保證應用的高可用,其中一個或多個節點掛掉以後還能正常運行和服務。小程序
數據丟失:主節點掛掉以後,副本節點選舉出新的主節點須要必定的時間,這段時間會形成數據的丟失。微信小程序
不能承受高吞吐量:副本集架構追根仍是單機執行寫任務,在高併發應用中性能受限,不能解決流量洪峯時的實時讀寫。
瀏覽器
不能徹底保證項目的高可用:在副本集的環境中,要是全部的Secondary都宕機了,只剩下Primary。最後Primary會變成Secondary,將不能再提供服務。
在大多數狀況下推薦使用副本集架構,副本集架構在保證高可用的同時還能下降服務器成本,相對於集羣分片來講配置也更簡單,更易於維護,具體選擇什麼架構須要根據本身的項目來覺定。
請參考: LINUX系統下安裝mongodb
關於副本集搭建還可參考個人另外一篇文章: MongoDB主從副本集架構
// 數據存放目錄
mkdir -p /data/replication/s0
mkdir -p /data/replication/s1
mkdir -p /data/replication/s2
// 日誌存放目錄
mkdir -p /data/replication/log複製代碼
// 啓動mongodb服務
mongod --dbpath /data/replication/s0 --logpath /data/replication/log/s0.log --fork --smallfiles --port 28100 --replSet rs1
mongod --dbpath /data/replication/s1 --logpath /data/replication/log/s1.log --fork --smallfiles --port 28101 --replSet rs1
mongod --dbpath /data/replication/s2 --logpath /data/replication/log/s2.log --fork --smallfiles --port 28102 --replSet rs1複製代碼
--dbpath:存放數據目錄
--logpath:存放日誌目錄
--smallfiles:是否使用較小的默認文件。默認爲false,不使用。
--replSet: 副本集名稱,副本集名稱必須一致
進入28100服務設置副本集
// 登陸 mongodb
mongo localhost:28100
// 切換到admin用戶
use admin
// 初始化副本集
rs.initiate({_id:"rs1",members:[{_id:0,host:"127.0.0.1:28100"},{_id:1,host:"127.0.0.1:28101"},{_id:2,host:"127.0.0.1:28102"}]})
// 查看副本集狀態
rs.status()複製代碼
副本集設置成功以後,查看狀態會看到以下信息即標識成功。
{
"set" : "rs1",
"date" : ISODate("2018-11-14T08:40:44.659Z"),
"myState" : 1,
"term" : NumberLong(2),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
}
},
"members" : [
{
"_id" : 0,
"name" : "127.0.0.1:28100",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 5977,
"optime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-11-14T08:40:35Z"),
"electionTime" : Timestamp(1542178880, 1),
"electionDate" : ISODate("2018-11-14T07:01:20Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "127.0.0.1:28101",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5970,
"optime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-11-14T08:40:35Z"),
"optimeDurableDate" : ISODate("2018-11-14T08:40:35Z"),
"lastHeartbeat" : ISODate("2018-11-14T08:40:43.345Z"),
"lastHeartbeatRecv" : ISODate("2018-11-14T08:40:43.603Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "127.0.0.1:28102",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "127.0.0.1:28102",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 5970,
"optime" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"optimeDurable" : {
"ts" : Timestamp(1542184835, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2018-11-14T08:40:35Z"),
"optimeDurableDate" : ISODate("2018-11-14T08:40:35Z"),
"lastHeartbeat" : ISODate("2018-11-14T08:40:43.345Z"),
"lastHeartbeatRecv" : ISODate("2018-11-14T08:40:43.575Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "127.0.0.1:28100",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1542184835, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1542184835, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}複製代碼
查看是否有次文件:
cd ~
ll -a複製代碼
若無,則全局查找:
// 全局搜索
sudo find / -name .mongorc.js複製代碼
添加rs.slaveOk();
vi ~/.mongorc.js
// 此文件默認爲空
// 增長一行,保存退出
rs.slaveOk();複製代碼
重啓Mongodb,這時全部副本節點均可讀。
// mongodb 服務
// 此處替換 url 參數爲連接副本集方式便可
const dbclients = {
db3: {
url: 'mongodb://127.0.0.1:28100,127.0.0.1:28101,127.0.0.1:28102/performance?replicaSet=rs1',
options: {
poolSize: 100,
keepAlive: 10000,
connectTimeoutMS: 10000,
autoReconnect: true,
reconnectTries: 100,
reconnectInterval: 1000,
},
},
};複製代碼
primary - (默認值) 只從主節點讀取。若是主節點不可用則報錯。不能跟 tags 選項組合使用。
secondary 只有當從節點可用時,從中讀取,不然報錯。
primaryPreferred 優先讀取主節點,不可用時讀取從節點。
secondaryPreferred 優先讀取從節點,不可用時讀取主節點。
nearest 全部操做都讀最近的候選節點,不一樣於其餘模式,該選項會隨機選取全部主、從節點。複製代碼
選項別名:
p primary
pp primaryPreferred
s secondary
sp secondaryPreferred
n nearest複製代碼
zanePerfor前端性能監控平臺高可用之Mongodb集羣分片架構
zanePerfor github地址:
zanePerfor 開發文檔: