01、Sharding-JDBC 实战 - 数据库分库、分表
一、什么是分库分表
分库分表就是按照一定的规则,对原有的数据库和表进行拆分,把原本存储于一个库的数据分玦存储到多 个库上,把原本存储于一个表的数据分块存储到多个表上。目的就是为了缓解数据库的压力,最大限度提高数据操作的效率。
分表
就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它。
分库
一旦分表,一个库中的表会越来越多
二、为什么要分库分表
问题描述:
1、 单个表数据量越大,读写锁,插入操作重新建立索引效率越低;
2、 单个库数据量太大(一个数据库数据量到1T-2T就是极限);
3、 单个数据库服务器压力过大;
4、 读写速度遇到瓶颈(并发量几百);
mysql单表经验
- 300W Mysql 可以轻松抗住
- 600 W 数据开始卡,优化可以解决(表结构,索引设计)
- 800W ~ 1000W 牛逼的DBA 优化都会遇到瓶颈
一般来说 MySQL 数据库单表记录最好控制在 500 万条(这是个经验数字)
分库分表目的:分担单台设备负载
随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘、IO、系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进行拆分,从而更好的提供数据服务。
三、分库分表有哪些形式
分库分表的基本思想:对数据切分,分而治之
3.1、垂直(纵向)拆分
将不同的表(或者 Schema)拆分到不同的数据库(主机)之上,垂直划分数据库是横据业务进行划分,例如将shop中涉及商品、订单、用户的表分别划分出成商品库、订单库、用户库,通过降低单库(表)的大小来提高性能,但这种方式并没有解决高数据量带来的性能提耗(并没有减少表的数据量)
分表的情况就是将一个大表根据业务功能拆分成一个个子表。常见是把一个多字段的大表按常用字段和非常用字段进行拆分,每个表里面的数据记录数一般情况下是相同的,只是字段不一样,使用主键关联。
表垂直拆分是对列的拆分,拆分完成后每张单表相对于原表row 不变,column减少(可以理解A4纸左右对折切割)
优点:
1、 拆分后业务清晰,拆分规则明确;
2、 降低单节点数据库的负载,按照业务将表进行分类,分布到不同的数据库上面,这样也就将数据或者说压力分担到不同的库上,;
3、 可以达到最大化利用Cache的目的,具体在垂直拆分的时候可以将不常变的字段放一起,将经常改变的放一起;
4、 数据维护相对简单;
缺点:
1、 表拆分主键出现冗余,需要管理冗余例;
2、 会引起表连接JOIN操作(增加CPU开销)可以通过在业务服务器上进行join来减少数据库压力;
3、 依然存在单表数据量过大的问题(需要水平拆分);
4、 事务处理复杂;
3.2、水平(横向)拆分
根据表中的数据的逻辑关系,将同一张表中的数据按照某种条件拆分到多台数据库(主机)上。水平划分是根据一定规则,例如时间或者id序列值等进行数据的拆分。相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表包含一部分数据。
水平切分是对数据行的切分,拆分完成后每张单表相对于原表column不变,row减少(可以理解A4纸上下对折切割)
优点:
1、 不存在单库大数据和高并发的性能瓶颈;
2、 应用端改造较少;
3、 提高了系统的稳定性和负载能力;
缺点:
1、 分片事务一致性难以解决;
2、 跨节点Join性能差,逻辑复杂;
3、 数据多次扩展难度跟维护量极大;
四、分库分表组件有哪些
1. Atlas
https://github.com/Qihoo360/Atlas
Atas是由 Qihoo360,Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目,它是在mysql- proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。Atlas是一个位于应用程序与MySQL之间,它实现了MySQL的客户端与服务端协议,作为服务端与应用程序通讯,同时作为客户端与 MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低 MySQL负担,它还维护了连接池。
Atlas 相当于nginx 代理服务器,业务后端连接Atlas 服务器,将sql 发送给Arlas 服务器,Atlas 会负责返回拼接数据
2. Cobar
https://github.com/alibaba/cobar
阿里巴巴(B2B)部门开发的一种关系型数据库的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。
3. Sharding JDBC
https://shardingsphere.apache.org
当当应用框架 ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数 据库分库分表访问。
4. TDDL
https://github.com/alibaba/tb_tddl
淘宝根据自己的业务特点开发了TDDL框架,主要解决了分库分表对应用的透明化以及异构数据库之间的数据复制,它是一个基于集中式配置的jdbc datasource实现,具有主备,读写分离,动态数据库配置等能。
5Mycat
http://www.mycat.io/
一个开源的分布式数据库系统,实现了 MySQL协议的服务器。前端用户可以把它看作是一个数据库代理,用 MySQL客户端工具和命令行访问,而其后端可以用 MySQL原生协议与多个 MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信