zanePerfor前端性能監控系統高可用之Mongodb副本集讀寫分離架構

HI!,你好,我是zane,zanePerfor是一款最近我開發的一個前端性能監控平臺,如今支持web瀏覽器端和微信小程序段。html

我定義爲一款完整,高性能,高可用的前端性能監控系統,這是將來會達到的目的,現今的架構也基本支持了高可用,高性能的部署。實際上還不夠,在不少地方還有優化的空間,我會持續的優化和升級。前端

開源不易,若是你也熱愛技術,擁抱開源,但願能小小的支持給個star。linux

項目的github地址:

github.com/wangweiange…
git

項目開發文檔說明:

blog.seosiwei.com/performance…github


Mongodb副本集架構

優點:

MongoDB 副本集(Replica Set)是有自動故障恢復功能的主從集羣,有一個Primary節點和一個或多個Secondary節點組成。
web

當主節點掛掉以後,會由多個副本節點選舉產生出新的主節點。(節點數請保持爲基數個)。mongodb

這樣就能保證應用的高可用,其中一個或多個節點掛掉以後還能正常運行和服務。小程序

劣勢:

數據丟失:主節點掛掉以後,副本節點選舉出新的主節點須要必定的時間,這段時間會形成數據的丟失。微信小程序

不能承受高吞吐量:副本集架構追根仍是單機執行寫任務,在高併發應用中性能受限,不能解決流量洪峯時的實時讀寫。
瀏覽器

不能徹底保證項目的高可用:在副本集的環境中,要是全部的Secondary都宕機了,只剩下Primary。最後Primary會變成Secondary,將不能再提供服務。

總結:

在大多數狀況下推薦使用副本集架構,副本集架構在保證高可用的同時還能下降服務器成本,相對於集羣分片來講配置也更簡單,更易於維護,具體選擇什麼架構須要根據本身的項目來覺定。


Mongodb副本集架構搭建:

Mongodb副本集搭建比價簡單,你只須要根據下面的步驟一步一步操做便可(如下內容以Linux或mac爲例進行搭建)。

一:安裝Mongodb (略)

請參考: LINUX系統下安裝mongodb

關於副本集搭建還可參考個人另外一篇文章: MongoDB主從副本集架構


二:副本集搭建

(備註:鑑於成本,如下內容在單機下部署爲例,多機部署只須要替換下IP便可)

一、建立數據和日誌存放目錄

// 數據存放目錄
mkdir -p /data/replication/s0
mkdir -p /data/replication/s1
mkdir -p /data/replication/s2
// 日誌存放目錄
mkdir -p /data/replication/log複製代碼

二、啓動Mongodb服務

(下面以28100,28101,28100三個端口爲例)
// 啓動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)
		}
	}
}複製代碼


三、設置Mongodb副本可讀

在mac和linux系統中,通常在~目錄下會有個.mongorc.js文件,給此文件新增一句rs.slaveOk();便可。

​查看是否有次文件:


cd ~
ll -a複製代碼

若無,則全局查找:

// 全局搜索
sudo find / -name .mongorc.js複製代碼

添加rs.slaveOk();

vi ~/.mongorc.js

// 此文件默認爲空
// 增長一行,保存退出
rs.slaveOk();複製代碼

重啓Mongodb,這時全部副本節點均可讀。


在zanePerfor (前端性能監控平臺)生產環境中使用,並作讀寫分離。

一:找到項目的 config/config.prod.js文件

更改以下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,
            },
        },
 };複製代碼


讀寫分離:

項目全部查詢已經作好了讀寫分離操做,例如查詢page頁列表,其餘皆如此便可,這樣就保證了服務的讀寫壓力(主節點負責寫數據,副本節點負責讀取數據)。


read參數說明

primary - (默認值)    只從主節點讀取。若是主節點不可用則報錯。不能跟 tags 選項組合使用。
secondary            只有當從節點可用時,從中讀取,不然報錯。
primaryPreferred     優先讀取主節點,不可用時讀取從節點。
secondaryPreferred   優先讀取從節點,不可用時讀取主節點。
nearest              全部操做都讀最近的候選節點,不一樣於其餘模式,該選項會隨機選取全部主、從節點。複製代碼

選項別名:

p   primary
pp  primaryPreferred
s   secondary
sp  secondaryPreferred
n   nearest複製代碼

zanePerfor下一步篇:

zanePerfor前端性能監控平臺高可用之Mongodb集羣分片架構

zanePerfor github地址:

github.com/wangweiange…

zanePerfor 開發文檔:

blog.seosiwei.com/performance…

相關文章
相關標籤/搜索