一、数据处理分类

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系列四:数据库分库分表基础理论的更多相关文章

  1. MySQL系列(八)--数据库分库分表

    在互联网公司或者一些并发量比较大的项目,虽然有各种项目架构设计.NoSQL.MQ.ES等解决比较高的并发访问,但是对于数据库来说,压力 还是太大,这时候即使数据库架构.表结构.索引等都设计的很好了,但 ...

  2. Mysql系列七:分库分表技术难题之分布式全局唯一id解决方案

    一.前言 在前面的文章Mysql系列四:数据库分库分表基础理论中,已经说过分库分表需要应对的技术难题有如下几个: 1. 分布式全局唯一id 2. 分片规则和策略 3. 跨分片技术问题 4. 跨分片事物 ...

  3. 数据库分库分表(sharding)系列【转】

    原文地址:http://www.uml.org.cn/sjjm/201211212.asp数据库分库分表(sharding)系列 目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三 ...

  4. 数据库分库分表(sharding)系列

    数据库分库分表(sharding)系列     目录; (一) 拆分实施策略和示例演示 (二) 全局主键生成策略 (三) 关于使用框架还是自主开发以及sharding实现层面的考量 (四) 多数据源的 ...

  5. 转数据库分库分表(sharding)系列(二) 全局主键生成策略

    本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...

  6. 数据库分库分表(sharding)系列(二) 全局主键生成策略

    本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表( ...

  7. 【转】mysql分库分表,数据库分库分表思路

    原文:https://www.cnblogs.com/butterfly100/p/9034281.html 同类参考:[转]数据库的分库分表基本思想 数据库分库分表思路   一. 数据切分 关系型数 ...

  8. php面试专题---mysql数据库分库分表

    php面试专题---mysql数据库分库分表 一.总结 一句话总结: 通过数据切分技术将一个大的MySQLServer切分成多个小的MySQLServer,既攻克了写入性能瓶颈问题,同一时候也再一次提 ...

  9. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

随机推荐

  1. Shiro笔记(二)身份验证

    Shiro笔记(二)身份验证 一.核心代码 @Test public void helloWorldTest(){ IniSecurityManagerFactory factory = new In ...

  2. rabbitmq使用(三)

    Publish/Subscribe In the previous tutorial we created a work queue. The assumption behind a work que ...

  3. linux中内存超出后可以这样

    http://www.cnblogs.com/hongten/archive/2012/11/16/java_PermGen_space.html

  4. unity3d 摄像机抖动效果 CameraShake

    unity3d 摄像机抖动效果 ,利用脚本直接控制:当然也可以选择使用dotween插件,但到不至于为了使用仅一个功能,就导入了一个插件: 脚本示例: using UnityEngine; using ...

  5. ecshop jquery 冲突

    遇到冲突在脚本前面加上这句 $(function() { window.__Object_toJSONString = Object.prototype.toJSONString; delete Ob ...

  6. AIX中vi编辑器使用

    3.1 vi 简介 vi 是 UNIX 世界里使用非常普遍的全屏幕文本编辑器,几乎任何一种UNIX系统都会提供这套软件.AIX当然也支持这种编辑器.熟悉DOS下的文本处理后,用户在开始接触vi时也许会 ...

  7. How to modify analog output range of Arduino Due

    Voltage Translation for Analog to Digital Interface ADC How to modify analog output range of Arduino ...

  8. Android开发中遇到的问题(三)——eclipse创建android项目无法正常预览布局文件

    一.问题描述 今天使用SDK Manager将Android SDK的版本更新到了Android 5.1的版本,eclipse创建android项目时,预览activity_main.xml文件时提示 ...

  9. Android的Databinding-自定义生成类名字

    1. 在xml中,添加class的属性并设置为自定义名字<data class="com.example.CustomBinding"></data>2. ...

  10. StackExchange.Redis 管道 批量 高性能插入数据

    现在用redis来做数据缓存的越来越多了,很多项目都有初始化redis数据的过程,由于初始化的数据比较大,那么该过程越快越好.这里我们以HashSet方法为例, 这里我们推荐用HashEntry[] ...