分库分表实战问题
1.分库分表中水平拆分和垂直拆分的区别?
水平拆分:将表数据拆分到不同的数据数据库中。
垂直拆分:把一个大表拆成多个小表。字段进行拆分。
分表:是指的是把表数据拆分到多张表里面。
range分发:每个月生成一个新表。如果访问新的数据还好,但是访问旧的数据就麻烦一些。
hash分发:平均分配,但是扩容的话会比较麻烦。
2.如何让未分库分表的系统,设计成分库分表的系统?
1)停机迁移方案
2)双写迁移方案
修改系统中所有写库的代码,同时让他写老库和新的分库分表的库。
单表的数据中取数据,同步到分库分表的系统,如果分库分表中不存在,直接写入进去。如果存在比较时间戳,单表的数据比数据库中的要新,就覆盖。迁移完了进行检查,检查完了之后一摸一样就可以关掉开始的写单表,如果不一样循环几次,直到一样。
3.如何设计可以动态扩容所容的分库分表方案?
例如 3个库 12张表的数据,扩容到6个库12张表。
【解决方案】
1.就一次性,一开始设计32个库 32张表
四个服务器,每个服务创建8个库,每个库创建32张表。现在支持的写并发8000/s,扩容的话,加四台服务器。每台服务器变成4个库,每个库32张表。直接迁移库,比较快捷和方便。最多可以扩到32个服务器。每个服务器放一个库,一个库存32张表。
有多少个库,取模32的时候放到指定的库里面。放到指定表,再取32的模。
4.分库分表之后,id怎么解决?
1)数据库自增id
2)uuid
3)获取当前时间
4)雪花算法
5.mysql主从复制是如何实现的?
主库将变更写binlog日志中,然后从库连接到主库之后,从库有一个io线程,将主库binlog日志拷贝到本地,写入一个中继日志中。然后从库会有一个sql线程从中继日志中读取binlog日志,就会在本地执行一遍sql。
mysql有半同步复制来解决数据库主库数据丢失问题。意思是当数据存入binlog日志后,紧接着会发送给从库,从库会将日志写入relaylog日志中,接着会返回一个ack。至少一个ack才算成功。
mysql有并行复制来解决主从同步延时。指的是从库开启多个线程,并行读取relay log中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。
强制读主库来解决延时问题。
本文地址:https://blog.csdn.net/a11112244444/article/details/107498631