随着业务量的发展,数据库系统有集中式走向分布式是必然选择。
1 在介绍分布式系统是先来做一下概念说明:
我们自在看分布式数据库的相关知识的时候,常常会看到集群,分布式集群,分布式系统等,其实集群与分布式是有区别的:
(1)集群:集群是一组协同工作的服务实体,用以提供比单一服务实体更具扩展性与可用性的服务平台。在客户端看来,一个集群就象是一个服务实体,但事实上集群由一组服务实体组成。与单一服务实体相比较,集群提供了以下两个关键特性:可扩展性和高可用性。
(2)分布式:所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
(3)由此可见:分布式是指将不同的业务分布在不同的地方。而集群指的是将几台服务器集中在一起,实现同一业务。分布式中的每一个节点,都可以做集群。而集群并不一定就是分布式的。(具体看博客
集群与分布式的区别
)(4)但是就数据库:其实也可以理解成一样,目的都是为了实现数据库的负载均衡,高可用性。他们之间的不同要看怎么设计了,分布式一般是各分布节点根据哈希算法或其他算法分散存储数据,意思就是所有节点的数据加起来才算是整体数据。从应用端传过来的请求只操作涉及到的某个节点或部分节点就可完成一次请求。
数据库集群很多设计的都是所有节点服务器之间的数据是完全同步的。当一个应用发出请求,首先发给负载服务器,根据应用系统提供的负载均衡算法或是数据库本身的负载均衡算法,选择一个负载最小节点来执行请求并返回数据,同时集群中还有一个同步服务器来保证各节点中的数据一致。
总结:可以理解成一样,而且分布式与集群设计的时候也可以一起用,因此我们也接收模糊概念,具体情况具体分析。
2 企业数据库发展的路线:
大部分企业数据库开始是单服务器模式,之后业务量变大会升级硬件提升处理能力,之后会搭建master-slave主从复制结构(读写分离),之后是建立分布式系统,实现水平或垂直切分。
3 分布式数据库发展概述:
20世纪90年代以来,分布式数据库系统进入商品化应用阶段,传统的关系数据库产品均发展成以计算机网络及多任务操作系统为核心的分布式数据库产品,同时分布式数据库逐步向客户机/服务器模式发展。
(1)DDBS的分类:同构同质型DDBS、同构异质型DDBS、异构型DDBS。
同构同质型DDBS:各个场地都采用同一类型的数据模型(譬如都是关系型),并且是同一型号的DBMS。
同构异质型DDBS:各个场地采用同一类型的数据模型,但是DBMS的型号不同,譬如DB2、ORACLE、SYBASE、SQL Server等。
异构型DDBS:各个场地的数据模型的型号不同,甚至类型也不同。随着计算机网络技术的发展,异种机联网问题已经得到较好的解决,此时依靠异构型DDBS就能存取全网中各种异构局部库中的数据。
(2)数据分片类型:水平分片、垂直分片、导出分片、混合分片。
水平分片:按一定的条件把全局关系的所有元组划分成若干不相交的子集,每个子集为关系的一个片段。
垂直分片:把一个全局关系的属性集分成若干子集,并在这些子集上作投影运算,每个投影称为垂直分片。
导出分片:又称为导出水平分片,即水平分片的条件不是本关系属性的条件,而是其他关系属性的条件。
混合分片:以上三种方法的混合。可以先水平分片再垂直分片,或先垂直分片再水平分片,或其他形式,但他们的结果是不相同的。
4分布式数据库管理系统架构
接受用户请求,并判定把它送到哪里,或必须访问哪些计算机才能满足该要求。访问网络数据字典,了解如何请求和使用其中的信息。如果目标数据存储于系统的多个计算机上,就必须进行分布式处理。通信接口功能。在用户、局部DBMS和其他计算机的DBMS之间进行协调。在一个异构型分布式处理环境中,还需提供数据和进程移植的支持。这里的异构型是指各个场地的硬件、软件之间存在着差别。
关于分布式数据库理论方面的知识可以看博客从分布式数据库结构入手讲解其前世今生与分布式数据库概述。
4 分布式数据库系统的实现技术
现在大部分的数据库都支持分布式技术,对于分布式数据库的实现数据库厂商与用户都做了大量的研究。厂商推出的集群解决方案主要有:SQLSERVER Cluster、OracleRAC、MySQLCluster等,如果采用厂商的解决方案,会对厂商的技术产生依赖。现在用户大都基于开源项目自己实现一个分布式系统,特别是互联网公司基本都是基于mysql实现分布式数据库系统。自己实现分布式系统的话很多都是基于中间件技术,中间件技术要根据数据库系统具体选择或者实现一个,比如,应用于mysql的amoeba中间件。
(1)厂商解决方案:
对于厂商解决方案大都是厂商根据自己公司数据库的特点提出的方法:
SQL SERVER的集群模式:
这种结构只能说是一种故障转移的机制,当有一个节点出现问题后把负载转移到另一个节点上。在负载能力上和扩展性上没有任何办法,而且还浪费了硬件资源
Oracle Real Application Clusters (RAC):
Oracle Rac最多可支持64个节点,基本上算是解决了性能,扩展性的问题了,但是它在存储上还是一个单点,且不说出现故障怎么办,IO也可能会成为性能瓶颈。 我们都知道一个数据库大到一定程度的时候,在物理上分区才能从根本上解决问题,对几十万数据进行查找和几百万上千万的数据进行查找在系统的消耗上以及响应时间上有着几何级的降低。
MySQLCluster
MySQL cluster和Oracle RAC完全不同,它采用Shared-nothing架构。整个集群由管理节点(ndb_mgmd),处理节点(mysqld)和存储节点(ndbd)组 成,不存在一个共享的存储设备。MySQLcluster主要利用了NDB存储引擎来实现,NDB存储引擎是一个内存式存储引擎,要求数据必须全部加载到内存之中。数据被自动分布在集群中的不同存储节点上,每个存储节点只保存完整数据的一个分片(fragment)。同时,用户可以设置同一份数据保存在多个不同的存储节点上,以保证单点故障不会造成数据丢失。
虽然MySQLcluster目前性能还不理想,但是share nothing的架构一定是未来的趋势,Oracle接手MySQL之后,也在大力发展MySQL cluster,我对MySQL cluster的前景抱有很大的期待。
(2)自己实现分布式数据库系统:
对于自己实现一个分布式数据库系统以构建一个高可用的数据系统,提高数据库的读写能力,现在常用的方法是数据分片与读写分离。基于中间件实现的分布式系统结构如下:
Cluster Killer中间件:
[img]
从图例中可以看出,下面的像网格一样的机器叫数据层,每个机器上存储着数据全集的一个分区,每一行组成一个数据全集,每一列是某个分区的多份相同的数据从而达到查询时负载均衡的效果,同时也是高可用性的保障:某个列的机器出现问题后其他的机器会负载访问。为了不让这样一个复杂的结构暴露给应用程序,在数据层上面又放了一层机器叫中间层,中间层机器的数据库中驻留着的中间件来处理SQL语句,根据SQL语句的类型和条件来决定由哪些机器来提供服务。在中间层的外面加一个负载均衡设备, 这样应用程序或者开发/维护的人员通过负载均衡设备连接到中间层的任意一台机器上操作,感觉就像还在使用原来的一个数据库那样,易用性非常好。
Amoebafor MySQL
Amoeba for MySQL 位于Client、Database Server(s)之间,具有负载均衡、高可用性、sql过滤、可承受高并发、读写分离、Query Route(解析sql query语句,并且根据条件与预先设定的规则,请求到指定的目标数据库。可并发请求多台数据库合并结果)、对客户端透明,能降低数据切分带来的复杂多数据库结构、数据切分规则给应用带来的影响。
对于更具体的能容要看转载的博客:
可拓展的分布式系统:http://blog.csdn.net/u010282707/article/details/37580243
大型分布式系统应用案例:http://blog.csdn.net/u010282707/article/details/37580403
amoeba for mysql 分布式数据库Proxy解决方案:http://blog.csdn.net/u010282707/article/details/37580693
浅谈mysql集群:http://blog.csdn.net/u010282707/article/details/37580593