HI!,你好,我是zane,zanePerfor是一款最近我開發的一個前端性能監控平臺,如今支持web瀏覽器端和微信小程序段。html
我定義爲一款完整,高性能,高可用的前端性能監控系統,這是將來會達到的目的,現今的架構也基本支持了高可用,高性能的部署。實際上還不夠,在不少地方還有優化的空間,我會持續的優化和升級。前端
開源不易,若是你也熱愛技術,擁抱開源,但願能小小的支持給個star。git
github.com/wangweiange…
github
在MongoDB中,分片集羣(sharded cluster)是一種水平擴展數據庫系統性能的方法,可以將數據集分佈式存儲在不一樣的分片(shard)上,每一個分片只保存數據集的一部分,MongoDB保證各個分片之間不會有重複的數據,全部分片保存的數據之和就是完整的數據集。分片集羣將數據集分佈式存儲,可以將負載分攤到多個分片上,每一個分片只負責讀寫一部分數據,充分利用了各個shard的系統資源,提升數據庫系統的吞吐量。mongodb
用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障shell
mongod配置服務器,存儲了整個 ClusterMetadata,其中包括 chunk信息(配置服務器3.4起須要是副本集)。數據庫
mongos路由器,客戶端由此接入,且讓整個集羣看上去像單一數據庫,前端應用能夠透明使用。小程序
// 建立分片數據和日誌存儲目錄
mkdir -p /data/mongod/s0
mkdir -p /data/mongod/s1
mkdir -p /data/mongod/s2
mkdir -p /data/mongod/log複製代碼
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服務器
mkdir -p /data/mongod/c0
mkdir -p /data/mongod/c1
mkdir -p /data/mongod/c2複製代碼
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服務器
// 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();複製代碼
rs.add("127.0.0.1:27103")
刪除使用:rs.remove("127.0.0.1:27103")
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複製代碼
--configdb是核心配置,表示設定config server的地址列表,格式: 副本集名稱/host:prot,host:prot,host:prot 格式。
// 進入路由服務器
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爲片鍵。
一、建立索引
db.pagelist.ensureIndex({"url":1})複製代碼
二、設置分片
sh.shardCollection("performance.pagelist",{url:1})複製代碼
Mongodb一個chunk默認大小爲64M,當數據量大於64M時會從新建立新的chunk儲存數據。
在zanePerfor使用集羣分片很是簡單,跟單機配置模式是同樣的,只須要更改下端口號便可。
更改以下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,
},
},
};複製代碼
sh.shardCollection("performance.webpages", { "url": "hashed"})複製代碼
詳細的分配規則和性能還在總結和實踐中,調優以後我會放到github中。