zanePerfor前端效能監控平臺高可用之Mongodb叢集分片架構
HI!,你好,我是zane,zanePerfor是一款最近我開發的一個前端效能監控平臺,現在支援web瀏覽器端和微信小程式段。
我定義為一款完整,高效能,高可用的前端效能監控系統,這是未來會達到的目的,現今的架構也基本支援了高可用,高效能的部署。實際上還不夠,在很多地方還有優化的空間,我會持續的優化和升級。
開源不易,如果你也熱愛技術,擁抱開源,希望能小小的支援給個star。
專案的github地址:
ofollow,noindex">github.com/wangweiange…
專案開發文件說明:
分片的概念:
在MongoDB中,分片叢集(sharded cluster)是一種水平擴充套件資料庫系統性能的方法,能夠將資料集分散式儲存在不同的分片(shard)上,每個分片只儲存資料集的一部分,MongoDB保證各個分片之間不會有重複的資料,所有分片儲存的資料之和就是完整的資料集。分片叢集將資料集分散式儲存,能夠將負載分攤到多個分片上,每個分片只負責讀寫一部分資料,充分利用了各個shard的系統資源,提高資料庫系統的吞吐量。
為什麼要分片:
- 解決高併發時系統吞吐量
- 解決垂直擴充套件的價格昂貴成本,降低成本
- 提高系統的穩定,高可用性
- 提供大資料量時的分散式計算能力
- 解決單機或副本集的磁碟不足
- 解決請求量巨大時的記憶體不足等
MongoDB分片叢集結構分佈:
上圖中主要有如下所述三個主要元件:
Shard:
用於儲存實際的資料塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障
Config Server:
mongod配置伺服器,儲存了整個 ClusterMetadata,其中包括 chunk資訊(配置伺服器3.4起需要是副本集)。
Query Routers:
mongos路由器,客戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。
分片例項
(備註:鑑於成本,以下內容在單機下部署為例,多機部署只需要替換下IP即可)
分片計劃
- 三個Shard分片 埠:27020,27021,27022
- 三個Config服務 埠:27100,27101,27102
- 一個Mongos路由服務 埠:30000
建立Shard分片目錄
// 建立分片資料和日誌儲存目錄 mkdir -p /data/mongod/s0 mkdir -p /data/mongod/s1 mkdir -p /data/mongod/s2 mkdir -p /data/mongod/log複製程式碼
啟動Shard Server
mongod --dbpath /data/mongod/s0 --logpath /data/mongod/log/s0.log --fork --smallfiles --port 27020 --shardsvr mongod --dbpath /data/mongod/s1 --logpath /data/mongod/log/s1.log --fork --smallfiles --port 27021 --shardsvr mongod --dbpath /data/mongod/s2 --logpath /data/mongod/log/s2.log --fork --smallfiles --port 27022 --shardsvr複製程式碼
-
--dbpath:儲存資料目錄
-
--logpath:儲存日誌目錄
-
--smallfiles:是否使用較小的預設檔案。預設為false
-
--shardsvr:是表示以sharding模式啟動Mongodb伺服器
提示:每個Shard分片也可以是Mongodb副本集
建立Config Server目錄
mkdir -p /data/mongod/c0 mkdir -p /data/mongod/c1 mkdir -p /data/mongod/c2複製程式碼
啟動Config Server
mongod --dbpath /data/mongod/c0 --logpath/data/mongod/log/c0.log --fork --smallfiles --port 27100 --replSet rs1 --configsvr mongod --dbpath /data/mongod/c1 --logpath/data/mongod/log/c1.log --fork --smallfiles --port 27101 --replSet rs1 --configsvr mongod --dbpath /data/mongod/c2 --logpath/data/mongod/log/c2.log --fork --smallfiles --port 27102 --replSet rs1 --configsvr複製程式碼
-
--replSet:副本集名稱,副本集名稱必須一致
-
--configsvr:是表示以config配置服務啟動Mongodb伺服器
提示:配置伺服器需要是Mongodb副本集
配置副本集:
// shell 命令進入mongodb mongo --port 27100 // 使用admin賬戶 use admin; // 初始化副本集 rs.initiate({_id:"rs1",members:[{_id:0,host:"127.0.0.1:27100"},{_id:1,host:"127.0.0.1:27101"},{_id:2,host:"127.0.0.1:27102"}]}) // 檢視副本集狀態 rs.status();複製程式碼
提示:Mongodb副本集節點的增刪非常簡單,增加使用 rs.add("127.0.0.1:27103")
刪除使用: rs.remove("127.0.0.1:27103")
啟動Route Process
mongos--logpath /data/mongod/log/mongo.log --port 30000 --fork --configdb rs1/127.0.0.1:27100,127.0.0.1:27101,127.0.0.1:27102複製程式碼
- mongos服務不儲存資料,因此不需要dbpath
-
--configdb是核心配置,表示設定config server的地址列表,格式: 副本集名稱/host:prot,host:prot,host:prot 格式。
提示:mongos路由服務也可以是副本集
配置Sharding分片
// 進入路由伺服器 mongo --port 30000 // 新增分片 sh.addShard("127.0.0.1:27020") sh.addShard("127.0.0.1:27021") sh.addShard("127.0.0.1:27022") // 檢視分片資訊 sh.status();複製程式碼
設定分片資料庫與片鍵
指定需要分片的資料庫
sh.enableSharding("performance")複製程式碼
設定分片的片鍵
Mongodb如何分片是一門學問,分的好對資料均衡儲存,查詢效率有很高的提升,分的不好導致分片不均勻,有的chunk太大,有的太小,查詢效率低下,需要好好的實踐和琢磨。
Sharding架構下,如果不手動分片,Mongodb不會自動分片,所有資料會儲存到一個片中,所以我們希望分片的表必須手動分片。
分片選擇的片鍵首先需要建立索引。
例如:下面對performance資料庫的 pagelist 集合進行分片,選擇url為片鍵。
1、建立索引
db.pagelist.ensureIndex({"url":1})複製程式碼
2、設定分片
sh.shardCollection("performance.pagelist",{url:1})複製程式碼
至此分片完畢。
Mongodb一個chunk預設大小為64M,當資料量大於64M時會重新建立新的chunk儲存資料。
在zanePerfor (前端效能監控平臺)生產環境中使用Mongodb叢集分片。
在zanePerfor使用叢集分片非常簡單,跟單機配置模式是一樣的,只需要更改下埠號即可。
一:找到專案的 config/config.prod.js檔案
更改如下Mongodb配置即可:
// mongodb 服務 // 此處替換 url 引數為連結副本集方式即可 const dbclients = { db3: { // 單路由方式 url: 'mongodb://127.0.0.1:30000/performance', // 路由副本集方式 url: 'mongodb://127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002/performance?replicaSet=mongos', options: { poolSize: 100, keepAlive: 10000, connectTimeoutMS: 10000, autoReconnect: true, reconnectTries: 100, reconnectInterval: 1000, }, }, };複製程式碼
二:分片規則
分片規則初期使用hashed分片,例如webpages集合分片方式:
sh.shardCollection("performance.webpages", { "url": "hashed"})複製程式碼
詳細的分配規則和效能還在總結和實踐中,調優之後我會放到github中。