分布式(一)分布式ID生成方案,分布式下数据库分库分表

分布式(一)、分布式ID生成方案,分布式下数据库分库分表

一、分布式ID

在互联网中,设计到各种各样的ID,如在支付系统中就有支付ID,退款ID等。

分布式ID的特性:

  • 唯一性:确保生成的ID是全网唯一的
  • 有序递增性:确保生成的ID是对于某个用户或者业务是按一定的数字有序递增的。
  • 高可用性:确保任何时候都可以正确的生成ID。
  • 带时间:ID里面应该包含时间

分布式ID的生成方案:
1.数据库主键自增
优点:有序
缺点:导入旧数据的时候可能会有冲突;分布式架构下,分表分库可能会有麻烦
针对多个数据库,可以采用不同数据库起始数字不一样,但是步长一样的方法。

2.UUID
优点:本地生成,代码简单,全球唯一
缺点:无序,UUID往往采用字符串存储,查询的效率过低,而且存储空间较大

3.Redis
Redis是单线程的,自身提供像incr,increby这样的自增原子命令,所以能保证生成的ID是肯定唯一有序的。
优点:有序,不依赖数据库,且性能优于数据库。
缺点:增大了编码量,且依赖Redis,如果Redis出问题,则不能正确生成ID。

4.Twitter的SnowFlake
目的是生成一个64位的Long整型。
组成:
1.最高位是符号位,始终为0,不可用。
2.41位的时间序列,精确到毫秒
3.10位的机器标识
4.12位的计数序列号,即一系列的自增ID,可以支持同一节点同一毫秒生成多个ID序号。

二、分布式下数据库分库分表

可以分为两种方式:垂直切分和水平切分

垂直切分
垂直切分又分为垂直分库垂直分表两种。

  • 垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。
  • 垂直分表是根据数据库中的列进行拆分,如果某个表字段比较多,可以通过新建一张扩展表,将不常用字段或者长度较大的字段分到扩展表中。如图

水平切分
水平切分分为 库内分表分库分表

  • 库内分表是在同一个库内,将某一个表拆分成几个小表,库内分表只解决了单一表数据量过大的问题,但没有将表分到不同机器的库上,因此并不减轻MySQL数据库的压力,
    大家还是竞争同一个物理机的CPU,内存,网络IO,最好通过分库分表来解决。

分库分表带来的问题:

1、事务一致性问题
分布式事务:当更新内容分布在不同的库中的时候,不可避免会带来跨库事务问题。

2、跨节点关联join问题
切分之后,数据可能分布在不同库的不同节点上,此时join问题就比较麻烦了
解决这个问题的方法:
(1)全局表
就是系统中所有模块都可能依赖的表,为了避免跨库join查询,可以将这类表在每个数据库中都存一份。
(2)字段冗余
利用空间换时间的方式,比如,订单表保存userID的时候,也将username冗余保存一份,这样就不需要再去查询username了。使用于依赖字段比较少的情况。
(3)数据组装
分两次查询,最后将所有结果
(4)ER分片
关系型数据库中,如果可以先确定表之间的关系,并将那些存在关联关系的表记录存放在同一个时间片上,就能避免跨分片join问题。

3、跨节点分页,排序,函数等问题
需要在不同的节点中进行排序,然后将不同分片返回的结果集进行汇总,再次排序,最后返回给用户。

4、全局ID避免重复问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值