查看: 12091|回复: 20

【每周一议】从 Shard 到 Sharding MYsql数据库中Sharding案例讨论

[复制链接]
认证徽章
论坛徽章:
24
技术图书徽章
日期:2013-08-16 14:31:52问答徽章
日期:2013-11-04 08:53:14目光如炬
日期:2013-12-23 06:00:11目光如炬
日期:2013-12-30 06:00:11明星写手
日期:2014-02-22 06:00:12马上有钱
日期:2014-03-31 14:09:05沸羊羊
日期:2015-05-20 12:42:59秀才
日期:2015-06-24 13:05:36秀才
日期:2015-07-13 09:48:14
发表于 2012-12-11 10:43 | 显示全部楼层 |阅读模式
"Shard" 这个词英文的意思是"碎片",而作为数据库相关的技术用语,似乎最早见于大型多人在线角色扮演游戏(MMORPG)中。"Sharding" 姑且称之为"分片"。

Sharding 不是一门新技术,而是一个相对简朴的软件理念。如您所知,MySQL 5 之后才有了数据表分区功能,那么在此之前,很多 MySQL 的潜在用户都对 MySQL 的扩展性有所顾虑,而是否具备分区功能就成了衡量一个数据库可扩展性与否的一个关键指标(当然不是唯一指标)。数据库扩展性是一个永恒的话题,MySQL 的推广者经常会被问到:如在单一数据库上处理应用数据捉襟见肘而需要进行分区化之类的处理,是如何办到的呢? 答案是:Sharding。

Sharding 不是一个某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。

本期讨论话题:

1、Sharding 的应用场景一般都那些?
2、Sharding与数据库分区(Partition)的区别?

讨论时间:2012.12.11-2012.12.27

讨论奖励:讨论结束后将会抽取10位回复认真的会员赠送奥运人文徽章一枚 972s.gif
认证徽章
论坛徽章:
5
茶鸡蛋
日期:2013-01-09 10:55:08茶鸡蛋
日期:2013-02-28 16:07:01奥运会纪念徽章:帆船
日期:2013-04-02 17:07:05奥运纪念徽章
日期:2013-07-18 13:55:12ITPUB社区12周年站庆徽章
日期:2013-10-08 17:44:42
发表于 2012-12-21 16:21 | 显示全部楼层
下面和大家聊一聊mysql sharding,欢迎大家的建议和意见,大家一起学习!

一.背景
  我们知道,当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大。采用MySQL Replication多master多slave方案,在上层做负载均衡,虽然能够一定程度上缓解压力。但是当一张表中的数据变得非常庞大时,压力还是 非常大的。试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,都会面临巨大的性能压力。
二.定义
  数据sharding,也称作数据切分,或分区。是指通过某种条件,把同一个数据库中的数据分散到多个数据库或多台机器上,以减小单台机器压力。
三.分类
  数据分区根据切分规则,可以分为两类:
  (1)垂直分区:以表为单位,把不同的表分散到不同的数据库或主机上。特点是规则简单,实施方便,适合业务之间耦合度低的系统。
  (2)水平分区:以行为单位,将同一个表中的数据按照某种条件拆分到不同的数据库或主机上。特点是相对复杂,适合单表巨大的系统。
  在实际情况中,有的时候把垂直分区和水平分区结合使用。
四.注意事项
  下面我们所说的分区,主要是指水平分区。
  (1)在实施分区前,我们可以查看所安装版本的mysql是否支持分区:

 mysql> show variables like "%partition%";

  如果支持则会显示:
         +-------------------+-------+
         | Variable_name     | Value |
         +-------------------+-------+
         | have_partitioning | YES   |
         +-------------------+-------+
  (2)分区适用于一个表的所有数据和索引;不能只对数据分区而不对索引分区,反之亦然,同时也不能只对表的一部分进行分区。
  (3)分区类型:
  RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。
  LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。
  KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
  无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。当有一新行插入到一个分区表中时,就是使用这些分区编号来识别正确的分区。
  (4) MySQL提供了许多修改分区表的方式。添加、删除、重新定义、合并或拆分已经存在的分区是可能的。所有这些操作都可以通过使用ALTER TABLE 命令的分区扩展来实现.
  (5) 可以对已经存在的表进行分区,直接使用alter table命令即可。

使用道具 举报

回复
认证徽章
论坛徽章:
24
技术图书徽章
日期:2013-08-16 14:31:52问答徽章
日期:2013-11-04 08:53:14目光如炬
日期:2013-12-23 06:00:11目光如炬
日期:2013-12-30 06:00:11明星写手
日期:2014-02-22 06:00:12马上有钱
日期:2014-03-31 14:09:05沸羊羊
日期:2015-05-20 12:42:59秀才
日期:2015-06-24 13:05:36秀才
日期:2015-07-13 09:48:14
发表于 2012-12-11 10:43 | 显示全部楼层
Sharding 是一项仍处于高速发展中的"老"技术,随着 Web 2.0 的发展,Sahrding逐渐从比较"虚"的概念变成比较"实"的运用思路,开放源代码软件大潮也给 Sharding 注入新的活力,相信会有越来越多的项目采用 Sharding 技术,也会有更多成熟的 Sharding 方案和数据库附加软件涌现。

使用道具 举报

回复
论坛徽章:
12
Jeep
日期:2013-08-15 05:38:00奥迪
日期:2013-10-27 23:41:25法拉利
日期:2013-10-27 23:35:28雪佛兰
日期:2013-10-27 23:15:21奥迪
日期:2013-10-27 23:09:36比亚迪
日期:2013-10-27 22:54:04路虎
日期:2013-08-15 06:55:15比亚迪
日期:2013-08-15 06:51:38马自达
日期:2013-08-15 05:50:42雪铁龙
日期:2013-08-15 05:39:50
发表于 2012-12-11 11:02 | 显示全部楼层
学习。。。

使用道具 举报

回复
认证徽章
论坛徽章:
27
优秀写手
日期:2013-12-18 09:29:09ITPUB季度 技术新星
日期:2012-08-15 14:50:13嫦娥
日期:2013-03-04 09:47:05数据库板块每日发贴之星
日期:2011-09-08 01:01:01数据库板块每日发贴之星
日期:2011-09-11 01:01:01数据库板块每日发贴之星
日期:2011-09-10 01:01:02数据库板块每日发贴之星
日期:2011-09-09 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:26:59ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:422013年新春福章
日期:2013-03-04 09:50:49
发表于 2012-12-11 13:27 | 显示全部楼层
一般日志记录啊,还有电商中的订单流程啊,这样的信息,都是准备采用分区功能的。

使用道具 举报

回复
求职 : 数据库管理员
认证徽章
论坛徽章:
45
2011新春纪念徽章
日期:2011-02-18 11:43:322014年新春福章
日期:2014-04-14 09:54:08马上有对象
日期:2014-03-20 10:10:18马上有房
日期:2014-02-18 16:42:022014年新春福章
日期:2014-02-18 16:42:02技术图书徽章
日期:2014-01-24 10:11:16兰博基尼
日期:2013-12-11 10:38:11ITPUB社区12周年站庆徽章
日期:2013-11-07 10:34:33ITPUB社区12周年站庆徽章
日期:2013-10-17 13:56:592014年新春福章
日期:2014-04-14 09:54:08
发表于 2012-12-11 15:53 | 显示全部楼层
1、Sharding 的应用场景一般都那些?
当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大。试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,都会面临巨大的性能压力。sharding通过某种条件,把同一个数据库中的数据分散到多个数据库或多台机器上,以减小单台机器压力。
联机游戏、IM、BSP 都是比较适合 Sharding 的应用场景;

2、Sharding与数据库分区(Partition)的区别?
sharding实现了数据的分布式部署,将数据通过一系列的切分规则,把数据分布到不同的DB服务器上,通过路由规则访问特定的数据库,这样一来,每次访问面对的就不是单台服务器,而是N台服务器,这样就降低了单台服务器的压力。

partition只实现了DB内的分区,不能跨服务器部署。

使用道具 举报

回复
论坛徽章:
14
2011新春纪念徽章
日期:2011-04-02 17:01:062013年新春福章
日期:2013-02-25 14:51:24复活蛋
日期:2012-12-06 19:27:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:00ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42紫蛋头
日期:2012-03-13 16:37:18灰彻蛋
日期:2012-02-06 14:20:122012新春纪念徽章
日期:2012-01-04 11:57:56灰彻蛋
日期:2011-12-26 14:20:13茶鸡蛋
日期:2011-12-20 15:00:13
发表于 2012-12-11 16:05 | 显示全部楼层
up
数据量的增加,解决办法2个方向:scale up,scale out。
分布式存储和计算必然是趋势。

使用道具 举报

回复
认证徽章
论坛徽章:
14
2012新春纪念徽章
日期:2012-01-04 11:58:44 2014年世界杯参赛球队: 德国
日期:2014-05-30 12:58:23优秀写手
日期:2013-12-18 09:29:11凯迪拉克
日期:2013-11-19 14:35:20路虎
日期:2013-11-18 16:25:37灰彻蛋
日期:2013-05-31 08:48:322013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2012-11-13 11:23:38蜘蛛蛋
日期:2012-11-02 16:35:05奥运会纪念徽章:排球
日期:2012-07-10 09:51:40
发表于 2012-12-12 09:55 | 显示全部楼层
自己看过一篇国外写的MySQL sharding。我认为写得非常不错。里面讲述了历史和一些成型的思路和方案。

具体的如下,俺写了个PPT,但是懒得贴出来了。哈哈。

1.Master(W/R)     单实例读写master服务器的时代
2.Master (W) + Slaves (R)   下一步,慢慢地就发展到了Mater和Slave的时代,因为单实例无法承载应用的所有请求。所以,把所有的write queries(INSERT/UPDATE/DELETE)
  给予master,把所有或者近乎所有的 read queries给予slave。
3.Vertical Partitioning (垂直拆分)

*继续往后发展之后,可能不只是读请求超过负载,就连写请求也会超过负载。
*当出现write-heavy applications时候,我们该怎么办?
*使用Vertical Partitioning,把一些重业务分离出来(按库分离或者按表分离)。分别单独放在一个服务器,分担读写分离的请求。分散Top Master的写请求

基于上述的架构,会碰到的瓶颈:
(1):become harder and harder
  (2): Lose some JOIN-functionality
  (3):  if table grew so rapidly ,so
   the performance of the host  wasn’t guranteed any more。
   怎么办?
   加更多的salve?
   买更贵的服务器?
   就算你怎么加,它都会hit limit。

4.当上述又得不到解决的时候,horizontal partitioning到来了。

   *前面讨论的瓶颈,以及后时代的web数据管理。基于上述的理论解决。而这个早在1996年多人大型游戏online(MMO (Massive Multiplayer Online) Games world)就已经开始积极使用。

    基于上图描述,根据上述的算法,针对一张photos表的分割,根据"%10”的算法,连接10台服务器的哪一台进行处理。(其实是有图片的,就是一个表根据"%10"的方法,分布到不同的服务器中),这个要从程序方面调用来解决了。

具体对应的网址如下:

http://www.jurriaanpersyn.com/ar ... with-mysql-and-php/
   

使用道具 举报

回复
认证徽章
论坛徽章:
24
技术图书徽章
日期:2013-08-16 14:31:52问答徽章
日期:2013-11-04 08:53:14目光如炬
日期:2013-12-23 06:00:11目光如炬
日期:2013-12-30 06:00:11明星写手
日期:2014-02-22 06:00:12马上有钱
日期:2014-03-31 14:09:05沸羊羊
日期:2015-05-20 12:42:59秀才
日期:2015-06-24 13:05:36秀才
日期:2015-07-13 09:48:14
发表于 2012-12-12 10:13 | 显示全部楼层
zhangshengdong 发表于 2012-12-12 09:55
自己看过一篇国外写的MySQL sharding。我认为写得非常不错。里面讲述了历史和一些成型的思路和方案。

具 ...

牛人来了啊

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-06-19 15:06:24技术图书徽章
日期:2014-01-26 14:23:572014年新春福章
日期:2014-02-18 16:48:49马上加薪
日期:2014-02-18 16:48:49天蝎座
日期:2015-07-08 22:36:16水瓶座
日期:2016-01-20 11:23:23
发表于 2012-12-12 11:45 | 显示全部楼层
个人感觉sharding和分区还是有着实质性的区别和意义的;
sharding:理论上说是为了突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题,而出现的一种抽象的技术处理解决方案,以此带来的较大幅度性能的提升或者业务的分割;它是把一个整体的数据进行分摊到多个存储设备上,有向上,或者向外伸缩等扩展方式;
分区:各个数据库中或多或少都基本支持分区的概念,比如mysql5.1开始支持分区,他的意义是将一些大数据集合或者索引物拆解成更小,更便于管理的部分,便于我们维护,对于想大幅提高性能来说不能以此为参照,有垂直和水平的分区方式类型。其实mysql的分区是局部分区索引,分区中存放了数据和索引的;
当然他们的也有很多不同点,比如存储方式,前者分布式多为广泛,对于web的业务较广;后者集中式的较多,也就是应用于传统的应用上,在 存储依赖上,可扩展性,可用性等都用部分差异;

使用道具 举报

回复
论坛徽章:
7
2013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-06-19 15:06:24技术图书徽章
日期:2014-01-26 14:23:572014年新春福章
日期:2014-02-18 16:48:49马上加薪
日期:2014-02-18 16:48:49天蝎座
日期:2015-07-08 22:36:16水瓶座
日期:2016-01-20 11:23:23
发表于 2012-12-12 11:46 | 显示全部楼层
zhangshengdong 发表于 2012-12-12 09:55
自己看过一篇国外写的MySQL sharding。我认为写得非常不错。里面讲述了历史和一些成型的思路和方案。

具 ...

其实,在我见过的分区类型中,mysql水平拆分的更擅长一些,对于一些存储引擎!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表