在当今竞争激烈的市场环境下,成本控制毫无疑问是各个企业提升竞争力非常重要的一个部分,由于众多竞争对手会提供同质化产品和服务,企业必须从控制内部成本做起,做为企业内部开销相对比较大的IT部门,应该首当其冲最大化得挖掘系统的潜力。DBA要引进新方法,新思路,扩展自己的视野,不仅仅局限在数据库维护本身。总的来说,DBA能为这个目标做的事情基本上可以分为系统优化,应用优化,流程优化三个方面。
首先谈到系统优化,这是大部分dba都要接触到的工作。企业定出一个商业目标,IT主管需要把这个商业目标转换成系统的承载能力,要保证系统不会成为拖累。这个目标到了DBA这里,DBA需要把它分成主机与操作系统,存储,数据库3个部分。
主机方面的优化会从硬件选型开始,我们需要确定我们的系统目标容量是什么,需要采购什么硬件能够支撑这个容量,要有可量化的指标,有了可量化的指标后我们可以通过测试得出什么机器能满足性能,最后要综合成本考虑,选定一款能符合目标容量并且性价比最高的机器。由于硬件的升级换代非常迅速,一般2年时间就有新一代主机推出,所以在选择机器的时候只选够用的机器而不去追求一次采购到位,任何高端的机器2年过后必然被更高端的机器所代替。一般来说在企业发展的初期,采用LINUX的pc server是最优化的方案,相比较windows系统,linux系统的长时间运行的稳定性更强,与unix系统相比,linux又体现了经济性。在企业的业务迅速发展后,对系统可用性更高的情况下,我们需要考虑采用UNIX系统的服务器,采用各种高可用方案保证系统的稳定性,为业务发展提供支撑。当系统搭建完毕,我们需要把注意力回到主机和操作系统上,对系统的运行状态持续跟踪,对系统的瓶颈进行优化。
存储方面的优化需要DBA对各种存储体系非常了解,对DAS,NAS,SAN的优缺点要了然于胸。要为不同的应用选取不同的存储方案,举个例子,如果一套系统的对性能的要求不是第一位,但是非常注重经济性,那么DAS可能会是一个好的选择。如果一套系统要求有快速可以移植能力,那么NAS可能将会是首选。如果一套系统追求的是性能,那么SAN可以做为它的解决方案。另外当今各个存储厂商也都提出了自己的数据生命周期管理实现方案,大家的目的也都是为了让用户把最重要的数据放在核心存储上,次要的系统和历史数据可以分布在成本比较低的二级或三级存储上,尽可能为用户节省成本。另外对于存储方面细节的优化我们可以集中到raid的划分,storage read/write cache划分,存储的iops,throughput和cpu utilization,response time的监控。DBA首先要做到能做正确的事(为不同的应用选对合适的系统),其次要能做到正确的做事(关注技术细节,关注性能,把知识合理得运用到优化中去)。
数据库上的优化DBA首先要做的是找到一种阶段化的优化手段,一般来说针对数据库优化都会经过下列步骤
一般来说在企业里面优化目标基本会跟数据库的吞吐量,数据库请求响应时间挂钩。在确定优化目标后,我们可以去查看当前性能,查看数据库性能监控报表,查看数据库的等待事件,查看top n sql,联合操作系统上的性能报表一起定位到瓶颈,然后对这些瓶颈做出相应的优化,再比较优化前后性能的差别,反复这个过程,最终达到优化目标。因为企业的应用系统可能天天在变化,dba必须每天都关注性能问题,优化是一个长期持续的过程,最终目标都是为了发挥出系统的最大能量。
接下来说到应用优化,其实很多时候当系统负载比较高的时候都是因为应用里面有性能很差的sql语句引起的,控制sql语句的质量是dba的头等大事。我自己也曾经帮别人优化过很多系统,通常出现问题的时候都是由于sql语句写的不好,该建立的索引没有建,不需要关联的语句去关联,高并发的全表扫描导致系统负载相当高,这时候一些公司的就会考虑去升级硬件,升级存储,升级主机,通常会选用高出实际容量很多的硬件,能用pc server的去选用小型机,能用小型机的选用rac,实际上如果有一个比较专业的dba,那么经过优化后的系统完全没必要升级,这其中的IT投入都可以省掉。
对于自己开发应用程序的公司,Dba要主动建立sql培训体系,定期给开发人员讲解sql相关知识,最好是把已经出现问题的sql做为案例分析进行讲解,这样效果会比较明显。这样做的目的是因为sql语句是程序员写在应用里面的,很多时候dba等到应用上线后才发现性能有问题的语句,这个时候通常已经给业务系统带来或大或小的影响了,dba需要把问题消灭在开始阶段。当然只有培训是不够的,dba需要借助测试部门的力量把有问题的语句在测试阶段尽量都发现,这样就必定要搭建一套完整的开发数据库和测试数据库,开发库和测试库与产品库的表结构和对象要保持一致,以oracle为例,dba可以自己利用pl/sql脚本对比两个库的数据结构并自动同步,还可以做到从产品库定时同步数据到开发测试库,尽量保证开发测试库数据的有效性,不会因为开发测试库数据的确失导致测试中不能发现有问题的语句。
另外,对应用系统架构的优化也是需要dba参与其中,举个例子,很多时候我们可以在数据库前面做一层cache服务器,保存已经被访问过的页面或者java对象,这个工作将由开发人员去完成,dba可以提供访问最频繁的语句,访问最频繁的对象,然后由开发人员通过程序实现cache这些东西,当应用请求进来,先去cache服务器访问,如果需要访问的页面或对象在cache服务器上已经存在,那么将不需要请求数据库,这样的话数据库的压力会减少非常大,由于cache服务器基本上是由pc sever cluster组成,横向可扩展性比较强而且价格比较便宜,所以当企业发展到一定规模后可以考虑从应用层上添加cache层而不是急于去升级数据库硬件,dba要有这个意识,要能挖掘一切能优化的地方,换个角度去想新方法,新思路,不仅仅局限于数据库本身的优化。
最后说到流程优化,需要有一套完善的体系保证数据库系统的稳定快速运行。从设备选型开始,需要组织一个选型团队,把设备选型当作一个项目在做,需要有DBA(SA),测试工程师,开发人员很多人员组成一个项目团队,需要有PM来负责监督整个项目。
DBA负责数据的准备,测试系统的搭建,测试工程师负责编写测试用例,开发人员负责整理搭建和配置application server,PM协调整个项目的资源和控制项目时间。测试完毕采购完成,DBA要做为PM制定系统升级方案,也是要控制好项目的资源和时间安排,做好和各个相关部门的沟通。硬件上线后需要有测试流程保证程序员开发的应用没有sql方面的问题,只有测试通过才能上线系统。应用发布后DBA要收集有问题的sql,返回给程序员修改这些sql语句,同时针对这些sql对开发人员做阶段性的sql知识培训。DBA团队内部也要建立起培训体系,力求整个DBA TEAM能分享业务知识,提高全体DBA的技术水平。我们所做的这些事情目的都是为了使数据库系统能实现最优化,利用流程规范少犯错,少走弯路,使用最少的资源获得最大的效果。
DBA在现代的企业中不仅仅只是单纯的数据库维护人员,dba要提供高附加值的服务,要利用自己的知识和技能不停的优化系统,减少IT支出,提高企业
竞争力。要做一个优秀的DBA,可持续发展的数据库从业人员,不仅仅要掌握上面说到的掌握操作系统,存储,数据库,良好的沟通技能,项目管理的能力,也要对业界的最新技术有敏锐的嗅觉,具备全局的IT构架规划能力,永远都在不断的学习中成长。