性能测试:自建数据库对比RDS中应当注意的地方(适用于MySQL,SQL SERVER,MongoDB)

性能测试:自建数据库对比RDS中应当注意的地方

背景

常常很多用户对比测试自建数据库和RDS的性能差异,其测试结果往往是RDS不如ECS自建,用户往往怀疑难道我花了那么多的钱买的RDS难道还不如自己在ECS上搭建?

 

从数据库测试的角度来看,测试首先必须是的公平的进行,其结果才具有说服力。RDS作为一个公共的关系数据库服务,其必须要包括稳定高可用,高安全,然后才是高性能。没有前面的两者,我相信没有多少人愿意去使用即不稳定又不安全的服务。所以RDS在稳定性上必须上主备双节点的,双节点甚至是在不同机房,万一其中一个机房异常还可以快速切换到另外一个机房。其次RDS必须要保证数据的安全,如果你写入提交的一条数据突然不见了,如果突然有一天你的数据库被黑客SQL注入了,你还愿意继续使用RDS吗。作为服务厂商RDS必须为用户考虑数据安全,在数据的存取上RDS加入了中间层,所有的请求经过中间层后如果有SQL注入的请求都会被中间层拦截掉;在底层数据写入上RDS采用了最高安全级别的写入,保证在主机异常掉电的情况下数据不会出现丢失。最后在性能上,RDS源码团队持续对MySQL源码优化,在标准的基准测试中性能和稳定性上都是高于社区版本的。

 

下面我们来总结一下RDS和自建数据库在性能测试中需要注意的地方:

 

一.网络差异

1.可用区

RDS有单可用区和多可用区之分,单可用区是的数据库主备都在同一个机房,多可用区的数据库主备在不同机房,所以在测试RDS的过程中需要保证ECS和RDS是在同一个可用区的。

2.网络链路

从ECS到RDS的网络链路中有多个环节,包括了ECS-->DNS-->SLB-->Proxy-->DB,所以对比ECS自建数据库(ECS-->ECS),RDS的网络链路比ECS自建数据库多出了3个链路环节。

3.案例分析

•1、
某电商系统迁移上云测试过程中发现性能较低

•2、
应用代码,数据库配置完全一样

RDS访问链路:

 

二.配置差异

1.规格配置

RDS的规格配置主要包括了内存和CPU,在测试RDS的过程中,需要保证ECS的CPU核数和RDS的CPU核数保持一致

2.参数配置

  (1).安全配置:RDS的为了保证数据的安全性,在参数配置上采用了事务提交和binlog刷写的最高保护级别。

 
a.innodb_flush_log_at_trx_commit 参数指定了 InnoDB 在事务提交后的日志写入频率,当取值为 1 时,每次事务提交时,log buffer 会被写入到日志文件并刷写到磁盘。这也是默认值。这是最安全的配置,但由于每次事务都需要进行磁盘I/O,所以有一定的性能损耗。

  b.sync_binlog 是 MySQL 的binlog日志同步到磁盘的频率。MySQL在binlog每写入sync_binlog
次后,刷写到磁盘,设为 1 最安全,在每个语句或事务后同步一次 binary log,即使在崩溃时也最多丢失一个语句或事务的日志,但因此也最慢。

 

  (2).性能配置:RDS开放了除规格配置以外的参数供用户进行配置,绝大部分的参数都已经由官方团队优化过,用户不需要过多调整线上的参数就可以把数据库比较好的运行起来。但这些参数只是适合大多数的应用场景,但针对一些特殊用户场景,需要用户进行特殊定制。

 
tmp_table_size

  作用:该参数用于决定内部内存临时表的最大值,每个线程都要分配(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值),如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,优化查询语句的时候,要避免使用临时表,如果实在避免不了的话,要保证这些临时表是存在内存中的。

  现象:如果复杂的SQL语句中包含了group
by/distinct等不能通过索引进行优化而使用了临时表,则会导致SQL执行时间加长。

  建议:如果应用中有很多group
by/distinct等语句,同时数据库有足够的内存,可以增大tmp_table_size(max_heap_table_size)的值,以此来提升查询性能。

 

 
query_cache_size

  作用:该参数用于控制MySQL
query cache的内存大小;如果MySQL开启query cache,再执行每一个query的时候会先锁住query cache,然后判断是否存在query cache中,如果存在直接返回结果,如果不存在,则再进行引擎查询等操作;同时insert、update和delete这样的操作都会将query cahce失效掉,这种失效还包括结构或者索引的任何变化,cache失效的维护代价较高,会给MySQL带来较大的压力,所以当我们的数据库不是那么频繁的更新的时候,query cache是个好东西,但是如果反过来,写入非常频繁,并集中在某几张表上的时候,那么query cache lock的锁机制会造成很频繁的锁冲突,对于这一张表的写和读会互相等待query cache lock解锁,导致select的查询效率下降。

  现象:数据库中有大量的连接状态为checking query cache for query、Waiting for query
cache lock、storing result in query cache;

  建议:RDS默认是关闭query
cache功能的,如果您的实例打开了query cache,当出现上述情况后可以关闭query cache;当然有些情况也可以打开query cache,比如:巧用query cache解决数据库性能问题。

3.案例分析

•1、 某客户正在将本地的业务系统迁移上云

•2、 在rds上运行时间明显要比线下自建数据库运行时间要慢1倍

用户本地参数配置:

join_buffer_size = 128M

read_rnd_buffer_size = 128M

tmp_table_size = 128M

RDS参数配置

join_buffer_size = 1M

read_buffer_size = 1M

tmp_table_size =256K

 

三.架构差异

1.主从复制

RDS采用了主从复制的高可用模式,同时打开了半同步复制,半同步复制是MySQL异步复制的改进,当主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以半同步复制增加了事务的响应时间。

备注:SQLSERVER高可用采用mirror,同样存在上述的问题。

时间: 2024-08-28 21:01:47

性能测试:自建数据库对比RDS中应当注意的地方(适用于MySQL,SQL SERVER,MongoDB)的相关文章

性能测试:自建数据库与RDS性能对比SQL Server案例排查分析

近期经常遇到用户将自建数据库与RDS进行对比,简单的对比结果是自建库比RDS实例查询快.我们这里来看看一个实例,有一家物流公司,刚开始使用RDS SQL Server数据库,发现通过ECS访问RDS实例,执行语句需要60s左右,但是访问ECS本地自建库只需要2-3s.那么RDS是否是真的不如自建数据库呢? 接下来,我们来探讨对比自建库和RDS的正确姿势,如何公平地对比自建库和RDS的性能. 对比自建库和RDS的语句执行性能,下面这些因素必须都考虑到: 1. 可用区和网络链路. 可用区.网络链路的

在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库

server|备份|恢复|数据|数据库 在C#中运用SQLDMO备份和恢复Microsoft SQL Server数据库 SQLDMO(SQL Distributed Management Objects,SQL分布式管理对象)封装了Microsoft SQL Server数据库中的对象.SQLDMO是Microsoft SQL Server中企业管理器所使用的应用程序接口,所以它可以执行很多功能,其中当然也包括对数据库的备份和恢复. SQLDMO由Microsoft SQL Server自带的

从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库

开宗明义,你不应该在阿里云上使用自建的MySQL or SQL Server数据库,对了,还有Oracle or PostgreSQL数据库. 云数据库 RDS(Relational Database Service)是一种稳定可靠.可弹性伸缩的在线数据库服务.基于飞天分布式系统和全SSD盘高性能存储,支持MySQL.SQL Server.PostgreSQL和PPAS(高度兼容Oracle)引擎,默认部署主备架构且提供了容灾.备份.恢复.监控.迁移等方面的全套解决方案. 当然,并不是指所有用户

VC++中使用DB-Library编程(一)(SQL Server)

最近刚学VC++,觉得VC++在访问数据库时不论使用ODBC.ADO,OLE DB或MFC相应类库都感觉有些繁琐,于是并利用VC++将SQL Server提供的DB-Library库作了一些简单的封装,以方便访问MS SQL Server数据库.SQL Server提供的DB-Library库有多个版本,我用的是WIN32平台下的NTWDBLIB.LIB库,这些库和相应的头文件(SQLFRONT.H与SQLDB.H)必须是在安装SQL Server时使用自定义方式选择安装,否则程序无法通过.以下

在存储过程中编写正确的事务处理代码(SQL Server 2000 & 2005)

from:http://www.sqlstudy.com/sql_article.php?id=2008060701 在 SQL Server 中数据库事务处理是个重要的概念,也稍微有些不容易理解,很多 SQL 初学者编写的事务处理代码存往往存在漏洞,本文介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码. 在编写 SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法: begin tran update statement 1 ... update sta

《PowerShell V3——SQL Server 2012数据库自动化运维权威指南》——第2章 SQL Server和PowerShell基础任务2.1 介绍

第2章 SQL Server和PowerShell基础任务 PowerShell V3--SQL Server 2012数据库自动化运维权威指南 2.1 介绍 本章介绍使用PowerShell完成一些基本的SQL Server任务的脚本和代码片段.我们将从简单任务开始,例如,列出SQL Server实例,创建对象,如表.索引.存储过程和函数,让你轻松以编程方式使用SQL Server. 你会发现一些使用PowerShell和SQL管理对象(SQL Management Object,SMO)的方

VC++中使用DB-Library编程(二)(SQL Server)

自从上次在VCKBASE 在线杂志>第三十期刊登了"VC++中使用DB-Library编程(SQL Server)"一文之后,得到了很多朋友的支持和鼓励,有很多朋友提出了宝贵建议,并指出了其中的不足和错误,最近利用业余时间,将原来提供的DBLibrary类重新改写,这次是以动态库(DLL)的方式实现的,在新版的DBLibrary中,有以下变动: 将原有的DBLibrary类细分为以下几个类 CDBError--错误处理类,是所有类的父类 CDBSession--处理连接会话类 C

常用数据库分页sql小结(ORACLE/mysql/sql server)

ORACLE 分页查询sql语句 下面这个效率很低  代码如下 复制代码 SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_FS_RETURN order by id desc) A ) WHERE RN <20; 下面这个效率很高  代码如下 复制代码 SELECT A.*, ROWNUM RN FROM (SELECT * FROM IPAY_RCD_FS_RETURN order by id desc) A

SQL SERVER 2005数据库镜像(3)

因为Server A无法看见见证服务器Server W或者原先的镜像伙伴Server B,因此必须进入disconnected状态并使数据库不可用. Server B和Server W可以组成quorum.Server B无法看见Server A,因此Server B试图成为主服务器并使其数据库联机.因为Server W也看不到Server A,因此同意了Server B. Server B现在有了quorum,担当起会话的主服务器角色,然后还原其数据库. 如果恢复通信连路,Server A能够