112.用了分库分表之后,有哪些常见问题?

    虽然数据分片解决了性能、可用性以及单点备份恢复等问题,但分布式的架构在获得了收益的同时,也引入了新的问题。

    • 面对如此散乱的分库分表之后的数据,应用开发工程师和数据库管理员对数据库的操作变得异常繁重就是其中的重要挑战之一。他们需要知道数据需要从哪个具体的数据库的分表中获取。

    • 另一个挑战则是,能够正确的运行在单节点数据库中的 SQL ,在分片之后的数据库中并不一定能够正确运行。

      • 例如,分表导致表名称的修改,或者分页、排序、聚合分组等操作的不正确处理。
      • 例如,跨节点 join 的问题。
    • 跨库事务也是分布式的数据库集群要面对的棘手事情。

      • 合理采用分表,可以在降低单表数据量的情况下,尽量使用本地事务,善于使用同库不同表可有效避免分布式事务带来的麻烦。

        要达到这个效果,需要尽量把同一组数据放到同一组 DB 服务器上。

        例如说,将同一个用户的订单主表,和订单明细表放到同一个库,那么在创建订单时,还是可以使用相同本地事务。

      • 在不能避免跨库事务的场景,有些业务仍然需要保持事务的一致性。而基于 XA 的分布式事务由于在并发度高的场景中性能无法满足需要,并未被互联网巨头大规模使用,他们大多采用最终一致性的柔性事务代替强一致事务。

    • 分布式全局唯一 ID 。

      • 在单库单表的情况下,直接使用数据库自增特性来生成主键ID,这样确实比较简单。
      • 在分库分表的环境中,数据分布在不同的分表上,不能再借助数据库自增长特性。需要使用全局唯一 ID,例如 UUID、GUID等 。

    关于这块,也可以看看 《分库分表》 文章。