转载:用sharding技术来扩展你的数据库(一)sharding 介绍

转载:MySQL架构方案 - Scale Out & Scale Up.

转载: 数据表分区策略及实现(一)

转载:Mysql分表和分区的区别、分库分表介绍与区别

转载:分库分表带来的完整性和一致性问题

转载:开源数据库 Sharding 技术 (Share Nothing)

一、Sharding

Sharding 是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseShard)。将整个数据库打碎的过程就叫做sharding,可以翻译为分片

形式上,Sharding可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个shard,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。一个shard可以包含多个表的内容甚至可以包含多个数据库实例中的内容。每个shard被放置在一个数据库服务器上。一个数据库服务器可以处理一个或多个shard的数据。系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的shard或shards节点上去执行。

二、Scale Out/Scale Up 和 垂直切分/水平拆分

Mysql的扩展方案包括Scale Out和Scale Up两种

Scale Out(横向扩展)是指Application可以在水平方向上扩展。一般对数据中心的应用而言,Scale out指的是当添加更多的机器时,应用仍然可以很好的利用这些机器的资源来提升自己的效率从而达到很好的扩展性。

Scale Up(纵向扩展)是指Application可以在垂直方向上扩展。一般对单台机器而言,Scale Up值得是当某个计算节点(机器)添加更多的CPU Cores,存储设备,使用更大的内存时,应用可以很充分的利用这些资源来提升自己的效率从而达到很好的扩展性

MySql的Sharding策略包括垂直切分和水平切分两种

垂直(纵向)拆分:是指按功能模块拆分,以解决表与表之间的io竞争。比如分为订单库、商品库、用户库...这种方式多个数据库之间的表结构不同。

水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,来解决单表中数据量增长出现的压力。这些数据库中的表结构完全相同

表结构设计垂直切分。常见的一些场景包括

a). 大字段的垂直切分。单独将大字段建在另外的表中,提高基础表的访问性能,原则上在性能关键的应用中应当避免数据库的大字段

b). 按照使用用途垂直切分。例如企业物料属性,可以按照基本属性、销售属性、采购属性、生产制造属性、财务会计属性等用途垂直切分

c). 按照访问频率垂直切分。例如电子商务、Web 2.0系统中,如果用户属性设置非常多,可以将基本、使用频繁的属性和不常用的属性垂直切分开

表结构设计水平切分。常见的一些场景包括
a). 比如在线电子商务网站,订单表数据量过大,按照年度、月度水平切分

b). Web 2.0网站注册用户、在线活跃用户过多,按照用户ID范围等方式,将相关用户以及该用户紧密关联的表做水平切分

c). 例如论坛的置顶帖子,因为涉及到分页问题,每页都需要显示置顶贴,这种情况可以把置顶贴水平切分开来,避免取置顶帖子时从所有帖子的表中读取

三、分表和分区

分表从表面意思说就是把一张表分成多个小表,分区则是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。

分表和分区的区别

1,实现方式上

mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件(MyISAM引擎:一个.MYD数据文件,.MYI索引文件,.frm表结构文件)。

2,数据处理上

分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。分区则不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表还是一张表,数据处理还是由自己来完成。

3,提高性能上

分表后,单表的并发能力提高了,磁盘I/O性能也提高了。分区突破了磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。

在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。

4,实现的难易度上

分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式和分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。 分区实现是比较简单的,建立分区表,跟建平常的表没什么区别,并且对代码端来说是透明的。

分区的适用场景

1. 一张表的查询速度已经慢到影响使用的时候。

2. 表中的数据是分段的

3. 对数据的操作往往只涉及一部分数据,而不是所有的数据

  1. CREATE TABLE sales (
  2. id INT AUTO_INCREMENT,
  3. amount DOUBLE NOT NULL,
  4. order_day DATETIME NOT NULL,
  5. PRIMARY KEY(id, order_day)
  6. ) ENGINE=Innodb
  7. PARTITION BY RANGE(YEAR(order_day)) (
  8. PARTITION p_2010 VALUES LESS THAN (2010),
  9. PARTITION p_2011 VALUES LESS THAN (2011),
  10. PARTITION p_2012 VALUES LESS THAN (2012),
  11. PARTITION p_catchall VALUES LESS THAN MAXVALUE);

分表的适用场景

1. 一张表的查询速度已经慢到影响使用的时候。

2. 当频繁插入或者联合查询时,速度变慢。

分表的实现需要业务结合实现和迁移,较为复杂。

四、分表和分库

分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库。

与分表策略相似,分库可以采用通过一个关键字取模的方式,来对数据访问进行路由,如下图所示

五、分库分表存在的问题

1 事务问题。

在执行分库分表之后,由于数据存储到了不同的库上,数据库事务管理出现了困难。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价;如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

2 跨库跨表的join问题。

在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。

3 额外的数据管理负担和数据运算压力。

额外的数据管理负担,最显而易见的就是数据的定位问题和数据的增删改查的重复执行问题,这些都可以通过应用程序解决,但必然引起额外的逻辑运算,例如,对于一个记录用户成绩的用户数据表userTable,业务要求查出成绩最好的100位,在进行分表之前,只需一个order by语句就可以搞定,但是在进行分表之后,将需要n个order by语句,分别查出每一个分表的前100名用户数据,然后再对这些数据进行合并计算,才能得出结果。

解决方案

1. 使用类似JTA提供的分布式事物机制

六、分片(Sharding)和分区(Partition)

sharding和partition的区别:

Sharding:分表、分库、分片和分区相关推荐

  1. 数据库分片(Sharding):分表+分库+分片+分区

    1.数据切分: 数据库分布式核心内容无非就是数据切分(Sharding) 将一个数据库比喻成一个大任务,将这任务分散给不同的人去执行,那么每一个执行的人就称为数据库的碎片(DatabaseShard) ...

  2. MySql Sharding分表、分库、分片和分区知识讲解

    一.Sharding Sharding是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题.Shar ...

  3. ES的跨索引查询有多便利?对比下分库分表、分片更直观

    作者介绍 李猛(ynuosoft),Elastic-stack产品深度用户,ES认证工程师,2012年接触Elasticsearch,对Elastic-Stack开发.架构.运维等方面有深入体验,实践 ...

  4. 由mysql分区想到的分表分库的方案

    在分区分库分表前一定要了解分区分库分表的动机. 对实时性要求比较高的场景,使用数据库的分区分表分库. 对实时性要求不高的场景,可以考虑使用索引库(es/solr)或者大数据hadoop平台来解决(如数 ...

  5. .Net下你不得不看的分表分库解决方案-多字段分片

    介绍 本期主角:ShardingCore 一款ef-core下高性能.轻量级针对分表分库读写分离的解决方案,具有零依赖.零学习成本.零业务代码入侵 dotnet下唯一一款全自动分表,多字段分表框架,拥 ...

  6. java集群_「Java知识」MyCat的图文视频讲解,MyCat分片集群分表分库策略

    在一个项目当中,项目经理要求把原先的MySQL数据连接基于mycat来进行改造 .当时就在想MyCat是什么东西?为什么要用它呢? 蚂蚁课堂带你学Java 一.什么是MyCat: MyCat是一个开源 ...

  7. mysql 分区 分表 分库分表

    分区 把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.ini中的d ...

  8. 冷热分离和直接使用大数据库_用读写分离与分表分库解决高访问量和大数据量...

    原标题:用读写分离与分表分库解决高访问量和大数据量 一. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度 ...

  9. 数据库中间件(分表分库路由)

    分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...

  10. 软件架构场景之—— 分表分库:单表数据量大读写缓慢如何解决?

    业务背景 一个电商系统的架构优化,该系统中包含用户和订单 2 个主要实体,每个实体涵盖数据量如下表所示 实体 数据量 增长趋势 用户 上千万 每日十万 订单 上亿 每日百万级速度增长,之后可能是千万级 ...

最新文章

  1. 第十六届全国大学生智能车竞赛线上赛点赛道审核 - 安徽赛区
  2. String和StringBuffer的区别,String长度是固定的?
  3. JAVA字符串占位符替换
  4. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
  5. 48.Linux/Unix 系统编程手册(下) -- System V 共享内存
  6. 两个整形变量值交换的五种境界
  7. 现在工作和技术一般,想下班后充充电多学点东西。然而事实却相反,怎么让自己的学习更加有毅力?...
  8. 怎样把win7系统下的屏幕设置成护眼的非常柔和的豆沙绿色?
  9. .deb文件怎么安装_新手iso系统怎么安装|新手安装iso镜像文件详细步骤
  10. 曲线运动与万有引力公式_考前冲刺,人手一份!高中物理公式大全,不看太亏...
  11. Redis数据类型和应用场景
  12. 计算机网络——FTP网络服务器
  13. 超详细的TypeScript入门教程!
  14. 融易投3周年庆——欢乐送豪礼
  15. RW08-7B(七管)收音机焊接
  16. 网吧计算机配置特点,揭秘:网吧电脑配置很低,却怎么用也不卡顿,这是为什么呢?...
  17. 数组的排序面向对象类对象0708
  18. 江西师范大学计算机学院,江西师范大学计算机信息工程学院导师介绍:叶继华...
  19. 艾美捷ProSci丨ProSci 40S核糖体蛋白S19重组蛋白介绍
  20. mysql中的判断是否有该条数据 如果有返回1 没有返回0

热门文章

  1. Javascript(JS) leetcode 796. 旋转字符串
  2. 以太坊MPT数据结构
  3. ctf_BUUCTF_web(1)
  4. html5实现frame效果,html5 frameset标签的替代方案是什么
  5. 如何安装 IntelliJ IDEA 最新版本——详细教程
  6. 内网计算机游戏不被检测,两台未联网的Win7电脑建立局域网游戏的方法
  7. AVB源码学习(二):Uboot阶段AVB2.0校验流程
  8. MATLAB下实现巴特沃斯低通滤波器并对图像滤波
  9. Matlab-梁单元有限元分析(有限元基础-曾攀)
  10. Linux文件系统笔记