数据库-sharding之分库分表

1.分库分表(sharding)的原因

在网站初期,为了节约资源,常常部署单点(单一服务器)mysql作为数据存储。随着网站业务量增大,机器的性能有限,单点mysql的I/O性能瓶颈马
上达到高潮。

?为了突破单节点I/O的性能,聪明的架构师开始引入多节点,这就是所谓分库。如果说单节点是单线程串行计算,那么多节点就是多线程并行计算。多节
?点的mysql服务借鉴了并行的思想,将原本对单点的操作分散到N台机器上,提升的效果明显。

?有可能我们的网站发展很迅速,每天的注册用户很多,然而这些注册用户都是存放在一张user表上的,这张表越来越大,每一次insert操作需要维护的
?成本也非常高。于是乎,就开始将user表拆分成user_1,user_2...等表,这就是所谓分表。

2.切分(sharding)的主要思想

顾名思义,切分就是指:按照一定的规则对数据库或者数据表进行分割,然后按照一定的路由策略找到数据所对应的数据库和数据表,进行增删改查
(CRUD)操作。

?数据库切分策略=分库+分表+路由

总体来说:分库分表主要有两种方式:垂直切分与水平切分

3.垂直切分:

将数据库中关系相近的表分散到不同的数据库中。在实际生产中,常常将耦合低,独立性高,相互影响小的各个模块所用的表分拆到不同的数据库中。以
微博举例,用户关系、微博动态、图片服务这些分割开来的业务相互之间独立,就可以将三个业务分布到不同的数据库中。

对单一业务来说,可能一个库还是达不到性能要求,就需要将库再分:

?垂直切分的作用:

1.降低了单点I/O的负载:?垂直切分又称为物理上的切分:将一个mysql节点(一台服务器)且分到多mysql节点(多台服务器),数据库操作通过路由
规则访问特定的数据库,这样一来每次访问面对的就不是单台服务器,而是N台服务器了,达到了并行处理的效果。

4.水平切分

将一张数据量比较大的表拆分到不同的数据库中,在实际生产中常使用的有按月按日分表,逻辑分表等

?按月分表:

?

?逻辑分表:

?

?水平切分的作用:

?1.提高单表处理速度:原本所有用户信息的操作都在一张user表上进行,假如user表很大,达到千万行,每次insert带来更新索引的成本或者select
?查询的成本都很高,速度慢。

?2.提高并发操作效率:写操作会带来行锁甚至表锁,分表有助于提高并发效率。

路由策略:

?分库分表之后,如何找到相应数据所在的位置是我们需要关心的。

?常用的路由策略有:

?1.?按号分段:

?    ?user_id为区分,1-1000对应DB1,1001-2000对应DB2依次类推

?    ?优点:可部分迁移

?    ?缺点:数据分布不均

?2.hash取模

?    ?对user_id等字段进行hash值计算后取模。比如应用中分为4个库的话,对hash(user_id)%4为1的对应DB1,为2的对应DB2,为3的对应DB3,为0
?    ?的对应DB4

?    ?优点:数据分布均匀

?    ?缺点:迁移麻烦,不能按照机器性能分摊数据

常用的设计方案:

?1.提供分库规则和路由规则

?2.引入集群,保证数据的可用性

?3.引入负载均衡

?4.引入集群节点探测

?5.引入读写分离

提供分库规则和路由规则&&引入集群,保证数据的可用性&&引入读写分离

?采用数据库切分方案后,由N台数据库组成了一个完整的DB,某台服务器宕机的话,只会损失1/N量的数据。

?然而大部分时候我们都不能容忍数据的丢失,于是乎引入了集群的概念。也就是在每一个分库的节点引入多台服务器,每台服务器存储的数据都是一样的。    ?

?

?如图所示,整个DB由3个库组成,分别为DB1,DB2,DB3,每个库为一个集群,包含1个Master和5个Slave,Master负责写,Salve负责读。

?Master和Slaver之间的数据是同步的,如果其中一个slave宕机,其他的slave的数据还在,就不会发生数据丢失的情况。    ?

Master和Slaver的问题:

?    ? 如果读和写都在一个节点上,由于写操作涉及到锁的问题,都会降低系统的执行效率,采用M/S策略,一方面有效的提高了读的效率,一方面也保
?    ? 证了数据的可用性。不过如何保证M和S之间数据的同步呢,Master往往会成为瓶颈所在,写操作需要顺序队列来执行,过载的话Master首先扛
?    ? 不住,然后Slave同步的延迟也比较大,损耗CPU的计算性能。

引入负载均衡&&引入集群节点探测:

?对于整个DB来说,每个分库的压力会有所不同。对于整个分库来说,每个Slave的压力也会有所不同。基于这种需求,我们引入了负载均衡的概念。

?具体的规则如下:负载均衡器会分析当前sql的读写特性,如果是写操作或者是要求实时性很强的操作的话,直接将查询负载分到Master,如果是读操
?作则通过负载均衡策略分配一个Slave。我们的负载均衡器的主要研究放向也就是负载分发策略, 通常情况下负载均衡包括随机负载均衡和加权负载均
?衡。

?然而负载均衡器如何知道每个库的性能呢?有两种方式:

?1.每个分库或者Slave节点定时报告性能情况(主动交代)

?2.负载均衡器轮询每个节点查询性能情况(被动询问)
时间: 2024-10-11 11:18:14

数据库-sharding之分库分表的相关文章

数据库mysql 自动分库分表备份脚本

数据库mysql 自动分库分表备份脚本 当我们在公司中遇到数据库的备份,项目比较多,经常进行数据库和表的添加工作,那么我们 想要让系统脚本自动进行查询数据库里的库和表结构,然后进行自动的定期进行数据库和表的定期份, 那么我们该如何实现呢,大家看看以下的脚本: vi mysql_backup.sh #!/bin/sh #backup tiandao bbs edoing #coding tonye.li MYUSER=root MYPASS=meidi SOCKET=/data/3306/mysq

MySQL 高可用:mysql+mycat实现数据库分片(分库分表)

本文引用于http://blog.csdn.net/kk185800961/article/details/51147029 MySQL 高可用:mysql+mycat实现数据库分片(分库分表) 什么是MYCAT: 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一个融合内存缓存技术.NoSQL技术.HDFS大数据的新型SQL Server 结合传统数据库和新型分布式数

数据库为什么要分库分表

1 基本思想之什么是分库分表?从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的数据量.数据处理能力都将遭遇瓶颈.3 分库分

【干货】浅谈分布式数据库中间件之分库分表

分库分表,顾名思义就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上.那么关于分库分表,你了解多少呢?接下来,我们将从什么是数据分片及如何进行分片两方面对DDM分库分表做一个阐释.什么是数据分片 分片是解决数据库存储容量限制的直接途径.分片包括垂直分片与水平分片两种方式. 垂直分片 垂直分片又叫纵向分割,即以逻辑表为单位,把原有数据库切分成多个数据库.切分后不同的表存储在不同的数据库上. 垂直分片与业务架构设计有密切的联系.比如从业务领域对系统进行架构优化

【转】数据库的分库分表基本思想

Sharding的基本思想就要把一个数据库切分成多个部分放到不同的数据库(server)上,从而缓解单一数据库的性能问题.不太严格的讲,对于海量数据的数据库,如果是因为表多而数据多,这时候适合使用垂直切分,即把关系紧密(比如同一模块)的表切分出来放在一个server上.如果表并不多,但每张表的数据非常多,这时候适合水平切分,即把表的数据按某种规则(比如按ID散列)切分到多个数据库(server)上.当然,现实中更多是这两种情况混杂在一起,这时候需要根据实际情况做出选择,也可能会综合使用垂直与水平

分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允.本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观.中立的阐明各自真实的优缺点以及适用场景. 一.NewSQL数据库先进在哪儿? 首先关于“中间件+关系数据库分库分表”算不算NewSQL分布式数据库问题,国外有篇论文pavlo-newsql-sigmodrec,如果根据该文中

MySQL分库分表备份脚本

vim /data/mysqlback.sh #! /bin/bash BAKPATH=/data/mysql-back MYUSER=root MYPASS="123456" SOCKET=/var/lib/mysql/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -x -F -R"

【转】MySQL分库分表环境下全局ID生成方案

转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了.因此,我们需要提供一个全局唯一的ID号生成

Sharding-Sphere 3.X 与spring与mybatis集成(分库分表)demo

最近在弄这个sharding-sphere,公司内部分库分表是在此业务代码上进行逻辑分库分表,但是这种总是不好,也调研了几款分库分表中间件.mycat.网易cetus.阿里DRDS.这几种就是背景强大,大公司经过大量的实战,成熟度很高,而框架sharding-sphere比较轻量级,最近比较火,它是以jar包形式提供服务,可以无缝连接ORM框架,并不需要额外的部署,不需要依赖,运维可以不需要改动,很多人都把sharding-sphere当成增强版的jdbc驱动,迁移代码其实没那么复杂.对于巨头公