在分布式系统中使用雪花数,在Python使用pysnowflake生成雪花数示例
UUID和雪花数的比较
Python中使用pysnowflake生成雪花数
在分布式系统中生成雪花数
参考文档
在分布式系统中使用雪花数,在Python使用pysnowflake生成雪花数示例
在数据库表设计时,表的主键一般可以用:
数据库自增长的IDENTITY,自动递增的正整数
程序生成的UID
一般情况下,使用数据库自增长的IDENTITY就可满足要求,但是在分库分表的情况,就只能使用程序生成的UID。
UUID和雪花数的比较
相比常见的64位数字字母随机数的UUID,使用雪花算法(snowflake)生成雪花数的方法更好:
UUID 雪花数
全局唯一 支持 支持
有序,可以支持排序、比较 无序 支持,大致有序,按时间排序
节约存储空间 64位数字字母随机组合的字符串 19位正整数,更节约存储空间
根据UID查询速度快,且稳定 数据库根据索引查询速度不稳定 数据库根据索引查询速度快且稳定
防止被恶意推测 支持 支持
带有业务属性 无 无
限制条件 全局唯一性依赖于生成随机数的种子和随机数的长度 需要单独部署雪花数生成器;依赖于生成器的时间戳。
为什么叫雪花数,因为据说世界上每一朵雪花都是独一无二的。
雪花数算法参见:
https://github.com/twitter-archive/snowflake/tree/snowflake-2010 Python中使用pysnowflake生成雪花数
参考:
https://pysnowflake.readthedocs.io/en/latest/
安装pysnowflake:
pip install pysnowflake
1
启动雪花数生成器:snowflake_start_server
1
在程序中获取雪花数:import snowflake.client
for _ in range(20):
print(snowflake.client.get_guid())
生成的雪花数为按时间戳排序的19位正整数,对应MySQL bigint unsigned数据类型。
在分布式系统中生成雪花数
在分布式系统中生成雪花数时,还需要考虑高性能和高可用。
可以在每个业务服务器节点上都部署雪花数生成器,并用不同标识区分:
# 节点1
snowflake_start_server --worker=1# 节点2
snowflake_start_server --worker=2
也可以在启动雪花数生成器的脚本中,将IP地址的最后一段用来作为worker的标识ip=$(ip route get 1 | awk '{print $NF;exit}')
ip_suffix=$(echo $ip | cut -d'.' -f 4)
snowflake_start_server --worker=$ip_suffix
应用只需从本机的雪花数生成器去获取雪花数,避免了远程调用网络延迟。
参考文档
https://github.com/twitter-archive/snowflake/tree/snowflake-2010
https://pysnowflake.readthedocs.io/en/latest/
MySQL分库分表使用Snowflake全局ID生成器
https://github.com/erans/pysnowflake
雪花算法分析与实现