1.分库分表的扩容
关于扩容具体扩充的大小,一般是扩充 2 的倍数,比如 8 库 8 表扩成 16 库 8 表,或者 8 库 16 表,也可以去 4 倍扩充 16 库 16 表。
具体考虑需要扩容的场景,普通的问题一般比如读操作多写少可以使用主从读写分离解决,如果是写入区分度大可以使用分区表的形式,不过如果是因为写操作频繁,那这两种都不能解决问题,最终还是得对分库分表的系统进行扩容。
分库分表在扩容的时候最少要考虑到,预估未来数据量的增长比如 3 年不需要二次扩容,如果是持续使用的可以提前考虑 5 到 10 年的增长情况去扩容。
2.关于分库分表的跨库分页查询
这种查询是形如 limit numsoffset start 这种格式的查询,解决方法有
直接在每个库取 num+start 条记录,再进行排序取 num 后 start 个
使用局部分页查询 把 offset 和 start 均分到每个库上
禁止跨库的分页查询,通过索引,记录之前访问的最大的值或者最小值去查找 在单库这个也可以用
使用二次查询,这个是要二次确认到底哪些是前面的 num
3.分库分表非分库分表键的查询怎么解决
所谓的非分库分表键查询,是指,我们在进行分库分表时,是通过分库分表键决定数据行落在哪个数据库,比如用户 id 哈希计算取余,同一个用户 id 的就会落在一个库,这时候如果通过卖家 id 去查找没有直接确定的方式,数据也不会在一个库里。
解决方法有
使用中间表记录映射关系
使用二次分库分表去解决,针对另一种高频查询比如卖家 id 也去复制一份数据做分库分表 不过这样会造成数据上的冗余,这种方法可以看成是中间表的一个提升,在二次分库分表如果有用不到的列可以减少二次的数据完整性 也可以通过去查原始表类似回表操作解决。
4.分库分表场景下主键的唯一性
一种是通过一个中心的数据库解决 专门存储最新的 id 去申请
另外就是使用雪花算法 雪花算法会把 id 分成时间戳,机器号,以及具体的 id 字段,雪花算法的一个问题是对于同一个机器同一个时间戳能申请的 id 数量受限于 id 字段的长度,针对这个问题可以去调整不同字段长度。
总结 分库分表主要就是解决主键唯一性,扩容以及数据迁移,分库分表下的跨库查询这些问题,分布式系统下要解决的问题比在单机系统下往往都复杂的多,比如分布式系统要解决一致性,这里主键 id 唯一也是一种数据的一致性。