内容简介:MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。当主节点挂掉之后,会由多个副本节点选举产生出新的主节点。(节点数请保持为基数个)。这样就能保证应用的高可用,其中一个或多个节点挂掉之后还能正常运行和服务。
HI!,你好,我是zane,zanePerfor是一款最近我开发的一个前端性能监控平台,现在支持web浏览器端和微信小程序段。
我定义为一款完整,高性能,高可用的前端性能监控系统,这是未来会达到的目的,现今的架构也基本支持了高可用,高性能的部署。实际上还不够,在很多地方还有优化的空间,我会持续的优化和升级。
开源不易,如果你也热爱技术,拥抱开源,希望能小小的支持给个star。
项目的github地址:
项目开发文档说明:
Mongodb副本集架构
优势:
MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。
当主节点挂掉之后,会由多个副本节点选举产生出新的主节点。(节点数请保持为基数个)。
这样就能保证应用的高可用,其中一个或多个节点挂掉之后还能正常运行和服务。
劣势:
数据丢失:主节点挂掉之后,副本节点选举出新的主节点需要一定的时间,这段时间会造成数据的丢失。
不能完全保证项目的高可用:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,将不能再提供服务。
总结:
在大多数情况下推荐使用副本集架构,副本集架构在保证高可用的同时还能降低服务器成本,相对于集群分片来说配置也更简单,更易于维护,具体选择什么架构需要根据自己的项目来觉定。
Mongodb副本集架构搭建:
Mongodb副本集搭建比价简单,你只需要根据下面的步骤一步一步操作即可(以下内容以 Linux 或mac为例进行搭建)。
一:安装Mongodb (略)
请参考: LINUX系统下安装mongodb
关于副本集搭建还可参考我的另一篇文章: MongoDB主从副本集架构
二:副本集搭建
(备注:鉴于成本,以下内容在单机下部署为例,多机部署只需要替换下IP即可)
1、创建数据和日志存放目录
// 数据存放目录 mkdir -p /data/replication/s0 mkdir -p /data/replication/s1 mkdir -p /data/replication/s2 // 日志存放目录 mkdir -p /data/replication/log复制代码
2、启动 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) } } }复制代码
3、设置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下一步架构:Mongodb集群分片架构。
zanePerfor github地址: github.com/wangweiange…
zanePerfor 开发文档:blog.seosiwei.com/performance…
以上所述就是小编给大家介绍的《zanePerfor前端性能监控系统高可用之Mongodb副本集读写分离架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。