snowflake
Snowflake 风格 64 位 ID 生成与序列工具
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
snowflake | 2.5.0 | FUNC | PostgreSQL | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 4590 | snowflake | 否 | 是 | 否 | 是 | 否 | 否 | snowflake |
works on pgedge kernel fork. Set snowflake.node (1..1023) before using snowflake.nextval().
版本
| 类型 | 仓库 | 版本 | PG 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | PIGSTY | 2.5.0 | 1817161514 | snowflake | - |
| RPM | PIGSTY | 18.4 | 1817161514 | pgedge-$v | - |
| DEB | PIGSTY | 18.4 | 1817161514 | pgedge-$v | - |
构建
您可以使用 pig build 命令构建 snowflake 扩展的 RPM / DEB 包:
BASH
安装
您可以直接安装 snowflake 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
BASH
使用 pig 或者是 apt/yum/dnf 安装扩展:
安装
BASH
pig
BASH
dnf
BASH
apt
BASH
创建扩展:
SQL
用法
来源:
snowflake 生成分布式 bigint 标识符,从时间戳、节点标识符和毫秒计数器中产生。现有的 PostgreSQL 序列可以被转换,使得表的默认值继续使用 nextval(...) 同时生产 Snowflake ID。
SQL
配置
在 postgresql.conf 中为每个可写的节点分配一个唯一的标识符,然后重新加载 PostgreSQL:
INI
在同一时间可以写入的服务器上重复使用节点标识符可能会生成重复的 ID。
转换一个序列
创建一个普通的 PostgreSQL 序列,然后转换其定义。引用列中的现有值不会被重写。
SQL
函数
| 函数 | 描述 |
|---|---|
snowflake.nextval([sequence regclass]) | 生成下一个 Snowflake ID(如果没有指定序列,则使用内部序列) |
snowflake.currval([sequence regclass]) | 返回序列的当前值 |
snowflake.get_epoch(snowflake int8) | 提取时间戳为纪元(自2023-01-01以来的秒数) |
snowflake.get_count(snowflake int8) | 提取计数值部分(每毫秒重置) |
snowflake.get_node(snowflake int8) | 提取节点标识符 |
snowflake.format(snowflake int8) | 返回包含 node、ts 和 count 字段的 JSONB |
示例
SQL
审查与升级
使用 psql \d+ 或 PostgreSQL 系统目录审查转换后的表默认值。它们应该调用 snowflake.nextval(...) 而不是原来的 nextval(...)
SQL
版本 2.5.0 修复了导出/恢复被转换序列的 MAXVALUE 设置为正常 bigint 最大值的问题。它还修复了受影响序列的转换 SQL 并增加了对 PostgreSQL 18 的支持。
注意事项
- 转换会改变序列定义,而不是已经存储在表行中的 ID。
- Snowflake 生成器每毫秒最多可以发出 4096 个计数值。不要将序列增量配置为超过 4096。
- 保持节点标识符在整个并发写入的生命周期内稳定且唯一;将其作为集群规划和故障转移流程的一部分进行记录。
- 在逻辑复制或涉及转换后序列定义的滚动更改之前,在每个节点上安装相同的扩展版本。