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 开发文档: