oracle 随着用户不断攀升遇到性能瓶颈了怎么办?

2018-10-17 23:26:42 +08:00
 gancl

我们的两节点 oracle 查询量多时经常挂掉, 是部署在自建机房或 IDC 的. 了解到阿里云有提供兼容 oracle 的产品 ppas, 但这价格太贵了,相比于免费的不注册的 oracle 来说. 还不能试用,不知道效果不能马上买的. 或者有其他只要能解决我们的痛点的解决方案吗? 我们用机器一年前已经买了 20 万价格的性能的机器. 现在遇到瓶颈了. 切换到 mysql 吗? 工程量可能有点大? mysql 可以解决性能问题吗?

4767 次点击
所在节点    数据库
51 条回复
stabc
2018-10-17 23:30:32 +08:00
转 mysql 未必能解决你的问题,但是一定能得到更多的来自社区的帮助。
FullBridgeRect
2018-10-17 23:35:45 +08:00
买了 oracle 的应该去问 oracle 的技术支持吧?
LeoSocks
2018-10-17 23:37:29 +08:00
@FullBridgeRect 他们没有用 oracle 的授权
msg7086
2018-10-17 23:38:47 +08:00
呃……加钱可及?用 Oracle 了不是明摆着准备掏钱的吗……
gancl
2018-10-17 23:38:47 +08:00
转 postgresSQL? @stabc
liprais
2018-10-17 23:45:24 +08:00
oracle 都解决不了的性能问题,mysql 大概也不行的
pgsql 可能也不行,毕竟单机性能最强的就是 oracle 了
还是先做 profile 看看瓶颈在哪,再想想怎么调优吧
单节点 20 万?
我猜 32 核心 128g 内存这样,性能很不错了
gancl
2018-10-17 23:53:43 +08:00
@liprais 主要还是系统有大批量导数据的功能, 一下子导出了几年的十几万条的数据, 不同的用户会同时在月底时更频繁地操作. 有什么可改进的地方呢?
ShareDuck
2018-10-17 23:57:26 +08:00
@gancl 改成用户预约处理,仅在系统空闲时进行数据批量导出。
gancl
2018-10-17 23:57:41 +08:00
是在 java 里执行 sql 进行导出来的 @liprais
gancl
2018-10-17 23:58:27 +08:00
@ShareDuck 要怎么判断 oracle 空闲呢?
liprais
2018-10-17 23:59:31 +08:00
@gancl
看你应用场景了
1.改成异步队列处理,控制并发
2.预先生成数据文件
gancl
2018-10-17 23:59:37 +08:00
做成 MQ, 导数据的队列, 按顺序执行. 这样对用户就会慢一些,综合体验可能会更好一些 @ShareDuck
gancl
2018-10-18 00:00:51 +08:00
@liprais 预先生成的,如果有涉及到实时的数据产生,就不准了,要怎么更好地解决?
liprais
2018-10-18 00:03:03 +08:00
@gancl
我猜你是月末导出这个月的数据
不会变的数据预先生成,实时的数据异步队列,这样?
gancl
2018-10-18 00:05:53 +08:00
嗯,谢谢! 可能多表查询一有关联到客户表的, 肯定会有实时的. 可能预先生成一个 xls 还不现实, 不同的查询条件. 如果做预生成, 要根据 sql 去把结果缓存到 redis 吗?
annoy1309
2018-10-18 00:07:04 +08:00
1 能否对用户进行分流?比如结算时间部分分到月初?部分用户结算时间分流到月中?
2 能否可以在空闲时对用户往年的历史数据进行预打包,比如我现在先把 8 月,7 月和更之前的数据进行按用户打包(看你的描述只是撑不过月末的峰值,可以在凌晨或者低负载的情况下做)。用户请求下载了,只从数据库里面导 9 月及以后的数据,这样对实况数据准确度也无大影响
likuku
2018-10-18 00:08:40 +08:00
@gancl 要么尝试把用户预约的导出申请,不要立即执行,将申请记录在其它 DB 里,当作一个订单处理,只反馈给用户当前处理进度(排队中,前方还有多少人等待,大约时间)。

这些订单塞入异步队列,使用独立的导出程序,来消化异步队列里的任务,过程里,更新队列状态,队列状态再反馈到用户订单里。

消化异步队列的程序,可以根据机器负载,CPU 核数,多只并行,但保持在机器负载峰值上运行,但不要超载,每只导出任务的异步任务顺利完成后,数据打包,存放好,或者处理成客户需要的格式,给客户订单反馈,并各种手段通知客户可以下载数据。

Oracle 假若可以实现从一个数据源同步出去多台专用导出机器的话,以上消化异步队列程序什么,就可以尝试让它们使用多台镜像的导出 Oracle 机器源,甚至是分布式在独立机器上执行导出任务。

异步化,任务分散化,并行化,分布式。 这几个方向可以考虑下。
gancl
2018-10-18 00:12:21 +08:00
@annoy1309 除了月末 oracle 顶不住外, 平时也有 oracle 挂了的情况,通常就是某些 sql 执行占用的 CPU 或内存太大了影响了其他正常业务, 或是根本不知道什么原因就挂了...
gancl
2018-10-18 00:15:40 +08:00
@likuku 谢谢,我研究一下. 现在数据挂了影响太大了,用户不能访问,所有现场流程走手工纸质流程,电话打爆了
stabc
2018-10-18 00:19:11 +08:00
@gancl 不是转啥的问题,现在应该是支持的问题。数据库本身我更推荐 PG,但是现在中文环境 MySQL 能得到的社区帮助应该更多一些。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/498611

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX