RDS最佳实践(一)—如何选择你的RDS
在去年双11之前,为了帮助商家准备天猫双11的大促,让用户更好的使用RDS,把RDS的性能发挥到最佳,保障双11当天面对爆发性增加的压力,不会由于RDS的瓶颈导致系统出现问题,编写了
				RDS的最佳实践
			。该文档的内容全部出自于生产实践,但由于篇幅的限制,我只是把其中的概要罗列到了ppt中,并没有展开详细的介绍,后续计划写一个系列,把ppt中的内容进一步展开来讲一讲,也算是对RDS用户的一个交代。
我该如何选择RDS?我要购买多大规格的RDS?RDS的连接数,iops指的是什么?上诉这些问题相信是每一个RDS用户在开始使用的时候都会有这样的疑问。首先我们要了解一下RDS的组成包括哪一些,从阿里云官网的购买页面中我们可以看到RDS包括了以下参数:数据库类型,版本,存储空间,规格:内存+连接数+io,地域,那我们就一个个来分析一下:
一.数据库的类型:
				
RDS目前支持的数据库类型有两种:mysql,sqlserver,为什么这里要特别提出来讲一讲?原因有以下两个方面:
				
a.由于受到sqlserver和windows license的影响,sqlserver价格会比mysql高出近50%,一个2G Mem+50GB Disk的Mysql一年的价格是:4480 RMB;一个2G Mem+50GB Disk的Sqlserver一年的价格是:6420 RMB; 
b.sqlserver处于闭源状态,在出现异常疑难问题排查的时候,往往需要借助微软官方的帮助,同时RDS如果想在sqlserver上面定制出一些自己特色的功能时候,往往其封闭的协议让RDS望而退步;相对于mysql的开源而言,RDS依托了阿里强大的mysql内核开发和运维经验,能够很好的定制出一些RDS自己的特色功能,在出现疑难问题上能够迅速的进行debug排查。
				
在阿里的电商云平台聚石塔,已经有大量的isv,商家正在改造自己的后台系统从sqlserver转向的mysql,你还在犹豫什么?
二.数据库的版本:
				
RDS mysql目前支持5.5和5.1两个版本,sqlserver支持2008一个版本,通常在高版本中会:修复掉低版本中一些bug提高系统的稳定和安全性,优化改进低版本的设计提升系统的性能,推出一些新的功能丰富提升系统的易用性。所以这里我们我们以mysql为例,看一看在5.5与5.1相比较有哪些改动:
				
1)默认存储引擎更改为InnoDB 
2)提高性能和可扩展性
				
. 提高了默认线程并发数(innodb_thread_concurrency) 
. 后台输入/输出线程控制(innodb_read_io_threads、innodb_write_io_threads)
				
. 适应性散列索引(Hash Index)控制,用户可以关闭适应性散列功能
				
. 插入缓冲(Insert Buffering)控制,用户可以关闭innodb的插入缓冲功能
				
. 恢复组提交(Restored Group Commit)
				
. 多个回滚段(Multiple Rollback Segments),之前的innodb版本最大能处理1023个并发处理操作,现在mysql5.5可以处理高达128K的并发事物,
				
. 改善了日志系统互斥和单独刷新(Flush)列表互斥
				
. 改善清除程序进度,在mysql5.5中清楚操作线程是独立的线程,并支持并发,可以使用innodb_purge_treads配置。
3)提高实用性
				
. 半同步复制(Semi-synchronous Replication)
				
. 复制Heartbeat 
. 中继日志自动恢复(Automatic Relay Log Recovery)
4)提高易管理性和效率
				
. 建立快速索引(Faster Index Creation)
				
. 高效的数据压缩(Efficient Data Compression)
				
. 为大物件和可变长度列提供高效存储
				
. 增加了INFORMATION_SCHEMA表,新的表提供了与InnoDB压缩和事务处理锁定有关的具体信息
				
. 支持utf8mb4字符集
5)提高可用性
				
. 新的表/索引分区选项。MySQL5.5将表和索引RANG和LIST分区范围扩展到了非整数列和日期,并增加了在多个列上分区的能力。
6)改善检测和诊断
				
. Mysql5.5引入了一种新的性能架构(performancn_shema,P_S),用于监控mysql监控服务器运行时的性能。
有了这么多功能的改进提升,还有什么理由不使用5.5.
三.存储空间:
				
在RDS的工单问题中,空间问题的咨询应该可以算得上是top 5,当RDS的实际使用空间超过了购买的空间后,实例就会被锁定了,这样就会导致应用无法再写入,更新数据,造成应用的报错,在RDS的控制台中可以设定空间的报警阀值,当实例空间到达报警阀值后用户就会收到报警短信,这个时候用户则需要对判断当前的空间增长是否合理,如果合理的增长则需要对实例的进行弹性升级,如果增长不合理,则需要进行快速的判断。所以在这里我们就需要了解RDS的空间组成到底包括了哪些?
RDS的实例空间主要包括了:数据文件,日志文件,其他文件(包括系统文件,临时文件)
下面我们来详细介绍一下这些文件组成:
- 数据文件:顾名思义该文件空间则是指的存放用数据的文件,对应到数据库中就是一张张的表,表的组成主要包括:数据和索引两类,所以当你看到你的数据文件占用实例的空间非常多的时候,你需要看一下到底是哪一张表占用了我的空间,RDS在控制台中提供了:性能优化–>大表优化的性能报表,用户则可以在这里找到系统中占用最大的文件。但是凡事需要未雨绸缪,我们在设计应用的时候,就要考虑未来数据的增长趋势(数据的生命保留周期),合理的设计数据的存放位置(存放文件or数据库),存储格式(数据类型,字段大小),存放方式(存储引擎选择,分区还是分表)。下图的案例案例中,数据空间占用了实例大量的空间,用户可以通过排查数据库中到底是哪一张表占用导致的(可以参考性能优化–>大表优化)

 - 日志文件:RDS采用的主备M-M的高可用架构,其主备之间的数据同步依靠日志的方式,mysql:binlog,sqlserver:transaction log;同时RDS支持将实例恢复到任何一个时间点,这个功能需要依靠运用备份和日志。为了减少日志空间对用户的空间的占用,RDS mysql会定时的把日志备份到oss中,然后再将其清除,这样用户需要下载RDS日志的时候可以从oss中获取;对于sqlserver,rds对定期的对数据库进行备份,然后将事务日志进行回收。当日志空间出现异常的时候,如下图,由于应用写入数据压力过大,导致binlog日志增加的速度大于了RDS上传到oss的速度,造成了binlog日志增长迅猛,这时候需要用户对数据库的update,insert,delete进行优化,减小对数据库的变更操作:

 - 其他文件:
a.系统文件,每个数据库在安装的时候会初始化一些系统文件,这些系统文件是数据库正常运行的前提,mysql:ibdata1,ib_logfile0,sqlserver:MSDBLog,master.mdf,下面的这幅图反映了RDS"其他文件"占用达到了非常多的问题,可以参考blog:
ibdata1文件持续增加的问题定位 

b.临时文件:通常可以理解为数据库做一个大的操作,由于内存不足,数据库需要将内存中的文件写到磁盘上,这样则有可能导致临时文件写的非常大,通常出现这种情况的时候,数据库在做大的排序操作(order by,group by),由于内存不足,需要将数据刷写到临时文件中,下图的案例中,由于数据库中一条order by的语句频繁的执行,但是排序的sql没有索引,导致了临时文件的频繁写操作:

Ps.RDS已经计划在idb中集成实例的空间诊断这个功能,帮助用户分析实例空间的使用,诊断问题的根源。
四.实例规格:
				
不同的RDS实例规格提供了不同的性能指标,可以参考RDS不同规格的
测试报告 。如何选择RDS的规格,由于该选项会直接关系你的应用是否在RDS上正常的运作起来,同时还关系成本的问题,所以深刻的理解这些参数,有助于你更好的使用RDS,更低成本的使用RDS。下面来分析一下RDS规格中这3个关键指标:
- 内存(mem):内存是实例的核心指标之一,比如2400M Mem内存的实例,内存参数大小配置在实例的参数文件中,限定了实例能够使用的内存大小为2400M。由于内存的访问速度远远大于磁盘,所以通常情况下,内存中缓存的数据越多,数据库的响应就越快;如果内存较小,当数据超过一定量后,就会被刷新到磁盘上,如果新的请求再次访问该数据,就要从磁盘上把它从磁盘中读取进内存,消耗磁盘io,这个时候数据库响应就会变慢。
 - IOPS:刚才提到数据从磁盘读取到内存,或者数据从内存写到磁盘都需要消耗io,而磁盘的io能力是有一定,比如新1型提供的iops为150个,也就是每秒能够提供150次的随机磁盘io操作,所以如果用户的数据量很大,内存很小,而写入,更新,删除,查询的压力很大,由于iops的限制,对于数据库来说就是一条sql需要执行很长的时间才能返回结果,对于应用来说就会造成整体响应的变慢;
 - 连接数:连接数是数据库中的一个概念,在RDS中的连接数是指用户最多能够创建多少个连接。用户的连接数使用的多少取决于用户的连接类型,例如用户使用了连接池管理连接的长连接应用(如java类应用),在连接池中配置的最大连接数为100,那么在RDS中看到的连接数应该为:app服务器×100;对于短连接的应用而言(如php应用,C/S结构的应用),一个请求到到数据库,就会产生一个连接,当请求完毕后就会释放连接。当用户使用的连接数超过了实例规定的连接数后,RDS会直接抛错给应用,mysql:too many connections,sqlserver:Logon failed for login ‘u_xxxx’ due to trigger execution.
 
可以看到上面的3个核心指标都能够直接影响用户使用,下图展示了不同规格能够达到的QPS指标,该测试报告采用标准的sysbench oltp(读写混合)测试模型,可以作为每种实例规格的吞吐能力的参考,用户可以根据自己的业务压力来选择合适的实例规格:
五.地域选择:
RDS的集群主要分布在杭州和青岛两个地域,用户往往采用SLB+ECS+RDS的架构,所以保持着三者在同一个地域就可以了,杭州到青岛的网络访问延迟大概在20ms左右,所以应当避免跨地域的访问情况。
原文链接:http://www.tuicool.com/articles/MJzuIn
RDS最佳实践(一)—如何选择你的RDS的更多相关文章
- [翻译] API测试最佳实践 - 身份验证(Authentication)
		
API测试最佳实践 - 身份验证 适用等级:高级 1. 概况 身份验证通常被定义为是对某个资源的身份的确认的活动,这里面资源的身份指代的是API的消费者(或者说是调用者).一旦一个用户的身份验证通过了 ...
 - API测试最佳实践 - 身份验证
		
适用等级:高级 1. 概况 身份验证通常被定义为是对某个资源的身份的确认的活动,这里面资源的身份指代的是API的消费者(或者说是调用者).一旦一个用户的身份验证通过了,他将被授权访问那些期待访问的资源 ...
 - 阿里云RDS for SQL Server使用的一些最佳实践
		
了解RDS的概念 这也是第一条,也是最重要的一条,在使用某项产品和服务之前,首先要了解该产品或服务的功能与限制,就像你买一个冰箱或洗衣机,通常也只有在阅读完说明书之后才能利用起来它们的所以功能,以及使 ...
 - paip.提升效率--gui 的选择--swing最佳实践swt awt
		
paip.提升效率--gui 的选择--swing最佳实践swt awt ////////////////弹出消息框. ////////////////myeclipse swing 开发最佳实践.. ...
 - python高级编程之选择好名称:pepe8和命名最佳实践
		
# # -*- coding: utf-8 -*- # # python:2.x # __author__ = 'Administrator' # my_list=['a','b','c','d'] ...
 - atitit.报告最佳实践oae 和报告引擎的选择
		
atitit.报告最佳实践oae 与报表引擎选型 1. 报表的基本的功能and结构 2 1.1. 查询设计器(配置化,metadata in html) ,anno 2 1.2. 查询引擎 2 1.3 ...
 - atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml
		
atitit.手动配置列表文件的选择and 数据的层次结构 attilax总结最佳实践--yaml 1. yaml是个好的选择.. 1 2. 数据的层次结构--结构:hash,list,和block ...
 - 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践
		
确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...
 - Atitit..文件上传组件选择and最佳实践的总结(2)----HTTP
		
Atitit..文件上传组件选型and最佳实践总结(2)----断点续传 1. 断点续传的原理 1 2. 怎样推断一个插件/控件是否支持断点续传?? 1 3. 经常使用的组件选型结果::马 1 4. ...
 
随机推荐
- 每日Linux命令(1)-date
			
显示日期指令:date 1.如果想知道Linux系统的时间,那么可以在shell终端直接输入date命令,时间就会反白显示在终端. ysxy@ubuntu:~$ date Tue Aug :: CST ...
 - 从SAP顾问猝死事件谈顾问加班
			
今天朋友圈盛传一则消息,说是南瑞集团的一名名为牛耕耘的SAP顾问因为工作强度大,连续不分昼夜加班而猝死在工作岗位上,遗留下年迈的父母.体弱的妻子.刚满周岁的孩子和巨额的债务.我无法证实该消息的真伪,但 ...
 - 关于mac下配置mysql心得
			
PS:配置一个mysql烦了一天,不过还是有所收获. 首先,下载安装我就不多啰嗦了.关键是在我们安装的最后会有一个临时密码,例如我的PBxsy=ES71(u: 这是非常重要的信息,如果没有得到的话,建 ...
 - Java入门——(1)Java编程基础
			
Java入门--(1)Java编程基础 第二章 Java编程基础 JAVA 代码的基本格式: 修饰符 class 类名{ 程序代码 } 2.1关键字:赋予了特殊含义的单词. 2.2标识符: ...
 - 查看oracle版本信息
			
查看oracle的版本信息 (1)用客户端连接到数据库,执行select * from v$instance 查看version项 (2)select * from produc ...
 - JavaScript版—贪吃蛇小组件
			
最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...
 - yum和apt-get的区别
			
一般来说著名的linux系统基本上分两大类: 1.RedHat系列:Redhat.Centos.Fedora等 2.Debian系列:Debian.Ubuntu等 RedHat 系列 1 常见的 ...
 - Myeclipse详细使用教程
			
Myeclipse详细使用教程.. /*+Shift+Enter(生成多行注释) /**+Shift+Enter(生成文档注释)-----------------问题:在编辑jsp的时候,如果光标移动 ...
 - Educational Codeforces Round 27 补题
			
题目链接:http://codeforces.com/contest/845 A. Chess Tourney 水题,排序之后判断第n个元素和n+1个元素是不是想等就可以了. #include < ...
 - emacs命令记录
			
C-代表按住Ctrl键 M-代表按住Alt键,也可以用按一下ESC放开代替 最先要记住的 M-x <cmd> 输入指令执行,在输入时用Tab可以自动补全或列出项目 C-g ...