课程名称:Java架构师-十项全能
课程章节:
分布式ID、分库分表中间件、分布式事务、数据的迁移
主讲老师:
大目
课程内容:
分布式ID
UUID:
优点:使用简单,无需引入额外的组件
缺点:无序,无法实现范围查询;mysql是B+tree的数据结构,B+tree是有序的,导致插入操作是随机I/O,插入操作比自增ID性能差不少, 自增ID性能是UUID的1/4;建议用自增ID+UUID, 自增ID做主键,UUID做业务的唯一标示的方式来提升插入性能。
Redis:
提供了Incr的指令,可以实现原子性的自增,可以作为Redis的ID生成器,优点是:使用简单,性能不错。缺点是需要引入redi, 算是额外组件,增加架构复杂性,依赖Redis,Redis挂了ID就生成不了。
利用数据库的自增能力:
实例A起始ID为1,步长为3,实例B始ID为2,步长为3,实例C始ID为1,步长为3,多个库的ID不会重复,使用简单, 对代码没有侵入性,缺点是扩展性不佳。不能实现单调递增, 只能实现趋势递增。
号段模式:
号段模式优缺点:
优点:取得号段之后,不在强依赖数据库
缺点:趋势递增,而非单调递增
类Snowflake算法:
优点:不依赖任何中间件、性能好、单调递增
缺点:依赖时钟的一致性,时钟回播就会产生相同ID
分库分表中间件
每个库只存储部分数据, 如何根据查询条件路由到对应库;
一条语句可能要同事查询多个实例,才能获得最终的结果;
跨库join:参与join的表,分别属于不同的数据库实例。
分布式事务
XA、TCC、Saga、基于可靠消息的分布式事务...
Seata、ByteTCC、tcn...
https://www.cnblogs.com/monkeyblog/p/10449363.html
数据迁移
机房迁移
系统重构,表结构发生了巨大变化
分表调整
更换数据库选型
迁移数据的诉求:
挂从库:
优点:迁移成本比较低,操作简单
缺点:有段时间不可写入,只适合数据库选型不变的,同事表结构不变的场景。
双写:
优点:灵活,能满足各种业务场景、不会停机
缺点:复杂度相对高,要修改业务代码,迁移周期相对长