SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客

沙海
沙海
沙海
994
文章
2
评论
2021年4月28日12:06:09
评论
3 2193字阅读7分18秒
摘要

SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)

SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)

SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客

闪耀的瞬间
2018-10-10 15:41:11
SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客
12175

SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客

收藏

16

分类专栏:
java
mongodb
spring boot

版权

SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客
1.MongoDB可以单库、主从(官方现已不推荐)、副本集、分片加副本集,通过分片加副本集可以组成庞大的数据存储集群,而大部分项目使用副本集就能满足需求了
2.MongoDB副本集(Replica Set):有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。
3.副本集环境搭建,请参考 Mongodb安装与设置副本集
4.SpringBoot实现 MongoDB的连接与读写分离操作,这个操作我卡了很久,其实也很简单,就是连接字符串导致的,mongodb在SpringBoot项目的 application.properties文件中连接配置

# MongoDB URI配置 重要,添加了用户名和密码验证
spring.data.mongodb.uri=mongodb://zhuyu:zhuyu@192.168.68.138:27017,192.168.68.137:27017,192.168.68.139:27017/ai?slaveOk=true&replicaSet=zypcy&write=1&readPreference=secondaryPreferred&connectTimeoutMS=300000

#每个主机的连接数
spring.data.mongodb.connections-per-host=50
#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=50
spring.data.mongodb.connect-timeout=5000
spring.data.mongodb.socket-timeout=3000
spring.data.mongodb.max-wait-time=1500
#控制是否在一个连接时,系统会自动重试
spring.data.mongodb.auto-connect-retry=true
spring.data.mongodb.socket-keep-alive=true
12345678910111213

请仔细看好 spring.data.mongodb.uri 的配置,他的格式如下,可以参考mongodb连接

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
1

网上使用uri连接的很多都是错误的,导致我项目代码一直连接不上

我本地MongoDB环境,192.168.68.137是主库,138、139是从库,主库写,从库查

5.代码示例,创建一个 Rest风格的 IndexController ,提供:添加与查询接口,访问这2个接口,看控制台输出,是否查操作自动分配到从库,写操作分配到主库

@RequestMapping("/index")
@RestController
public class IndexController {

    @Autowired private MongoTemplate mongoTemplate;

    @RequestMapping("/getList")
    public List<TestModel> getList(){
        List<TestModel> list = mongoTemplate.findAll(TestModel.class,"test");
        return list;
    }

    @RequestMapping("/add")
    public String add(){
        TestModel model = new TestModel("zhuyu" + System.currentTimeMillis());
        mongoTemplate.insert(model , "test");
        return "success";
    }
}
12345678910111213141516171819

5.1启动项目,测试流程如下:(已先添加了1000条数据)

  • 1先访问 getList
  • 2再访问 add
  • 3然后使用测试工具 jmeter 做并发测试
  • 4最后查看 IEDA的控制台,看请求是否自动把写操作分配到主库,读操作分配到从库

a 访问 getList SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客 b 访问 add SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客 c 工具 jmeter 做并发测试,每1秒100个线程并发 getList读请求,且循环5次,总共500个请求,下面是测试结果 SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客

d IDEA的控制台,第一 getList读请求分配到从库138上,第二个 add写请求分配到主库137上,其他的是jmeter测试工具并发 getList读请求的结果,都是在 138、139从库上 SpringBoot项目开发(二十二):SpringBoot MongoDB实现副本集(读写分离)_zhuyu19911016520-CSDN博客

大功告成,源码下载

MongoDB数据超多之后请使用索引,真实案例,有张表数据超过300万,分页查询超时,设置合理的索引后秒查 如,按时间倒序索引:db.Exception_Info.createIndex({“createDate”:-1}),正序是 1,倒序是 -1

继续阅读
weinxin
资源分享QQ群
本站是一个IT技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: