背景
对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据库的写入操作还是集中在Master上,并且单个Master挂载的Slave也不可能无限制多,Slave的数量受到Master能力和负载的限制。因此,需要对数据库的吞吐能力进行进一步的扩展,以满足高并发访问与海量数据存储的需要!
分表
对于访问极为频繁且数据量巨大的单表来说,我们首先要做的就是减少单表的记录条数,以便减少数据查询所需要的时间,提高数据库的吞吐,这就是所谓的分表!
分表又分为垂直分表和水平分表
垂直分表:表的记录并不多,但是字段却很长,表占用空间很大,检索表的时候需要执行大量的IO,严重降低了性能。这时需要把大的字段拆分到另一个表,并且该表与原表是一对一的关系。
水平分表:表的记录很多,严重影响了查询速度。这时需要把一张表拆分成多张字段相同的表,将记录分摊到各个表中,以减少单表的记录数
分库
分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库!
分库+分表
有时数据库可能既面临着高并发访问的压力,又需要面对海量数据的存储问题,这时需要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能,这就是所谓的分库分表。
常见的分库分表中间件
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
详细 https://www.cnblogs.com/wangzhongqiu/p/7100332.html
项目简介
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)
整体架构图