数据库读写分离是什么意思

JAVA开发在高并发访问下,数据返回速度很慢,有些甚至一直在转圈,该怎么解决,麻烦大神们给些帮助。

老实说,你列出的几点都很实用。
我之前在XX电商项目中也遇到过类似的情况。
当时上线第二天系统就崩溃了,数据返回就像按慢放键一样慢。
在我们的调查过程中,我们发现了一些可以与您讨论的关键点。

首先我们来谈谈数据库索引。
让我特别惊讶的是,当我查看用户命令时,运行 SQL 花了 3 秒。
后来我看到订单表的创建时间字段没有勾选。
说实话,这很常见——在成长过程中,你会认为“你现在不需要它”,但一旦它上线,它就成为人们谈论的话题。
更改索引后,相同的查询在 5 0 毫秒内下载完毕。
因此,指标的建立不仅需要具体问题具体分析。
例如,对于价格范围查询,使用B树索引是不切实际的,因此应该使用范围索引。

缓存更有趣。
我们使用 Redis 来缓存产品详细信息,结果是立竿见影的。
然而,有一个陷阱需要注意——缓存损坏。
有一次系统在半夜突然崩溃了。
我发现一个流行产品的缓存已经过时,进入数据库检索整个计算机类数据。
后来我们添加了互斥锁。
虽然代码有点复杂,但是系统很稳定。
我记得当时有一个统计,6 0%的查询直接命中缓存,节省了大量的数据库负载。

读写分离是必须的。
我们当时的主库配置是3 2 核+2 5 6 G内存,从库是1 6 核+1 2 8 G。
导致主库CPU高峰时提升到9 5 %,SQL执行时间从2 00ms提升到8 00ms。
将读操作卸载到从库后,主库的负载明显降低,整体响应时间减少了一半。
但需要注意的是,与操作相关的事务仍然必须经过主数据库,并且该区域必须保持独立。

改进 SQL 需要努力。
编辑代码后发现原来的接口是1 0级嵌套查询,最后改为分级查询+临时查询更改了表,性能提高了一倍。
需要明确的是,SQL 优化不是玄学。
运行几次 EXPLAIN 并查看执行计划比什么都不做更有效率。

对于跟踪,我们使用Prometheus+Grafana来实时查看不同的指标。
最令人惊讶的是内存泄漏,系统开始疯狂GC,CPU利用率高达1 00%。
幸好监控系统提前报警,我们半夜就起来做了。
我对此有点极端。
监测要详细,所有重要指标都应包括在内。

最后,我们来谈谈硬件。
我们尝试升级CPU,但发现瓶颈是I/O,所以最后加了几块高速SSD才可以正常工作。
不过这个东西需要很大的投入,所以还是量力而行吧。
我记得当时采购经理带我去喝茶,但我是在做完性能测试报告后才可以这样做的。

这些计划应结合使用。
例如,在我们的系统中,商品详情接口采用缓存+索引+从数据库读取的方式,订单创建接口直接处理主数据库事务。
没有养老金,要看生意情况。
您提到的负载平衡也很重要。
我们使用Nginx,反向代理后请求分布非常均匀。
但要注意健康控制。
如果死服务器占用了端口,那就糟糕了。

我个人没有在这个环境下跑过Cloud Native架构,但是感觉K8 s+StatefulSet读写分离更方便?但必须考虑云服务器运维成本。
我注意到数据位于X区域,但我建议您检查每个解决方案在特定条件下的成本效益。

数据库读写分离这个坑,让刚入职的我一脸懵逼!

哈,你的问题很具体。
将数据库读写分离确实是一项技术任务。
让我告诉你。

您提到的情况是上周一位客户报告的。
新规则上线后,数据库中查不到数据。
那么根本原因就是主从同步存在延迟。
想一想,主库负责写,从库负责读。
数据从主库传输到从库。
其间,必须使用网络并进行处理。
一定有时间差。

比如我2 02 3 年在上海的项目,他们制定了一个推广规则,凌晨三点上线。
结果,有用户在3 点05 分查看了订单信息,却无法从数据库中找到最新的规则。
这个延迟可能是一两分钟,甚至更长,取决于具体情况。

如何解决?您列出的计划都非常全面。

首先是“忍法”,也就是你们所说的“最坏情况暂时不遵守”。
这个适合实时性要求不高的场景,比如日志等。
反正如果业务上你能接受的话,很简单,什么都不用做。
但如果你正在开发支付系统,这个方法肯定行不通。

第二,写数据同步方案,变同步为同步。
这样做的好处是保证稳定性,但缺点是写操作会慢很多,吞吐量上不去。
我在北京的一个电商项目上尝试过。
当时业务方压力很大,所以最终没有使用这个方法。

第三种是强制选读。
订单、支付等关键操作直接从主数据库读取。
这样虽然简单,但是只是增加了主库的负载,白白的交给了从库。
这取决于你的资源。

第四种和第五种,中级程序和记忆课程。
这两个比较复杂,需要搭建一个中间件或者内存系统来帮你判断。
好处是可以玩得开心,尤其是在一些复杂的业务中。
但缺点是系统较复杂,开发和维护成本较高。
我在深圳做的一个项目,用到了中间件,调试起来头疼了好几天。

总的来说,没有灵丹妙药。
这取决于你的分数。
如果企业能够容忍,就使用“容忍法”。
如果业务需要很强的可持续性,那么就取决于资源,是增加资金和设备,还是开发更复杂的设计。
不管怎样,你可以理解,我还在思考这个问题。

如何实现Oracle数据库的读写分离