分库分表
2021-04-02 11:32:06 29 举报
分库分表
作者其他创作
大纲/内容
表2
数据库1
表0
后台程序写入中间件
snowflake算法
机器3
一边维持原来写入单库的操作,一边将数据写入中间件,然后后台再开个线程查询单库数据发给中间件继续写入
snowflake是一个64位的long型id,第一位是0,之后41位是时间戳,后5位是机房id,再后5位是机器id,最后12位是同一机器一毫秒生成的id序号。最多可支持32个机房,每个机房32台机器生成id
IO线程
库0
机器0
机器id
机器1
工作线程
relay日志
表1
mysql从库
机房1
系统
mysql主库
数据
主从延时解决方案:1.增加机器,将主库拆分成2-4个,降低qps2.修改代码逻辑,避免出现插入后就立刻查询3.
机器5
单库
binlog日志
机器4
数据库0
机器2
主库每次写入数据后,都会把增删改命令同步到binlog日志,然后从库使用IO线程同步数据到relay日志,接着使用sql线程写入数据到表中,sql线程是单线程的,所以会存在主从延时问题,一般写请求在1000qps时,只会延时几毫秒,在2000qps时,会延时几十毫秒,问题不大
数据库中间件
分库分表后如何生成id
单库生成唯一id,
机房0
请求
这一毫秒生成的id序号
数据迁移过程中,先判断这条数据是否存在,如果不存在就写入,存在的话就比较一下update字段,选择最新的时间写入。迁移完成后,和单库比较一下数据是否一致,如果一致,那就ok,如果不一致,就找出不一致的数据,进行分析。
时间戳
数据库2
sql线程
机房1的机器5想在2020-11-22 17:11:20 211 时间点生成一个id,然后snowflake算法就会把这个时间戳转成一串二进制数据,然后把机房和机器编号也转成二进制跟在时间戳后面,最后再加上这一时刻这台机器的请求序号就是id了
机房id
方案1,使用单独一个库生成全局唯一id,然后再插入数据库时手动设置主键id。适用于数据量大,并发小的场景
0 | 0001100 10100010 10111110 10001001 01011100 00 | 10001 | 11001 | 0000 00000000
0 条评论
下一页