当前位置:嗨网首页>书籍在线阅读

04-MySQL数据切分

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

15.2.1 MySQL数据切分

数据切分(Sharding)是指通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。数据切分还可以提高系统的总体可用性,因为单台设备Crash 之后,只有总体数据的某部分不可用,而不是所有的数据。

根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切分称为数据的垂直(纵向)切分;另一种则是根据表中数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,这种切分称之为数据的水平(横向)切分。垂直切分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间耦合度低、相互影响小、业务逻辑非常清晰的系统。在这种系统中,可以很容易做到将不同业务模块所使用的表拆分到不同的数据库中。根据不同的表来进行拆分,对应用程序的影响也更小,拆分规则也会比较简单清晰。水平切分比垂直切分相对复杂一些。因为要将同一个表中的不同数据拆分到不同的数据库中,对于应用程序来说,拆分规则本身比较复杂,后期的数据维护也会更加复杂一些。

MySQL 5.1以上的版本都支持数据表分区功能。数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何让这些数据源得到较好的整合,有以下两种解决思路。

⑴在每个应用程序模块中配置管理自己需要的一个(或者多个)数据源,直接访问各个数据库,在模块内完成数据的整合。

⑵通过中间代理层来统一管理所有的数据源,后端数据库集群对前端应用程序透明。

第二种方案,虽然短期内需要付出的成本可能会相对大一些,但是对整个系统的扩展性来说,是非常有帮助的。针对第二种方案,可以选择的方法和思路如下。

⑴利用MySQL Proxy 实现数据切分及整合。

MySQL Proxy是在客户端请求与MySQL服务器之间建立一个连接池,所有客户端请求都发送到MySQL Proxy,由MySQL Proxy 进行相应的分析,判断是读操作还是写操作,然后分别发送到对应的MySQL服务器上。对于多节点Slave集群,也可以做到负载均衡的效果。

⑵利用Amoeba实现数据切分及整合。

Amoeba是一个基于Java开发的、专注于解决分布式数据库数据源整合Proxy程序的开源框架,Amoeba已经具有Query路由、Query过滤、读写分离、负载均衡以及HA机制等相关内容。Amoeba主要解决以下几个问题。

①数据切分后复杂数据源整合;

②提供数据切分规则并降低数据切分规则给数据库带来的影响;

③降低数据库与客户端的连接数;

④读写分离路由。

Amoeba For MySQL 主要是专门针对MySQL数据库的解决方案,前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说,Amoeba For MySQL 和一个MySQL数据库没有什么区别,任何使用MySQL协议的客户端请求,都可以被Amoeba For MySQL解析并进行相应的处理。

MySQLProxy程序常用的功能如读写分离、负载均衡等配置都在amoeba.xml中进行。Amoeba已经支持了实现数据的垂直切分和水平切分的自动路由,路由规则可以在rule.xml进行设置。

⑶利用HiveDB实现数据切分及整合。

HiveDB同样是一个基于Java的针对MySQL数据库提供数据切分及整合的开源框架,只是目前的HiveDB仅仅支持数据的水平切分,主要解决大数据量下数据库的扩展性及数据的高性能访问问题,同时支持数据的冗余及基本的HA机制。

HiveDB的实现机制与MySQL Proxy和Amoeba有一定的差异,它并不是借助MySQL的Replication功能来实现数据的冗余,而是自行实现了数据冗余机制,而其底层主要是基于HibernateShards 来实现的数据切分工作。