Oracle,mysql 等传统的关系数据库非常成熟并且已大规模商用,但是随着于联网发展,数据量越来越大,对性能要求越来越高,传统数捤库存在着先天的缺陷,即单机(单库)性能瓶颈,却又扩展困难。返样既有单机单库瓶颈,却又扩展困难,自然无法满足日益增长的海量数据存储 及其性能要求,如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷,但是由于目前开源或者商用的传统数据库基本不支持大规模自动扩展,所以就需要借助第三方来做处理
数据切分:
纵向(垂直)切分:
按照不同的表来切分到不同的数据库(主机)之上,对于业务逻辑非常清晰的系统适合,可以把不同模块的表拆分到不同的数据库
对于需要join的这类表,就需要去做平衡,是数据库业步业务,共用一个数据源,还是分成多个库,业务之间通过接口来做调用 。初期数据量小可以考虑同源,后期数据量大必须分割。存在复杂join 的数据是需要考验技术架构的。
优点:
拆分后业务清晰,拆分规则明确。
系统之间整合或扩展容易.
数据维护简单。
缺点:
部分业务表无法 join,只能通过接口方式解决,提高了系统复杂度。
受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。
事务处理复杂
由于垂直切分是按照业务的分类将表分散到不同的库,所以有些业务表会过于庞大,存在单库读写与存储瓶
颈,所以就要要水平拆分来做解决。
横向(水平)切分:
根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面
水平切分需要定义分片规则,根据系统的业务数据来定义。
比如:从会员角度分析,商户订单交易类系统中插寻会员某天某月的某个订单,就需要按照日期来拆分,不同的数据按照会员ID做分组,这样所有的join就可以单库完成。 但是从商家的角度分析,要查询商家某天某月的订单数据,则需要按照商家Id做拆分;如果系统既想按照会员又想按照商家做拆分,则会有一定的难度,这样就需要去寻找合适的分片规则。整个系统需要全面衡量分片规则。
优点:
拆分规则抽象好,join操作基本可以数据库做
不存在单库大数据,高并发的性能瓶颈
应用端改造少。
提高了系统的稳定性跟负载能力
缺点:
拆分规则难以抽象。
分片事务一致性难以解决。
数据多次扩展难度跟维护量极大
跨库join性能差
共同的缺点:
引入分布式事务的问题
跨界点join的问题
跨界点合并排序分页问题
多数据眼管理问题
数据切分原则
第一原则:能不切分尽量不要切分。
第二原则:如果要切分一定要选择合适的切分规则,提前规划好。
第三原则:数据切分尽量通过数据冗余或表分组来降低跨库 Join 的可能。
第四原则:由于数据库中间件对数据 Join 实现的优劣难以把握,而且实现高性能难度极大,业务读取尽量少使用多表join。
Mycat 是数据库中间件,目前的版本,已经不是一个单纯的MySQL 代理了,它的后端可以支持 MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这种新型 NoSQL 方式的存储 。1000亿以下数据。
MyCat是开源的,代码,文档地址:https://github.com/MyCATApache/
MyCAT-Server 仓库地址: https://github.com/MyCATApache/Mycat-Server.git
myCat 需要在JDK7版本以上运行。MyCat推荐使用mySql做集群。
MyCAT 有提供编译好的安装包,支持 windows、Linux、Mac、Solaris 等系统上安装运行。