分库分表
分库分表?
高并发下每秒访问对数据库单库单表承受不住巨大的压力。单表最大支持每秒2000个写的请求。 分库能减缓对单表的压力。
数据库的中间件:sharding-jdbc 当当开源的。属于client层的,只要引入jar就可以使用了。 用的比较多的。
mycat 基于cobar改造的。属于proxy层方案, 需要部署到服务器上
数据库如何拆分:
垂直拆分 和 水平拆分
不停机的情况迁移到分库分表:
出现的双写的方案, 把原来的系统中加入写入分库分表的中间件,及写入单库中也写入到分库中, 然后在后台的程序在写一个数据迁移的工具,来查询单库中的所有数据来查询分库分表中的数据是否存在,
如果存在就比较数据的时间是否最新。如果单库中的数据最新就覆盖分库分表中数据, 反之就不覆盖。
经过一个轮数据完成后,再次查询单库中的数据和分库分表中是否一致。
如何动态扩容缩容分库分表:
只改变的数据库服务器的数据量。 可以分成4个服务器数据库, 一个数据库服务器上分8个库 一个库中有32张表,这样就有1024张表。 这样就支持每秒8000个写的请求。 如果扩容就增加服务器数据库,把所有库平均分到各个数据库服务器上。
这样分库的时候 有工具可以自动分。百度就可以。
分库分表之后id主键怎么生成?
1 在库中创建一个自动生成自增主键的表,生成完后在拿着生成的数据去插入到不同的表中, 这种的适合并发很低, 数据量很大的数据, 几十亿的数据
2 uuid 生成分库分表的数据不太合适,可能会出现重复的值
3 当前时间 可以使用业务字段 + 当前时间 作为全局唯一的编号。
4 snowflake 规则是 0(表示正数)|时间(毫秒)|机房id| 机器的id | 生成的编号, 如果在同一毫秒生成了又来啦一条数据会进行判断进行生成的编号加1
使用这个算法每秒可以生成400w个id(16位的数字id 10进制的)