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中。