继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

【九月打卡】第11天 数据库分布式架构

Miss圈
关注TA
已关注
手记 32
粉丝 3
获赞 6

课程名称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不会重复,使用简单, 对代码没有侵入性,缺点是扩展性不佳。不能实现单调递增, 只能实现趋势递增。

 

号段模式:

http://img4.sycdn.imooc.com/6323371e0001386305950334.jpg

http://img4.sycdn.imooc.com/6323371e0001d53c07190240.jpg

号段模式优缺点:

优点:取得号段之后,不在强依赖数据库

缺点:趋势递增,而非单调递增

 

类Snowflake算法:

http://img1.sycdn.imooc.com/6323371f00017a9d06720296.jpg

优点:不依赖任何中间件、性能好、单调递增

缺点:依赖时钟的一致性,时钟回播就会产生相同ID

 

分库分表中间件

每个库只存储部分数据, 如何根据查询条件路由到对应库;

一条语句可能要同事查询多个实例,才能获得最终的结果;

跨库join:参与join的表,分别属于不同的数据库实例。

http://img3.sycdn.imooc.com/6323371f0001da6902440149.jpg

 

分布式事务

XA、TCC、Saga、基于可靠消息的分布式事务...

Seata、ByteTCC、tcn...

https://www.cnblogs.com/monkeyblog/p/10449363.html

 

数据迁移

  • 机房迁移

  • 系统重构,表结构发生了巨大变化

  • 分表调整

  • 更换数据库选型

迁移数据的诉求:

  • 数据准确性

  • 不能影响用户体验、中途不能停机等

挂从库:

http://img4.sycdn.imooc.com/632337200001f92005400394.jpg

优点:迁移成本比较低,操作简单

缺点:有段时间不可写入,只适合数据库选型不变的,同事表结构不变的场景。

双写:

http://img2.sycdn.imooc.com/632337200001223e08350623.jpg

优点:灵活,能满足各种业务场景、不会停机

缺点:复杂度相对高,要修改业务代码,迁移周期相对长

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP