1、为什么要设计成分布式数据库,数据为什么要分区?
当数据量很大的时候,即使服务器在没有任何压力的情况下,某些复杂的查询操作都会非常缓慢,影响了最终用户的体验。
在大数据量下对数据库的装载与导出,备份与恢复,结构的调整,索引的调整等都会让数据库停止服务或者高负荷运转很长时间,影响了数据库的可用性和可管理性。
这个时候靠提升服务器的硬件配置是起不到作用的,只有靠分区把数据分成更小的部分才能提高数据库的可用性和可管理性。
通过分区把各部分数据放到不同的机器中,每次查询可以由多个机器上的CPU,I/O来共同负载,通过各节点并行处理数据来提高性能。
分区的方法
Moebius for SQL Server支持两种分区方式:Hash分区和线性分区。
Hash分区
Hash分区是将表按某一字段的值均匀地分布到若干个指定的分区中。
优点:每个分区内分配的数据比较平均,承载的压力也就比较平均,机器能够比较充分的利用。
缺点:不容易扩展,如果扩展新的分区会涉及到数据的重新分配,因此上在设计的时候要提前的规划好。
Moebius for SQL Server支持把多个分区数据放在一个机器上然后再根据压力逐个的拆到新机器中去,这样既可以保证了分区的规划又不浪费机器,实现了线性扩展;
线性分区
线性分区也称范围分区,将表按某一字段的取值范围进行分区,比如按照时间每个月的数据在一个分区中。
优点:扩展性能比较好,因为数据的增长是有一定规律的。
缺点:每个分区内的数据或者压力不是很平均,大部分的业务可能都是越老的数据被访问的频率越低,这样老的分区的压力就比新分区承载的压力低,从而使机器的利用率不高。
Moebius for SQL Server支持把多个分区数据放在一个机器上,所以可以通过新老分区的交替使用来提高机器的利用率。
当前SQl Server上出现的一些将数据库拆分的技术
分区表
SQL Server 2005引入的分区表技术,让用户能够把数据分散存放到不同的物理磁盘中,提高这些磁盘的并行处理能力,达到优化查询性能的目的。但是分区表只能把数据分 散到同一机器的不同磁盘中,也就是还是依赖于一个机器,不能从根本上解决问题。理想的解决办法是把数据分散到不同的机器中,通过多个机器上的 CPU,I/O的并行处理来提高性能。
分布式分区视图
分布式分区视图允许用户将大型表中的数据分散到不同机器的数据库上,用户不需要知道直接访问哪个基础表而是通过视图访问数据,在开发上有一定的透明性。但 是并没有简化分区数据集的管理、设计。用户使用分区视图时,必须单独创建、管理每个基础表(在其中定义视图的表),而且必须单独为每个表管理数据完整性约 束,管理工作变得非常复杂。而且还有一些限制,比如不能使用自增列,不能有大数据对象。另外经过实际测试,对于符合分区规则的查询性能还可以,对于全局查 询并不像我们预期的那样,是并行计算,有时还不如不分区的响应快。
库表散列
一些大公司也在自己开发基于库表散列的数据库架构,比如My Space经过数次数据库升级,最终采用按照用户进行的库表散列,微软为MSN/Hotmail和纳斯达克开发的数据依赖型路由(Data-Dependent Routing,DDR)。但是这些都是基于自己业务逻辑进行的,没有一个通用的实现。客户在实际应用中要投入很大的研发成本,面临很大的风险。
Moebius for SQL Server分布式网格集群
Moebius for SQL Server 在结构上分为数据层数据库和访问层数据库两部分。
从图中可以看出,下面的像网格一样的机器叫数据层,数据层中每个机器上存储着数据全集的一个分区,每一横行组成一个数据全集,每一纵列是某个分区的多份相同的数据。目的是达到查询时负载均衡的效果,同时也是高可用性的保障:某个列的机器出现问题后其他的机器会负载访问。
这 样一个查询要查询几个机器才能得到结果,一个插入语句可能要同时影响几个机器上的数据。为了不让这样一个复杂的结构暴露给应用程序和开发人员,在数据层上 面又放了一层机器叫中间层也叫访问层,访问层机器负责维护各个机器关系的配置信息,处理SQL语句,根据SQL语句的类型和条件来决定由哪些机器来提供服 务,缓存数据等工作。
Moebius for SQL Server分布式网格集群工作原理
以下从DML语法的角度介绍一下中间件的工作方式
当中间层接到一个INSERT语句后,通过分析SQL语句得到要插入的表, 这个表的分区列,再根据分区列的值决定应该这条数据插入到第几个分区的数据中去,再从配置信息中得到这个分区列中有多少可用的机器,然后插入数据。
当 中间层接受到一个查询语句后,首先分析该语句要查找的表,根据要查找的表和语句的WHERE条件计算出要从某一个分区中取数据还是几个分区列中去取数据, 取完数据后在中间层合并后再返回给应用程序。要说的是每个分区列可以有多份相同的数据,每个查询从每列可用的机器上随机找出一个数据库进行查找。从而达到 查询的负载均衡,即提高了查询的性能,又保障了整个系统的可靠性。如图所示,全局查询和局部查询。