分库分表

一、为什么要分库分表

1.单表并发高、数据量大、无法承载

2.分库:将一个库的数据拆分到多个相同的库中,访问的时候访问一个库

3.分表:把一个表的数据放到多个表中,操作对应的某个表

二、数据垂直拆分和水平拆分

1.垂直拆分:把一个有很多字段的表拆分成多个表,或者多个库上去。每个库表的结构不一样,每个库表包含部分字段。一般来说,将较少访问频率的字段放到一个表中,然后将较多访问频率的字段放到另一个表中。

2.水平拆分:把一个表的数据弄到多个库的多个表里去,但是每个库的结构都一样,只不过每个库放的数据是不同的,所有库表的数据加起来就是全部的数据。将数据均匀的放更多库里,然后用多个库来对抗更高的并发,还有就是用多个库的存储容量来进行扩容。

三、分库分表的其他方式

1.按range来分:每个库一段连续的数据,这个一般是按照时间范围来的,但是这种一般较少用,大量的流量都打在最新的数据上了。优点:扩容的时候,就很容易,只要准备好,给每个月都准备一个库就可以了,到了新的月份的时候,自然就写到新的库里了。但是这种场景要求高。

2.按照hash分:优点:可以平均分配每个库的数据量和请求压力。缺点:扩容起来比较麻烦,会有一个数据迁移的过程。

四、如何不停机迁移分库分表

1.不停机双写迁移

①在上线系统里面,之前所有写库的地方,增删改操作,都除了对老库增删改都加上对新库的增删改,同时写老库和新库。

②系统部署之后,新库数据相差太远,用导数工具,跑起来读老库数据写新库,写的时候要根据gmt_modified这类字段判断这条数据最后修改时间,除非是读出来的数据在新库里没有,或者比新库的数据更新才会写。

③接着导完一轮之后,有可能数据还是存在不一致,那么就程序自动做一轮校验,比对新老库每个表的每条数据,如果有不一样就针对这些数据从老库读取写到新库。反复循环直至完全一致。

五、分库分表中间件

1.sharding-jdbc

2.mycat

(我的其他博客已有,不再赘述)

六、如何动态的扩容缩容分库分表

1.设定好几台数据库服务器,每台服务器上几个库,每个库多少个表,推荐32库*32表

2.路由规则,orderId模32 = 库,orderId/32模32 = 表

3.扩容的时候,申请增加更多的数据库服务器,装好mysql,倍数扩容,4台服务器扩到8台服务器,16台服务器

4.业务代码添加新库的配置,动态调用

七、分库分表的主键唯一ID如何生成

1.数据库自增ID

2.UUID

3.获取当前系统时间

4.snowflake算法(推荐):性能好,支持高并发

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值