Mysql系列四:数据库分库分表基础理论
一、数据处理分类
1. 海量数据处理,按照使用场景主要分为两种类型:
联机事务处理(OLTP)
面向交易的处理系统,其基本特征是原始数据可以立即传送到计算机中心进行处理,并在很短的时间内给出处理结果。简单地说,主要是对数据的插入、修改、删除,所以对事物和实时性要求比较高。
联机分析处理(OLAP)
通过多维的方式对数据进行分析、查询和报表,可以同数据挖掘工具、统计分析工具配合使用,增强决策分析功能。简单地说,主要是对海量数据的查询统计分析
2. OLTP和OLAP的比较
| OLTP | OLAP | |
| 系统功能 | 日常交易处理 | 统计、分析、报表 |
| DB设计 | 面向实时交易类应用 | 面向统计分析类应用 |
| 数据处理 | 当前的、最新细节的、二维的分立的 | 历史的、聚集的、多维集成的、统一的 |
| 实时性 | 实时读写要求高 | 实时读写要求低 |
| 事物 | 强一致性 | 弱事物 |
| 分析要求 | 低、简单 | 高、复杂 |
二、常用数据库分类
传统数据库:
Oracle、Mysql、SQLserver、DB2
NoSQL数据库:
临时性键值存储——Redis、Memcached
永久性键值存储——Redis、ROMA
面向文档存储——MongoDB、CouchDB
面向列存储——Cassandra、HBase
传统数据库与NoSQL数据库对比:
| 传统数据库 | NoSQL数据库 | |
| 特点 |
数据关系模型基于关系模型、结构化存储、完整性约束。 基于二维表及其之间的联系,需要连接、并、交、差、除等数据操作。 采用结构化的查询语言(SQL)做数据读写。 操作需要数据的一致性,需要事物甚至是强一致性。 |
非结构化的存储。 基于多维关系模型。 具有特定的使用场景。 |
| 优点 |
保持数据的一致性(事物处理)。 可以进行join等复杂查询。 通用化,技术成熟。 |
高并发,大数据下读写分离能力较强。 基本支持分布式,易于扩展,可伸缩。 简单,弱结构化存储。 |
| 缺点 |
数据读写需要经过sql解析,大量数据、高并发下读写性能不足。 对数据做读写,或修改数据结构时需要加锁,影响并发操作。 无法适应非结构化存储。 扩展困难。昂贵、复杂。 |
Join等复杂操作能力较弱。 事物支持较弱。 通用性差。 无法完整约束复杂业务场景支持较差。 |
三、分库分表
1. 常规未进行分库分表的情况


2. 解决上面的这种情况的方法——分库分表
把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储于多个表上
分库分表的目的:分散单台设备的负载

3. 数据切分
分库分表的基本思想:数据切分
数据切分(Sharding)根据其切分规则的类型,可以分为两种切分模式:
垂直(纵向)切分:
将不同的表(或者Schema)拆分到不同的数据库(主机)上。
说明:这种切分方式是根据业务来切分的,比如我有2个系统,分别是订单支付系统和用户信息系统,在之前所有的表都是在一个库里面,现在做业务拆分,就把订单支付相关的表都放在订单支付的库里面,用户信息相关的表都放在用户信息的库里面

水平(横向)切分:
根据表中数据的逻辑关系,将同一张表中的数据安装某种条件拆分到多台数据库(主机)的同一表结构的表中。
说明:这种拆分方式是拆表的,简单的说,就是根据表中的某个字段对表进行拆分,比如我有一个订单表,随着年份的变化数据量越来越大,这个时候就需要根据年份来把表中的数据拆分到不同数据库(主机)的订单表里面去了

垂直(纵向)切分与水平(横向)切分的比较:
| 垂直切分 | 水平切分 | |
| 特点 |
规则简单,实施方便。 业务之间耦合度非常低,相互影响很小。 根据不同的表来进行拆分,对应用程序的影响也更小。 |
将同一个表中的不同数据拆分到不同的数据库。 对应用程序来说,表的命名比垂直拆分更复杂。 后期的数据维护也会复杂。 |
| 优点 |
系统之间的整合或扩展容易。 拆分后业务清晰,拆分规则明确。 数据维护简单。 |
拆分规则抽象好,Join操作基本可以数据库做。 不存在单库大数据和高并发性能瓶颈。 应用端改造较少。 提高了系统的稳定性跟负载能力。 |
| 缺点 |
部分业务无法join,只能通过接口方式解决,提高了系统复杂度。 受每种业务不同的限制存在单库性能瓶颈,不易数据扩展跟性能提高。 事务处理复杂。 |
拆分规则难以抽象。 分片事物一致性难以解决。 数据多次扩展跟维护量极大。 跨库Join性能较差。 |
4. 分库分表需要应对的技术难题
4.1 分布式全局唯一id
解决方法:
1)数据库自增:针对同一张表,在每个数据库建表的时候设置步长(step)
2)UUID/GUID
3)Redis Increment
4)MongoDB ObjectId(类似UUID的方式)
5)Zookeeper分布式锁
6)Twitter的Snowflake(又叫雪花算法)
7)Ticket Server(数据库生存方式,Flickr采用的就是这种方式)
4.2 分片规则和策略
1)分片字段的选择
2)分片规则
3)数据迁移,容量规划,扩容等
4.3 跨分片技术问题
1)跨分片的排序分页 limit 1 5

2)跨分片函数处理
3)跨分片join
4.4 跨分片事物问题
1)强一致性问题
2)弱一致性问题/最终一致性
5. 分库分表中间件有哪些
1)Cobar
Cobar是来自阿里的mysql中间件,但是现在已经很久没有更新了,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务
2)Sharding JDBC
当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据库分库分表访问
3)TDDL
淘宝根据自身业务需求研发了TDDL(Taobao Distributed Data Layer 外号头都大了)框架,主要用于解决分库分表场景下的访问路由(持久层与数据访问层的配合)以及异构数据库之间的数据同步,它是一个基于集中式配置的JDBC DataSource实现,具有分库分表、读写分离(Master/Salve)、动态数据源配置等功能。
4)Mycat
一个开源的分布式数据库系统,实现了mysql协议的服务器。前端用户可以把它看作是一个数据库代理,用mysql客户端工具和命令行访问,而其后端可以用mysql原生协议与多个mysql服务器通信,也可以用jdbc协议与大多数主流数据库服务器通信
这几种中间件的对比:

6. mycat分库分表中间件解决分库分表过程中面对的各种技术问题
6.1 分布式全局唯一id
多种分布式全局唯一id的实现方式
6.2 分片规则和策略
多种分片规则和策略,甚至可以自定义
6.3 跨分片技术问题
多种分片规则和策略,甚至可以自定义
6.4 跨分片事物问题
单库内保证事物的完整性,跨库事物弱XA(最终一致性)
mycat其他特点:
1)可以通过mycat统一管理所有数据源,后端数据库集群对前端应用程序透明
2)独创的ER关系分片,解决ER分片难处理问题
3)采用全局分片技术,每个节点同时并发插入和更新数据,每个节点都可以读取数据
4)通过人工智能的Catlet支持分片复杂SQL实现以及存储过程支持等
Mysql系列四:数据库分库分表基础理论的更多相关文章
- MySQL系列(八)--数据库分库分表
在互联网公司或者一些并发量比较大的项目,虽然有各种项目架构设计.NoSQL.MQ.ES等解决比较高的并发访问,但是对于数据库来说,压力 还是太大,这时候即使数据库架构.表结构.索引等都设计的很好了,但 ...
- Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案
一.前言 在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个: 1. 分布式全局唯一id 2. 分片规则和策略 3. 跨分片技术问题 4. 跨分片事物 ...
- 数据库分库分表(sharding)系列【转】
原文地址:http://www.uml.org.cn/sjjm/201211212.asp数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三 ...
- 数据库分库分表(sharding)系列
数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三) 关于使用框架还是自主开发以及sharding实现层面的考量 (四) 多数据源的 ...
- 转数据库分库分表(sharding)系列(二) 全局主键生成策略
本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...
- 数据库分库分表(sharding)系列(二) 全局主键生成策略
本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...
- 【转】mysql分库分表,数据库分库分表思路
原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路 一. 数据切分 关系型数 ...
- php面试专题---mysql数据库分库分表
php面试专题---mysql数据库分库分表 一.总结 一句话总结: 通过数据切分技术将一个大的MySQLServer切分成多个小的MySQLServer,既攻克了写入性能瓶颈问题,同一时候也再一次提 ...
- 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
随机推荐
- PHP类的继承
每个子类(也叫派生类)都会在设置自己的属性前调用父类的构造方法.父类(也叫基类或超类)现在仅知道自己的数据,子类一般是父类的特例,要避免告诉父类任何关于子类的信息 以下为一个使用继承的实例: < ...
- unity 判断物体是否在视角内(巧妙!)
public var isRendering:boolean=false; private var lastTime:float=0; private var curtTime:float=0; fu ...
- Java容器:HashTable, synchronizedMap与ConcurrentHashMap
首先需要明确的是,不管使用那种Map,都不能保证公共混合调用的线程安全,只能保证单条操作的线程安全,在这一点上各Map不存在优劣. 前文中简单说过HashTable和synchronizedMap,其 ...
- libreoffice.在Centos中使用时碰到X11 error的解决办法
先安装 libreoffice yum install libreoffice -y 尝试DOC转PDF是碰到报错 解决办法, 要安装多一个东西 yum install libreoffice-hea ...
- 虚拟机搭建和安装Hadoop及启动
马士兵hadoop第一课:虚拟机搭建和安装hadoop及启动 马士兵hadoop第二课:hdfs集群集中管理和hadoop文件操作 马士兵hadoop第三课:java开发hdfs 马士兵hadoop第 ...
- linux上 安装软件
一.rpm包安装方式步骤: 1.找到相应的软件包,比如soft.version.rpm,下载到本机某个目录: 2.打开一个终端,su -成root用户: 3.cd soft.version.rpm所 ...
- B - 可能的路径(gcd变形)
https://vjudge.net/contest/218366#problem/B 要不是在数学题专题里,我估计就盲目搜索了.10^18范围1s应该过不去. 再细看能感觉到是gcd的变形,但是具体 ...
- Android开发中遇到的问题(一)——Android模拟器端口被占用问题的解决办法
一.问题描述 今天在Eclipse中运行Android项目时遇到"The connection to adb is down, and a severe error has occured& ...
- DIY自己的AllocateHWnd函数
Classes单元的AllocateHWnd函数是需要传入一个处理消息的类的方法的作为参数的,原型: function AllocateHWnd(Method: TWndMethod): HWND; ...
- android:ViewHolder模式
ViewHolder holder = null; if(convertView == null){ convertView = mInflater.inflate(R.layout.xxx null ...