浏览88次
时间:2022年7月28日 09:13
南京信息职业技术学院
摘 要:传统大型关系型数据库中,影响数据库的性能主要有两个方面,一个是软件方面,主另外一个限制数据库性能的是服务器硬件,如何应用现有硬件来大型数据库处理性能呢。通过一套数据库集群软件技术,利用其中的仲裁协调的进程整合普通数据库服务器来提高这个数据库处理能力。
关键词:数据哭瓶颈;数据库集群;脏数据,存储传统大型关系型数据库市面上主流的有三种 Oracle,db2和 sqlserver。影响数据库的性能主要有两个方面,一个是软件方面,主要是指数据库对象比如表索引等是否建的合理,sql 语句是否调优过执行计划是否高效等,软件方面的影响可以通过后期的表结构设计以及对 sql 语句的优化来改进,另外一个限制数据库性能的是服务器硬件,这里我们主要讲这些大型数据库是如何利用现有硬件来提高数据库的处理性能
服务器性能主要是受 cpu、内存、存储设备 io、网络带宽影响。
1、cpu:cpu 频率越高说明数据处理速度就越快,cpu 核数越多大规模并发请求的处理能力就越强;
2、内存:cpu 要处理数据都是从内存获得,内存频率越快和 cpu 交换数据就越快,内存越大可以把越多的数据缓存在内存上,这样用到数据时候不用从硬盘上读取产生 io 也不会因为内存太小要频繁和硬盘交换数据;
3、存储设备 io:数据都是存放在存储设备上,用的时候读取到内存,如果有修改要写入到存储设备(这里的存储设备并不是指单独的物理硬盘,而是指由若干个物理硬盘组成的一个硬件系统有它自己的操作系统和 cache 等,写入数据时候是写入到硬件系统由系统在具体指定存储在那个硬盘上,它可以做到各个物理硬盘的负载均衡,来达到提高整体 io 的结果), 存储设备是最影响数据库性能的,因为它相对 cpu和内存性能是最低的;
4、网络带宽:网络带宽越大,支持在同一时间客户端和数据库交换的数据量就越多,这个比较好理解比如数据库要返回客户端 1G 的数据,带宽只有 100m/ 秒那么数据库要因为传输数据停顿近 10 秒。
随着硬件技术的发展,普通的数据库服务器可以有 4 颗物理 cpu,每颗 cpu 高的可以有 56 个核心(核心数还在不断增加),内存可以达到 512g(甚至更多),高端的服务器可以有更多的物理 cpu 和内存(当然服务器价格不是和 cpu 数量成正例而是几何数量增加的,服务器 cpu 数量越多硬件上架构就越复杂成本就越贵)、网络带宽现在万兆的也很普及,不够的话网络可以通过堆叠的方式增加;唯独存储设备的 io读写性能增加不大还是存在瓶颈,即使是现在由全闪存组成的 ssd 固态硬盘的读写速度相对于内存和 cpu 的速度还是相差很多,而且要知道数据库的特点是所有的改变都要先写日志(日志一定要写才表示事务的完成,具体数据可以只修改了内存上的缓存这称为脏数据,脏数据积累到一定数量再一次写入存储上来减少 io 次数),日志文件是固定的文件,数据库事务多日志文件就存在争用的情况这会引起 io 瓶颈;所以存储设备的 io 吞吐能力是最限制数据库性能的,当然如果没有引起 io 瓶颈普通服务器处理极限也要受 cpu 和内存数量的限制。
如何在现有普通的硬件条件下提高数据库的处理能力,不再受存储设备 io 的限制或者让 io 瓶颈限制最小化;并且有没有可能通过整合多台的普通数据库服务器组成集群,来使整体 cpu 和内存数量增加从而达到提高数据库处理能力。
oracle 和 db2 都提供了这样一种数据库集群软件, oracle的集群软件名字叫 RAC(Real Application Cluster),db2 的软件名称为 Pure Scale。这两款软件具体的表现形式不一样,但是基本的原理都是一样的,它比普通的数据库软件主要是多了一套仲裁协调的进程。整套集群系统可以有 N 台数据库服务器,但它必须只能有一个共享的存储设备,数据库数据就存放在这个存储设备上并且只有这一份,所有的数据库服务器都能联上这个存储设备,也就是说所有的服务器上都有一个数据库实例,所有的实例操作的数据库数据都在共享存储设备上,大家操作的是同一个数据,同时服务器之间通过高带宽的网络连接在一起,具体拓扑结构。
在整个这样的集群环境下,我们访问任意一台数据库服务器数据都是一样的,服务器之间通过网络和数据库集群软件协调整合到一起,平时各个服务器之间各自处理自己的事务,当要处理同一个数据时提交到仲裁协调进程来仲裁谁先用,如果仲裁让 a 机先用,a 机用完把数据通过网络传给 b机内存,b 机在内存上再处理数据,这样只要数据已经缓存在任意的服务器内存上就不会从存储设备上读取减少了 io,通过这样的方式,如果能保持服务器之间减少相同数据的争用,理论上处理能力是各个服务器的总和。每个服务器都有自己的数据库实例,都有自己的日志文件,每个服务器实例对应的日志文件是独立的,互相不干扰就不存在服务器之间争用同一个日志文件的问题。这样的集群数据库系统还可以做到服务器冗余,其中任意一台或多台服务器故障不影响数据库整体正常工作,只是减少了一些处理能力。这个就是rac 和 pure scale 所带来的整合普通数据库服务器来提高这个数据库处理能力的能力。
延续这种集群数据库的思路,我们的应用系统也可以配合这种多服务器集群来展开设计,比如我有 4 台服务器的集群,每台服务器设计上只负责处理每年的一个季度数据(我们只是在使用上区分,实际上每台都可以处理所有的数据),我要查询 2 年的数据,那么应用系统可以设计一个中间件系统,它把 2 年的数据请求分解成 4 个小的查询,到每个服务器获取一个季度的数据然后中间件系统汇总起来返回给客户端,再进一步设计让中间件系统分担数据库的一些计算能力,比如我查询 1 年数据要按照月份统计并进行排序,我们可以延续前面的查询先把所有数据取到中间件上,然后让中间件来对 2 年数据进行按月统计排序工作,这样数据库只是完成了原始数据的查询没有消耗资源进行统计排序计算,整个过程服务器之间没有要处理一样的数据,减少了服务器之间数据争用,同时中间件系统承担了一些计算工作来减轻数据库服务器的计算量,提高了数据库的处理能力。
通过分析数据库在硬件层面存在的瓶颈,我们可以知道,最主要的是存储 io 的吞吐瓶颈,然后是 cpu 频率核心数量内存数量的瓶颈,我们的应用系统也可以参考数据库产商提高的数据库服务器集群的方式来设计应用系统的体系架构,尽量减少数据库的负担,从而增加整个数据库的处理能力。