对于大型的互联网应用来讲,数据库单表的记录行数可能达到千万级甚至是亿级,而且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构,只可以对数据库的读进行扩展,而对数据库的写入操做仍是集中在Master上,而且单个Master挂载的Slave也不可能无限制多,Slave的数量受到Master能力和负载的限制。所以,须要对数据库的吞吐能力进行进一步的扩展,以知足高并发访问与海量数据存储的须要!html
对于访问极为频繁且数据量巨大的单表来讲,咱们首先要作的就是减小单表的记录条数,以便减小数据查询所须要的时间,提升数据库的吞吐,这就是所谓的分表!java
分表又分为垂直分表和水平分表
垂直分表:表的记录并很少,可是字段却很长,表占用空间很大,检索表的时候须要执行大量的IO,严重下降了性能。这时须要把大的字段拆分到另外一个表,而且该表与原表是一对一的关系。
水平分表:表的记录不少,严重影响了查询速度。这时须要把一张表拆分红多张字段相同的表,将记录分摊到各个表中,以减小单表的记录数mysql
分表可以解决单表数据量过大带来的查询效率降低的问题,可是,却没法给数据库的并发处理能力带来质的提高。面对高并发的读写访问,当数据库master服务器没法承载写操做压力时,无论如何扩展slave服务器,此时都没有意义了。所以,咱们必须换一种思路,对数据库进行拆分,从而提升数据库写入能力,这就是所谓的分库!git
有时数据库可能既面临着高并发访问的压力,又须要面对海量数据的存储问题,这时须要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提高单表的查询性能,这就是所谓的分库分表。github
1. proxy sharding,目前由cobar,mycat,drds,atlas修改,这几个产品的起源通常是mysqlproxy 或 ameoba,特色是mysql协议基本兼容,业务不须要作太多修改,缺点是分库分表的算法很烂,业务要本身作大堆配置
2. jdbc中间件sharding,这个和协议差很少,就是把服务实现为了一个中间件,好处是协议损失时间能够补回来,坏处是只有java可使用,开源的有当当的 sharding-jdbc
3.mysql的ndbcluster和fabric,这是mysql 引擎层面作的sharding,直接用mysql的协议层和计划生成,这个作的好处是原生的协议层都是百分百支持,事务用mysql xa支持也算马马虎虎,坏处是单机引擎,不能支持大数据的sql算法
详细 http://www.javashuo.com/article/p-cjrmdgdw-bg.htmlsql
sharding-jdbc是当当的一个开源的项目,属于轻量级Java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其余依赖。数据库
github地址:https://github.com/shardingjdbc/sharding-jdbc服务器
文档:http://shardingjdbc.io/docs/00-overview架构
官网提供的功能列表 :)
1. 分库分表 SQL解析功能完善,支持聚合,分组,排序,LIMIT,TOP等查询,而且支持级联表以及笛卡尔积的表查询 支持内、外链接查询 分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略 基于Hint的强制分库分表路由 2. 读写分离 独立使用读写分离支持SQL透传 一主多从的读写分离配置,可配合分库分表使用 基于Hint的强制主库路由 3. 柔性事务 最大努力送达型事务 TCC型事务(TBD) 4. 分布式主键 统一的分布式基于时间序列的ID生成器 5. 兼容性 可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC 可基于任何第三方的数据库链接池,如:DBCP, C3P0, BoneCP, Druid等 理论上可支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer和PostgreSQL 6. 灵活多样的配置 Java YAML Inline表达式 Spring命名空间 Spring boot starter 7. 分布式治理能力 (2.0新功能) 配置集中化与动态化,可支持数据源、表与分片策略的动态切换(2.0.0.M1) 客户端的数据库治理,数据源失效自动切换(2.0.0.M2) 基于Open Tracing协议的APM信息输出(2.0.0.M3)
总体架构图