什么是分布一致性

这是一个相当灵魂拷问的问题了,在我们应对千万级甚至亿级的资源访问时,一定会用到的一个词,就是分布式

因为一台服务器的承载力是有限的,而数据库更是有限的,数据表是更更更有限的,我们只能通过横向扩容的方式来进行数据存储量和查询速度的优化

可这样会造成一个问题,分库分表后,分布式系统中,唯一主键ID的生成问题,当我们使用mysql自增长主键时,他只在本表中是唯一的, 在分布式系统中,两张表都有一张ID为1的数据,那么显然就无法使用这个自增长了

如果我们说使用uuid,也可以凑活用,但是,第一他是无序的,第二,他占用空间巨大,耗费空间。

uuid只能适用于类似生成token令牌的场景


SnowFlake

SnowFlake(雪花算法),是Twitter提出来的一个算法,其目的是生成一个64bit的整数

1位标识符,始终是0

41位的时间戳

10位的机器标识码

  • 前5位代表数据中心,后面5位是某个数据中心的机器ID

12位的递增序列

  • 用来对同一个毫秒之内产生不同的ID,12位可以最多记录4095个,也就是在同一个机器同一毫秒最多记录4095个,多余的需要进行等待下毫秒。

python实操

首先安装pip install pysnowflake

然后终端启动snowflake服务

snowflake_start_server --worker=1

这里的worker就是当前节点的标识

上代码:

import snowflake.client
print(snowflake.client.get_guid())
# 多次输出一下,就会发现,有递增的连续性

将其转换成二进制码

print(bin(4431128039883018241))

然后我们通过二进制码反推

  • 第一位是标识符
  • 往后41位是时间戳

从右方数,12位的递增序列,再数5位就是机器标识,这个机器标识就是某个节点的存储标识00001

但是啊,目前他是二进制,我们再将其转换为10进制

print(int('00001',2))