如何更高效地对数据库实行虚拟化

虚拟化这股潮流大行其道已经有好几年了。由于众多企业越来越需要节省成本,其增长势头在最近两三年来得尤为迅猛。

虚拟化技术的工作原理如下:把多台机器整合到单单一个硬件上,每个版本的操作系统在各自的虚拟机里面运行。大家经常提到的一个问题是:"这会给以数据库为中心的应用程序的总体性能带来怎样的影响?"回答是,我们从事了大量的基准测试工作,发现确实会带来重大影响。为了明白其中原因,我们就要首先分析一下为什么大家需要进行虚拟化。行业调研公司Gartner和IDC公司一致认为,服务器只有在10%到20%的时间里得到了利用;在80%到90% 的时间里,除了只会增加机房温度外,服务器毫无作为。

虚拟化技术许下的承诺是,可以把这些闲置的计算资源重新利用起来,发挥实际作用,又能让该硬件方面的投资带来回报。我们见过一些公司把数量多达 120个的虚拟机放到单单一个硬件上。不过,知道虚拟化技术对数据访问有什么影响很重要。访问任何应用程序的数据(或者更具体地说,从数据库检索数据)可能会占用很多的CPU和内存资源,在用于数据型应用程序的所有时间中占了多达75%到95%的比重。

当CPU在80%的时间里没有使用时,你拥有闲置的CPU周期,这可以抵消拙劣的算法、拙劣的数据访问代码或拙劣的数据库连接性(JDBC)驱动程序等不足。不过,如果利用率增加到80%或90%,这可能会成为问题。尽管虚拟化技术具有诸多优点,但它也面临自身的限制,尤其是扩展性问题。一旦硬件遇到自身的限制,效率低下的驱动程序或代码就会带来瓶颈,扩展性就会随之急剧下降。

比方说,某家企业可能有一个应用程序在使用应用服务器,该应用程序执行数据访问操作,连接到甲骨文(Oracle)数据库;在100个用户的环境下运行顺畅。我们多次见过这种情况:一旦这个环境进行了虚拟化处理,再也没有剩余的CPU和内存可供使用,这个应用程序会突然开始运行不畅。究其原因,结果通常不是数据访问代码(Hibernate、JDBC、.NET和OBDC等)没有得到高效编写,就是某个中间件(某种驱动程序)编得不够高效,占用了太多的CPU或太多的内存。结果是,在虚拟化环境里面,内存、CPU和磁盘(有时还有网络)的过度使用确实成了一大问题。

10年或15年前,当时硬件速度比较慢、价格又比较贵,代码必须编得更好,或者至少编得更高效。当硬件成本大大降低、速度大大提高后,这个要求却不复存在了。对虚拟化技术而言,同样这些问题再度变得很重要:代码必须更好;算法必须更好;数据库中间件必须更好。实际上,如果要获得虚拟化带来的种种优点,每一个方面都必须做得更好。如果考虑一下扩展性降低问题,缺乏效率的编写方法带来的成本就一目了然。《数据访问手册》(Data Access Handbook)里面讨论的最佳实践对虚拟化取得成功而言甚至更有必要。