MongoDB 建模调优change stream实战

MongoDB开发规范

(1)命名原则。数据库、集合命名需要简单易懂,数据库名使用小写字符,集合名称使用统一命名风格,可以统一大小写或使用驼峰式命名。数据库名和集合名称均不能超过64个字符。

(2)集合设计。对少量数据的包含关系,使用嵌套模式有利于读性能和保证原子性的写入。对于复杂的关联关系,以及后期可能发生演进变化的情况,建议使用引用模式。

(3)文档设计。避免使用大文档,MongoDB的文档最大不能超过16MB。如果使用了内嵌的数组对象或子文档,应该保证内嵌数据不会无限制地增长。在文档结构上,尽可能减少字段名的长度,MongoDB会保存文档中的字段名,因此字段名称会影响整个集合的大小以及内存的需求。一般建议将字段名称控制在32个字符以内。

(4)索引设计。在必要时使用索引加速查询。避免建立过多的索引,单个集合建议不超过10个索引。MongoDB对集合的写入操作很可能也会触发索引的写入,从而触发更多的I/O操作。无效的索引会导致内存空间的浪费,因此有必要对索引进行审视,及时清理不使用或不合理的索引。遵循索引优化原则,如覆盖索引、优先前缀匹配等,使用explain命令分析索引性能。

(5)分片设计。对可能出现快速增长或读写压力较大的业务表考虑分片。分片键的设计满足均衡分布的目标,业务上尽量避免广播查询。应尽早确定分片策略,最好在集合达到256GB之前就进行分片。如果集合中存在唯一性索引,则应该确保该索引覆盖分片键,避免冲突。为了降低风险,单个分片的数据集合大小建议不超过2TB。

(6)升级设计。应用上需支持对旧版本数据的兼容性,在添加唯一性约束索引之前,对数据表进行检查并及时清理冗余的数据。新增、修改数据库对象等操作需要经过评审,并保持对数据字典进行更新。

(7)考虑数据老化问题,要及时清理无效、过期的数据,优先考虑为系统日志、历史数据表添加合理的老化策略。

(8)数据一致性方面,非关键业务使用默认的WriteConcern:1(更高性能写入);对于关键业务类,使用WriteConcern:majority保证一致性(性能下降)。如果业务上严格不允许脏读,则使用ReadConcern:majority选项。

(9)使用update、findAndModify对数据进行修改时,如果设置了upsert:true,则必须使用唯一性索引避免产生重复数据。

(10)业务上尽量避免短连接,使用官方最新驱动的连接池实现,控制客户端连接池的大小,最大值建议不超过200。

(11)对大量数据写入使用Bulk Write批量化API,建议使用无序批次更新。

(12)优先使用单文档事务保证原子性,如果需要使用多文档事务,则必须保证事务尽可能小,一个事务的执行时间最长不能超过60s。

(13)在条件允许的情况下,利用读写分离降低主节点压力。对于一些统计分析类的查询操作,可优先从节点上执行。

(14)考虑业务数据的隔离,例如将配置数据、历史数据存放到不同的数据库中。微服务之间使用单独的数据库,尽量避免跨库访问。

(15)维护数据字典文档并保持更新,提前按不同的业务进行数据容量的规划。

MongoDB调优

三大导致MongoDB性能不佳的原因:

1. 慢查询

2. 阻塞等待

3. 硬件资源不足

1,2通常是因为模型/索引设计不佳导致的

排查思路:按1-2-3依次排查

影响MongoDB性能的因素

​​​​​​https://www.processon.com/view/link/6239daa307912906f511b348

MongoDB建模小案例分析

https://blog.csdn.net/Zhuxiaoyu_91/article/details/144308010

MongoDB性能监控工具

https://blog.csdn.net/Zhuxiaoyu_91/article/details/144283234​​​​​​

性能问题排查参考案例

记一次 MongoDB 占用 CPU 过高问题的排查

https://cloud.tencent.com/developer/article/1495820

MongoDB线上案例:一个参数提升16倍写入速度

https://cloud.tencent.com/developer/article/1857119

MongoDB高级集群架构

两地三中心集群架构

https://www.processon.com/view/link/6239de401e085306f8cc23ef

双中心双活+异地热备=两地三中心

全球多写集群架构

https://www.processon.com/view/link/6239de277d9c08070e59dc0d

MongoDB整合SpringBoot

文档CRUD操作&聚合操作

https://blog.csdn.net/Zhuxiaoyu_91/article/details/144261410

事务操作

官方文档: Transactions - MongoDB Manual

编程式事务

/*** 事务操作API* https://docs.mongodb.com/upcoming/core/transactions/*/@Testpublic void updateEmployeeInfo() {//连接复制集MongoClient client = MongoClients.create("mongodb://fox:fox@192.168.65.174:28017,192.168.65.174:28018,192.168.65.174:28019/test?authSource=admin&replicaSet=rs0");MongoCollection<Document> emp = client.getDatabase("test").getCollection("emp");MongoCollection<Document> events = client.getDatabase("test").getCollection("events");//事务操作配置TransactionOptions txnOptions = TransactionOptions.builder().readPreference(ReadPreference.primary()).readConcern(ReadConcern.MAJORITY).writeConcern(WriteConcern.MAJORITY).build();try (ClientSession clientSession = client.startSession()) {//开启事务clientSession.startTransaction(txnOptions);try {emp.updateOne(clientSession,Filters.eq("username", "张三"),Updates.set("status", "inactive"));int i=1/0;events.insertOne(clientSession,new Document("username", "张三").append("status", new Document("new", "inactive").append("old", "Active")));//提交事务clientSession.commitTransaction();}catch (Exception e){e.printStackTrace();//回滚事务clientSession.abortTransaction();}}}

声明式事务

配置事务管理器

@BeanMongoTransactionManager transactionManager(MongoDatabaseFactory factory){//事务操作配置TransactionOptions txnOptions = TransactionOptions.builder().readPreference(ReadPreference.primary()).readConcern(ReadConcern.MAJORITY).writeConcern(WriteConcern.MAJORITY).build();return new MongoTransactionManager(factory);}

编程测试service

@Servicepublic class EmployeeService {@AutowiredMongoTemplate mongoTemplate;@Transactionalpublic void addEmployee(){Employee employee = new Employee(100,"张三", 21,15000.00, new Date());Employee employee2 = new Employee(101,"赵六", 28,10000.00, new Date());mongoTemplate.save(employee);//int i=1/0;mongoTemplate.save(employee2);}}

测试

@AutowiredEmployeeService employeeService;@Testpublic void test(){employeeService.addEmployee();}

change stream实战

https://blog.csdn.net/Zhuxiaoyu_91/article/details/144311221

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 环境美化

一、终端选择 zsh 参考文章使用 oh-my-zsh 美化终端 Oh My Zsh 是基于 zsh 命令行的一个扩展工具集&#xff0c;提供了丰富的扩展功能。 先安装zsh再安装Oh My Zsh 1.zsh安装 sudo apt-get install zsh 2.设置默认终端为 zsh chsh -s /bin/zsh 3.安装 oh-my-zsh 官网&…

MySQL 在线 DDL 变更的一个异常问题

文章目录 前言1. 模拟现场2. 原因推测3. 如何解决4. 误导报错后记 前言 业务执行一条 DDL engineinnodb 失败了很多次&#xff0c;报错 ERROR 1062 (23000): Duplicate entry xxx for key ‘xxx’&#xff0c;在官方文档中也提到过&#xff0c;Online DDL 期间可能会出现 ERRO…

分布式事务的前世今生-纯理论

一个可用的复杂的系统总是从可用的简单系统进化而来。反过来这句话也正确: 从零开始设计的复杂的系统从来都用不了&#xff0c;也没办法让它变的可用。 --John Gal 《系统学》 1975 1. 事务的概念 百科&#xff1a; 事务&#xff08;Transaction&#xff09;&#xff0c;一般是…

微前端框架micro-app中的数据通信机制

在微前端框架micro-app中&#xff0c;getData方法和addDataListener方法都是用于数据通信的重要工具&#xff0c;但它们在使用方式和功能上存在一些显著的差别。 getData方法 功能&#xff1a;getData方法用于直接获取micro-app框架注入的全局对象window.microApp中存储的数据…

操作系统的文件系统

文件系统的基本组成 ⽂件系统是操作系统中负责管理持久数据的⼦系统&#xff0c;说简单点&#xff0c;就是负责把⽤户的⽂件存到磁盘硬件中&#xff0c; 因为即使计算机断电了&#xff0c;磁盘⾥的数据并不会丢失&#xff0c;所以可以持久化的保存⽂件。 ⽂件系统的基本数据单位…

vue使用百度富文本编辑器

1、安装 npm add vue-ueditor-wrap 或者 pnpm add vue-ueditor-wrap 进行安装 2、下载UEditor 官网&#xff1a;ueditor:rich text 富文本编辑器 - GitCode 整理好的&#xff1a;vue-ueditor: 百度编辑器JSP版 因为官方的我没用来&#xff0c;所以我自己找的另外的包…

浅谈自然语言处理技术(NLP)在银行领域的应用

自然语言处理技术(NLP)通过解析和理解海量非结构化数据,为银行领域提供了前所未有的洞察力和决策支持。这项技术的应用不仅优化了风险管理,还革新了客户服务和市场分析等多个方面。 银行系统中存在大量的非结构化信息,这些信息不仅数据量庞大,而且种类繁多,处理起来相对…

nvm安装指定版本显示不存在及nvm ls-remote 列表只出现 iojs 而没有 node.js 解决办法

在使用 nvm install 18.20.3 安装 node 时会发现一直显示不存在此版本 Version 18.20.3 not found - try nvm ls-remote to browse available versions.使用 nvm ls-remote 查看可安装列表时发现&#xff0c;列表中只有 iojs 解决方法&#xff1a; 可以使用以下命令查看可安装…

算法基础 -- 背包问题类型与算法整理

背包问题类型与算法整理 1. 背包问题类型与描述 背包问题类型问题描述0-1 背包问题每种物品只能选择一次&#xff0c;求如何选择物品使得总价值最大。完全背包问题每种物品可以选择多次&#xff0c;求如何选择物品使得总价值最大。多重背包问题每种物品选择次数有限&#xff…

Linux磁盘存储概念(六)

本文为Ubuntu Linux操作系统- 第六弹 今天开始新的知识点&#xff0c;讲磁盘存储问题 上期回顾&#xff1a;Linux文件、目录权限问题 今天由帝皇侠陪伴大家学习&#xff01;&#xff01;&#xff01; 文章目录 磁盘数据组织低级格式化磁盘分区高级格式化 磁盘设备命名磁盘分区分…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

DApp开发如何平衡性能与去中心化?

DApp的核心价值在于信任、透明和去中心化&#xff0c;但这些特点往往伴随着性能的瓶颈和高成本。在DApp开发中&#xff0c;如何在保证去中心化的前提下提升性能&#xff0c;成为开发者面临的重要挑战。如何实现性能与去中心化的平衡是一个重要课题。 一、为什么去中心化影响性…

计算机网络之NAT、代理服务、内网穿透、内网打洞

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络之NAT、代理服务、内网穿透、内网打洞 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论…

在 Vite 和 Webpack 中处理 SVG 图标:vite-plugin-svg-icons 与 svg-sprite-loader 原理比较

在 Vite 和 Webpack 中处理 SVG 图标&#xff1a;vite-plugin-svg-icons 与 svg-sprite-loader 原理比较 SVG 图标是前端开发中常用的资源&#xff0c;它不仅能提供更清晰的显示效果&#xff0c;还能通过 CSS 控制颜色和大小。随着现代构建工具如 Vite 和 Webpack 的普及&…

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

VUE 搭建一个脚手架

一、安装 Node.js 、 npm、Vue Cli node -v npm -v npm install -g vue/cli vue --version // 查看是否安装成功 二、 创建项目 起名 vue create my-vue-project 三、项目目录 cd my-vue-project npm install // 如果没有自动安装,手动安装下依赖 四、启动项目 n…

Python中的 `string.Template`:用法和使用场景

Python中的 `string.Template`:用法和使用场景 什么是 `string.Template`?`Template` 的基本用法代码解析使用 `safe_substitute`实用场景1. 动态生成消息2. 生成文件内容如何处理复杂场景?总结在Python中,字符串处理是非常常见的任务,其中string.Template提供了一种简单、…

光猫开DMZ教程

本教程以移动光猫未例&#xff0c;具体操作以实际光猫为准 1、登录移动光猫管理后台 打开浏览器&#xff0c;在浏览器地址栏输入移动光猫登录管理地址192.168.1.1或者tplogin.cn 按“回车键”打开登录页面&#xff0c;然后输入路由器管理密码登录。 移动光猫登录页面 超级密…

分数求和ᅟᅠ        ‌‍‎‏

分数求和 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入n个分数并对他们求和&#xff0c;并用最简形式表示。所谓最简形式是指&#xff1a;分子分母的最大公约数为1&#xff1b;若最终结果的分母为…

优秀前端文章笔记----持续更新

AI相关&#xff1a; 【介绍了RAG】万字长文分享AI落地前端实操&#xff0c;带你成为公司最懂AI的前端大佬&#xff01;【介绍了提示词】面向前端人的提示词工程指南【介绍了AI IDE】打造一个 Cursor 只需要三步 工具相关&#xff1a; AI-magic收录了大量国内外AI工具箱&#…