文档章节

AWS AURORA  CPU 100% 的解决方案

Lukewxl
 Lukewxl
发布于 2016/06/20 10:54
字数 915
阅读 237
收藏 0

  最近做了一个系统,是从各个地方按照不同的接口同步订单,底层采用的是Spring JdbcTempalte,支持按预订时间分表存储和查询的功能,使用到了jdbc的BatchUpdate功能.生产环境采用的是AWS,使用的数据库方案是AWS的RDS(Rational DataBase Service),这是我第一次使用RDS.本地环境测试起来一切正常,但是发布到生产环境CPU就飙到100%,且一条直线横到底.

 虽然RDS的服务不会挂,但是系统的性能受到严重的影响.第一次使用AWS的RDS数据库,我简答的认为Amazon Aurora与常用的mysql是一样的,后来查询RDS的文档,才发现有一些不同.

Amazon Aurora 是一个兼容 MySQL 的关系数据库引擎,结合了高端商用数据库的速度和可用性以及开源数据库的简单性和成本效益。Amazon Aurora 的性能最高可达到 MySQL 的五倍,并且能以十分之一的成本提供商用数据库的安全性、可用性和可靠性。

这是http://aws.amazon.com/cn/rds/aurora/上对Aurora的介绍,一直把所有的文档看完,但是还是没有能解决我的问题,通过查询的ShowProcessList和程序的日志上来看,发现系统在执行一些Sql方面有严重的性能问题.

比如根据订单号删除订单的同步任务.

delete from res_id_list_for_fetch  where ersp='XXX' And source='yyyy'

这条语句居然会死锁,执行SQL时,如果指定了主键,那么速度是最快的,主键是唯一的,所以只需锁定这一行记录即可,但是上面的SQL里面,是有3kw的数据量的基础上执行的,而且没有索引,所以直接锁定了整个表,在40个线程并发执行的情况下,出现死锁就不足为奇了.所以解决方案也是很简单,对ersp和source建立索引.

同时,在执行BatchUpdate时,slowlog的日志也显示有性能问题,在stackoverflow 上看到有位仁兄也遇到过这样的问题

http://stackoverflow.com/questions/2993251/jdbc-batch-insert-performance 

根据上面的解决方案,在jdbc的url上加入参数

?useServerPrepStmts=false&rewriteBatchedStatements=true"

默认的情况下,rewriteBatchedStatements是false,这个参数的设置的解释如下

I'd like to expand on Bertil's answer, as I've been experimenting with the connection URL parameters.

rewriteBatchedStatements=true is the important parameter. useServerPrepStmts is already false by default, and even changing it to true doesn't make much difference in terms of batch insert performance.

Now I think is the time to write how rewriteBatchedStatements=true improves the performance so dramatically. It does so by rewriting of prepared statements for INSERT into multi-value inserts when executeBatch() (Source). That means that instead of sending the following n INSERT statements to the mysql server each time executeBatch() is called :

INSERT INTO X VALUES (A1,B1,C1)
INSERT INTO X VALUES (A2,B2,C2)
...
INSERT INTO X VALUES (An,Bn,Cn)

It would send a single INSERT statement :

INSERT INTO X VALUES (A1,B1,C1),(A2,B2,C2),...,(An,Bn,Cn)

You can observe it by toggling on the mysql logging (by SET global general_log = 1) which would log into a file each statement sent to the mysql server.

按照以上的解决方案,该建立索引的建立索引,连接参数也修改了,部署到生产环境,后来观察,cup一直稳定在3%.问题得到解决.

总结 对于经常使用的查询字段,该建立索引的还是要建立索性,血的教训. 

© 著作权归作者所有

共有 人打赏支持
Lukewxl
粉丝 4
博文 23
码字总数 8511
作品 0
浦东
高级程序员
私信 提问
加载中

评论(1)

小白小霸王
小白小霸王
不知道 如果本地的mysql 在同样的并发下是不是也有问题呢
做云计算时代的数据库 Amazon Aurora成就数据之美

云计算时代就应该有云数据库。 19世纪,爱马仕还是一家专门制作各种精美马具的作坊,但到了20世纪,汽车逐渐取代马车,爱马仕不得不从马具转向皮具,从而成就了这一世界级奢侈品品牌;1975年...

常言道_
2018/11/05
0
0
Aurora: 来自 Amazon 的高性能的企业级关系数据库,兼容 MySQL

Aurora:来自Amazon、高性能的企业级关系数据库,且兼容MySQL 近日,在美国召开的AWS re:Invent云计算大会上,Amazon高级副总裁安迪·杰西发布了企业级关系数据库Aurora。Aurora是一个面向Ama...

亚当李
2014/11/15
4K
4
亚马逊发布兼容 MySQL 的数据库引擎 Aurora

新浪科技讯 北京时间11月13日凌晨消息,在今日美国拉斯维加斯召开的云计算大会AWS re:Invent大会上,亚马逊发布了新的数据库引擎Amazon Aurora。这是一个面向亚马逊关系数据库的、兼容MySQL...

阿水plus
2014/11/13
1K
6
Amazon Aurora 升级, 兼容 PostgreSQL

据亚马逊 AWS 博客发文称,他们在昨天发布了兼容 PostgreSQL 的 Amazon Aurora 预览版。 这里有一些您会喜欢的东西: 性能 — Aurora 提供的性能是传统环境中运行的 PostgreSQL 的 2 倍 兼容...

局长
2016/12/01
2.7K
5
一篇文章带你看懂AWS re:Invent 2018大会,揭秘Amazon Aurora

本文由云+社区发表 > 本文作者: 刘峰,腾讯云NewSQL数据库产品负责人。曾职于联想研究院,Teradata北京研发中心,从事数据库相关工作8年。2017年加入腾讯数据库产品中心,担任NewSQL数据库产...

腾讯云加社区
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud搭建微服务架构----流量回放

前言 系统微服务化后,传统的自测/测试方式都变得比较困难: 依赖的服务可能不稳定。 服务无法提供期望的响应数据。 缺少场景构造标准。 随着整体业务越来越复杂,微服务依赖的越来越多,测试...

春哥大魔王的博客
33分钟前
3
0
记一次springboot模块配置问题导致读取Apollo配置中心配置文件始终错误的问题

现在正在做的一个项目采用的是微服务,主框架是spring cloud,配置中心用的是携程的Apollo。 项目下有多个服务,在测试服务器上启动用户服务的时候发现在eureka中心另一个服务被启动了,尝试...

zcqshine
33分钟前
6
0
流处理和批处理框架的异同

分布式流处理需求日益增加,包括支付交易、社交网络、物联网(IOT)、系统监控等。业界对流处理已经有几种适用的框架来解决,下面我们来比较各流处理框架的相同点以及区别。 分布式流处理是对...

hblt-j
37分钟前
4
0
spring cloud 面试题

什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立的spring引用程序 main方法运行 嵌入的Tomcat 无需部署war文件 简化...

狼王黄师傅
38分钟前
4
0
前嗅ForeSpider教程:采集黄页88

以黄页88为例,采集当前列表页新闻的正文数据: 第一步:新建任务 ①点击左上角“加号”新建任务,如图1: 【图1】 ②在弹窗里填写采集地址,任务名称,如图2: 【图2】 ③点击下一步,选择进...

forespider
43分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部