第 15 章 MySQL分布式应用

来源:互联网 发布:ext js 学多久 编辑:程序博客网 时间:2024/06/05 20:16

对于一个大型数据库应用来讲,设计一个分布式、高可用的架构非常重要。MySQL从5.0.3版本就开始支持分布式事务,通过数据切分、读写分离、数据缓冲、集群等方式可以更好地构建分布式应用。

15.1 分布式应用的概念和优势

分布式数据库是指利用高速计算机网络将物理上分散的多个数据存储单元连接起来组成一个逻辑上统一的数据库。分布式数据库的基本思想是将原来集中式数据库中的数据分散存储到多个通过网络连接的数据存储节点上,以获取更大的存储容量和更高的并发访问量。
分布式数据库系统的主要目的是容灾、异地数据备份,并且通过就近访问原则,用户可以就近访问数据库节点,这样就实现了异地的负载均衡。同时,通过数据库之间的数据传输同步,可以分布式保持数据的一致性,这个过程完成了数据备份,异地存储数据在单点故障的时候不影响服务的访问,只需要将访问流量切换异地镜像即可。
分布式数据库应用的优势:
(1)适合分布式数据管理,能够有效提高系统性能。分布式数据库系统的结构更适合具有地理分布特性的组织或机构使用,允许分布在不同区域、不同级别的各个部门对其自身的数据实行局部控制。
(2)系统经济性和灵活性好。传统的数据库系统一般是通过高端设备,例如小型机或者高端存储来保证数据库完整性,或者通过增加内存、CPU来提高数据库处理能力。这种集中式的数据库架构越来越不适合海量数据库处理,而且也得付出高额的费用。而由超级微型计算机或超级小型计算机支持的分布式数据库系统往往具有更高的性价比和实施灵活性。
(3)系统经可靠性高和可用性强。由于存在冗余数据,个别场地或个别链路的故障不会导致整个系统的崩溃。同时,系统可自动检测故障所在,并利用冗余数据恢复出故障的场地,这中检测和修复是在联机状态下完成的。

15.2 MySQL分布式应用的主要技术

在MySQL中实现分布式应用的方式有多种,如数据切分、读写分离、集群等。下面将对这三种技术逐一进行介绍。

15.2.1 MySQL数据切分

数据切分(Sharding)是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。数据切分还可以提高系统的总体可用性,因为单台设备Crash之后,只有总体数据的某部分不可用,而不是所有的数据。
根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分称为数据的垂直(纵向)切分;另一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。垂直切分的最大特点就是规则简单,实施也更为简单,尤其适合各业务之间耦合度低、相互影响小、业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表拆分到不同的数据库中。根据不同的表进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。水平切分比垂直切分相对复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身比较复杂,后期的数据维护也会更复杂一些。
MySQL 5.1 以上的版本都支持数据表分区功能。数据库中的数据经过垂直和水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是就是如何让这些数据源得到较好的整合,有以下两种解决思路:
(1)在每个应用程序模块中配置管理自己需要的一个(多个)数据源,直接访问各个数据库,在模块内完成数据的整合。
(2)通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明。
第(2)中方案,虽然短期内需要付出的成本可能会相对大一些,但是对整个系统的扩展性来说,是非常有帮助的。可以选择的方法和思路如下:

  • 利用MySQL Proxy实现数据切分及整合
    MySQL Proxy是在客户端请求与MySQL服务器之间建立一个连接池,所有客户端请求都发送到MySQL Proxy,由MySQL Proxy进行相应的分析,判断是读操作还是写操作,然后分别发送到对应的MySQL服务器上。对于多节点Slave集群,也可以做到负载均衡的效果。
  • 利用Amoeba实现数据切分及整合
    Amoeba是一个基于Java开发的、专注于解决分布式数据库数据源整合Proxy程序的开源框架,Amoeba已经具有Query路由、Query过滤、读写分离、负载均衡以及HA机制等相关内容。
  • 利用HiveDB实现数据切分及整合
    HiveDB同样是一个基于Java的针对MySQL数据库提供数据切分及整合的开元框架,只是目前的HiveDB仅仅支持数据的水平切分,主要解决大数据量下数据库的扩展性及数据的高性能访问问题,同时支持数据的冗余及基本的HA机制。

15.2.2 MySQL读写分离

读写分离架构是利用数据库的复制技术(详见第 14 章),将读和写分布在不同的处理节点上,从而达到提高可用性和扩展性的目的。主数据库提供写操作,从数据库提供读操作,在很多系统中,更多地是读操作。但主数据库进行写操作时,数据要同步到从数据,这样才能有效保证数据库完整性。MySQL也有自己的同步数据技术。MySQL通过二进制日志来复制数据,主数据库同步到从数据库后,从数据库一般由多台数据库组成,这样才能达到减轻压力的目的。读操作应根据服务器的压力分配到不同服务器,而不是简单的随机分配。MySQL提供了MySQL Proxy实现读写分离操作。
目前较为常见的MySQL读写分离分为以下两种:
(1)基于程序代码内部实现
在内部中根据SELECT、INSERT进行路由分类,这类方法也是目前生产环境中应用最广泛的。
(2)基于中间代理层实现
代理位与客户端和服务器之间,代理服务器收到客户端请求后通过判断转发到后端数据库。下图是eBay读写分离的结构图,通过Share Plex近乎实时的复制数据到其他数据节点,再通过特定的模块检查数据库状态,并进行负载均衡、读写分离,极大地提高了系统的可用性。

15.2.3 MySQL集群

MySQL Cluster技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。
MySQL Cluster采用Shared-Nothing(无共享)架构。MySQL Cluster主要利用了NDB存储引擎来实现,NDB存储引擎是一个内存式存储引擎,要求数据必须全部加载到内存中。数据被自动分布在集群中的不同存储节点上,每个存储节点只保存完整数据的一个分片。同时,用户可以设置同一份数据保存在多个不同的存储节点上,以保证单点故障不会造成数据丢失。
MySQL Cluster需要有一组计算机,每台计算机的角色可能是不一样的。MySQL Cluster按照节点类型可以分为3 种:管理节点(对其他节点进行管理)、数据节点(存放Cluster中的数据,可以有多个)和SQL节点(存放表结构,可以有多个)。Cluster中的某计算机可以是某一种节点,也可以是 2 种或 3 种节点的集合。这3种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。
MySQL集群的出现很好地实现了数据库的负载均衡,减少了数据中心节点的压力和大数据量处理,当数据中心节点出现故障时,集群会采用一定策略切换到其他备份节点上,有效地屏蔽了故障问题,单节点的失效不会影响整个数据库对外提供服务。而且通过采用数据库集群架构,主从数据库之间时刻都在进行数据的同步冗余,数据库是多点的、分布式的,良好地完成了数据库的备份,避免了数据损失。

15.3 MySQL分布式应用实例

不再细讲

15.4 高手点拨

在配置节点时,最好不要将管理节点和数据节点部署到同一台服务器上,因为如果数据节点死机会导致管理节点也不可用,从而导致整个MySQL群集就都不用了。所以一个MySQL群集理想情况下至少有 3 台服务器,将管理节点单独放到一台服务器上。

阅读全文
0 0