Mysql分库分表

前言

Mysql本身是不支持分布式的,但是多数情况下要在分布式系统中使用Mysql的话,就要考虑一些事情:分库分表、主备机制。可以类比其他支持分布式的中间件,比如Clickhouse,Clickhouse中有两个概念:“副本”、“切片”。所谓副本机制就是指持有同样数据的数据库部署多台,所谓切片机制就是指把一份数据切成多块放在不同数据库中。那类似的,但因为Mysql本身不支持分布式,所以我们需要手动去处理这样一件事情,就是分库分表、主备机制等。其中,分库分表就相当于是“切片”的概念;主备机制就相当于是“副本”的概念。

为什么要分库分表?

单机容量有限,单机Mysql并发量有限,Mysql部署的单机磁盘空间有限。进行分库分表之后,首先可以使用多台Mysql,提高并发量;其次可以使用多次机器的磁盘,容下海量数据。

有哪些常用的分库分表中间件?

sharding-jdbc:client模式,也就是说sharding-jdbc就是一个jar包,应用依赖这个jar包之后,分库分表的一系列复杂的内部逻辑(比如分库分表式的join机制,插入数据时的数据路由机制,还有类似map reduce思想查询各个库之后结果汇总再返回) 对于程序员来说就全部透明了,SQL该怎么写还是怎么写。优点:技术成熟,运维成本低;缺点:依赖jar包的每个应用在jar包升级时需要统一更新。

Mycat:proxy模式,也就是说mycat是一个独立部署的中间件,和sharding-jdbc一样,对程序员而言底层也是透明的。优点:项目不依赖jar包,缺点:技术不够成熟,增加了运维成本。

如何分库分表?

垂直分库:常用于初期拆分系统时,或初期就设计微服务架构时,一般每个服务都会有自己对应的数据库,所以垂直分库拆分的依据一般都是业务划分。

垂直分表:为了避免表太宽,每次查询数据量过大(Mysql是行式数据库,每次sql查询会一行一行数据遍历);可以根据业务去划分,比如订单主表、订单支付表;也可以根据列热点字段与非热点字段进行划分。

水平分库 + 水平分表:一个库水平拆分多个库,这个库中的所有表也水平拆分,每个库里拥有各个表的一部分数据。需要考虑数据路由机制。

水平分表:在一个数据库中一个表水平拆分成多个表。需要考虑数据路由机制。

数据路由机制:

Hash路由: 打个比方,就是根据hash(id)取模之后,根据余数路由到不同的库的不同的表中,优点是热点数据足够分散,缺点是扩容时需要进行数据迁移,hash路由机制最好要保证hash一致性,减少扩容时数据的迁移量。

Range路由: 打个比方,就是根据id的大小范围路由到不同的数据库中。Range路由优点不需要进行数据迁移,缺点是热点数据可能分布不均,不适用于热点数据全都集中在最新数据的场景。

数据迁移机制:

停机迁移:

1、网站挂出公告:哪个时间段内,系统进行维护

2、编写临时程序,在后台跑(多线程进行,不同线程可以负责迁移不同的表),将原来单库单表的数据迁移到多库多表中

3、如果失败,做好回滚机制

4、第二天继续进行

不停机迁移:

1、修改正常程序的代码,改为双写,一边写单库单表,一边写多库多表;

2、搞一个后台临时程序,在后台跑,把单库单表的数据迁移到多库多表(在写的过程中,需要根据表里面的时间戳字段进行比对,如果多库多表中的时间戳小于单库单表,那么用单库单表的数据覆盖多库多表对应的数据);

3、持续进行,直到后台临时程序在比对中发现没有时间戳不一致的情况为止,数据迁移成功。

动态扩容缩容:

单台数据库机器的并发量为 2000/s,主要是因为受限于磁盘读写速度;而且单台数据库服务器的磁盘容量也是有限的。

从单库单表到多库多表是正常的,因为前期采用单库单表比较简单;但已经成为多库多表之后,因为规划不够,再次、多次因为磁盘不够用或并发量太大而不断地、被迫地进行扩容就比较蛋疼了。

实际上之所以要数据迁移是因为:库数量、表数据发生了变化导致的。

那么如果一开始就估算好之后好几年内的数据量变化、并发量变化,然后去规划一个比较大的库数量、表数量,不就可以避免好几年之内可能的数据迁移了吗,对,这就是动态扩容缩容!

动态扩容缩容指的是:在不改变库数量、库中表数量的前提下(因为这些数量一旦改变,就会导致数据需要重新迁移的问题),将数据库作为最小单位,在数据库服务器之间进行迁移的过程。

其中,需要明确的概念:

数据库服务器 ---> 数据库 ---> 表

一般规划32个库,32个表,已可以承受3万/s的写并发,以及50亿的数据量了

前期用不了那么多的磁盘容量、也没有那么高的并发的时候,可以把32个库放在4台机器上就行,毕竟需要考虑到服务器成本问题;

后期要么是数据量把机器磁盘占满了,要么是超过了机器磁盘的写并发(2000/s),这时考虑将32个库放在8台机器上,只需要进行数据库在机器上的迁移即可,不需要进行数据迁移;

最极限情况是一台数据库服务器上只放一个库,这样这个库就可以单独享受CPU、内存、网络、磁盘等资源,享受 2000/s 的并发量。

具体做法:停机上线,数据库机器的动态扩容缩容需要DBA支持,有现成的工具可以迁移库,开发人员需要修改相关数据库连接配置就OK啦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值