Spring Boot MongoDB 可复制集的读写分离

最近项目的一个版本刚迭代上去,然后设备也陆续地接入到了系统中。

设备产生的数据经过解析、处理之后落到了 MongoDB 中,但是才 10w 的数据就导致分页查询非常慢,count 操作也是慢的感人。

上午加了索引之后,从 10 多秒降到了 5 秒左右,但是这个速度还是很慢啊,这 TM 的等到设备都接入进来不就炸了。

然后下午就开始排错,查看代码中的慢查询。

最后发现一个现象就是:通过 Navicat 去查询相同的 find 和 count 语句要比在代码中快了好多倍,客户端的查询才是正常现象。

我就纳闷了,客户端连接的数据库和项目代码中链接的数据库是一致的啊,为鸡毛一个快一个慢呢?

后来问了运维,原来这个买的阿里云的 MongoDB 实例用了可复制集,然后数据库是一主一背。

虽然项目代码中连接的数据库配置和 Navicat 客户端的一毛一样,但是项目代码里面查的是主库,而 Navicat 客户端查的是从库。

然后做了一个实验,把 Navicat 去连接主库,果然,尼玛速度一下就变慢了不少。

这 TM 的,真是坑爹。

不过还好的是,问题算是找到了,前进了一大步。

再来分析一下,连接到主库进行查询操作为啥这么慢呢?主库上我也建了索引啊!

初步分析是,读写操作都集中在了主库上,不光是分页查询的这种读操作,还有其他的不少读操作。而且主库的写操作不少;另外还有 5min 执行一次的定时任务,需要读的数据和写的数据都集中在了主库上。因此这里我分析,可能是主库上的资源争用比较厉害。这个留待后续继续分析。

既然主备都有,为啥不去读从库?

这个需要去了解一下 MongoDB 的可复制集的原理,以及 Spring Boot 是如何配置 MongoDB 读写分离的。

本来今天晚上是准备把主从读写分离配置完了在走的,奈何要赶火车就先放下了,查询慢就慢一点吧,至少没挂且知道原因在哪儿了!

各位晚安!

原文地址:https://www.cnblogs.com/tuhooo/p/11141281.html

时间: 2024-11-06 07:34:27

Spring Boot MongoDB 可复制集的读写分离的相关文章

centos7部署MongoDB数据库复制集(超详细)

centos7部署MongoDB数据库复制集(超详细)重点:复制集概述:复制集实现原理:复制集的应用案例:一.概述:组成:Mongodb复制集(副本集replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主节点和从节点数据的一致性,复制集在完成主从复制的基础上,通过心跳机制,一旦primary节点出现宕

spring+mybatis利用interceptor(plugin)兑现数据库读写分离

使用spring的动态路由实现数据库负载均衡 系统中存在的多台服务器是“地位相当”的,不过,同一时间他们都处于活动(Active)状态,处于负载均衡等因素考虑,数据访问请求需要在这几台数据库服务器之间进行合理分配, 这个时候,通过统一的一个DataSource来屏蔽这种请求分配的需求,从而屏蔽数据访问类与具体DataSource的耦合: 系统中存在的多台数据库服务器现在地位可能相当也可能不相当,但数据访问类在系统启动时间无法明确到底应该使用哪一个数据源进行数据访问,而必须在系统运行期间通过某种条

Mysql高级集群-读写分离Amoeba

一.环境介绍Master-IP:10.0.0.201Slave- IP:10.0.0.202Amobea-IP:10.0.0.203 二.安装JDK# mkdir /Amoeba# tar -xvf jdk-7u40-linux-x64.tar.gz -C /Amoeba/# vim /etc/profileJAVA_HOME=/Amoeba/jdk1.7.0_40export JAVA_HOME PATH=$JAVA_HOME/bin:$PATHexport PATH CLASSPATH=.:

浅谈高性能数据库集群——读写分离

本文主要介绍高性能数据库集群读写分离相关理论,基本架构,涉及的复杂度问题以及常见解决方案. 1 读写分离概述 基本架构图: 2 适用场景 读写分离不是银弹,并不是一有性能问题就上读写分离,而是应该先优化,例如优化慢查询,调整不合理的业务逻辑,引入缓存查询等只有确定系统没有优化空间后才考虑读写分离集群 3 引入的系统复杂度问题 问题一 主从复制延迟 问题二 分配机制 如何将读写操作区分开来,然后访问不同的数据库服务器? 解决方案1 客户端程序代码封装实现 基本架构图 业界开源实现 Sharding

MongoDB之复制集(一)原理篇

参考资料 官网:www.mongodb.org 中文社区:www.mongoing.com 在线教程:https://university.mongodb.com/ mongodb支持传统的master-slave架构.没有自动故障转移功能,需要指定master和slave端.建议使用复制集架构,复制集架构比复制架构更好维护,功能更强. 一.基本概念 复制集是由一组拥有相同数据集的 mongod 实例组成的.其中的一个节点为主节点(Primary),所有的写请求都是在它上面完成的.而其他的节点都

Spring Boot集成Hazelcast实现集群与分布式内存缓存

Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸如Map,Queue,ExecutorService,Lock和JCache等Java的许多开发人员友好的分布式实现. 了解Hazelcast Hazelcast特性 简单易用 Hazelcast是用Java编写的,没有其他依赖关系.只需简单的把jar包引入项目的classpath即可创建集群. 无主从模式 与许多NoSQL解决方案不同,Hazelcast节点是点对点的.

MongoDB之复制集(二)搭建

准备工作 环境: CentOS6.5 64位 MongoDB 3.0.1 64位 一.启动mongod服务 [[email protected] data]# /usr/local/mongodb3.0.1/bin/mongod --port 40144 --dbpath=/data/mongodb3.0.1/data/ --logpath=/data/mongodb3.0.1/log/mongodb.log --directoryperdb --maxConns 100 --logappend

mongodb 分片+复制集

mongodb版本:3.0.4 准备: 1.校验服务器的时间,3台同步 2.关闭防火墙 3.关闭selinux Sharding+Replica Sets 主机 IP 服务及端口 Server A 192.168.31.231 mongod shard1_1:27017 mongod shard2_1:27018 mongod config1:20000 mongs1:30000 Server B 192.168.31.232 mongod shard1_2:27017 mongod shard

Spring Boot MongoDB 简化开发

使用SpringBoot提供的@Repository接口,可以完成曾经需要大量代码编写和配置文件定制工作.这些以前让新手程序员头疼,让有经验的程序员引以为傲的配置,由于框架的不断完善,变得不那么重要,同时,也提升了程序员的工作效率. 本文介绍的是如何通过springboot操作MongoDB. 一.先配置pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin