查看原文
其他

Pigsty v2.3.1:HNSW版PGVECTOR来了!

冯若航 非法加冯 2023-11-09

Pigsty v2.3.1 发布了 🎉,这个版本中 PGVECTOR 迎来 v0.5 史诗级更新,添加了新的 HNSW 索引支持。也对新发布的 PostgreSQL 16 RC1 提供了支持。此外,官方文档现在提供中文版本,现有文档也进行了丰富与完善。最后,还有例行的软件版本更新与问题修复。

顺带一提,PGSQL x Pigsty 交流群新开3群了,对 PostgreSQL 与 Pigsty 感兴趣的朋友可以直接扫码加入(仅限前200人),如果加入不了请微信搜索 pigsty-cc 小助手加入。

Pigsty :更好的RDS PG开源替代

HNSW 版 PGVECTOR?

PGVECTOR 是一个非常实用强大的 PostgreSQL 扩展插件,允许您在现有的关系型数据库 PostgreSQL 上拥有完整的向量数据存储检索能力。在先前的公众号文章中,我们已经介绍了此扩展:


AI大模型与向量数据库 PGVECTOR

向量是新的JSON


9月1号,PGVECTOR 发布了一个重大版本更新 v0.5 ,引入了一种全新类型的索引:HNSW 。在 ANN Benchmark 中,召回率和性能表现上相比原有的 IVFFLAT 索引都有巨大的提升,在综合性能表现上相比专业向量数据库毫不逊色! 此外,在距离的性能上相比 0.4.4 有显著提升(特别是L2欧式距离)。最后是 IVFFLAT 索引的并行创建能力:可以让耗时的索引创建操作加速N倍!

引用 Jonathan Katz 的 ANN Benchmark 评测结果


向量数据库的利弊权衡

向量数据库索引算法也有一个 “不可能三角”:质量、效率、成本

质量:查询结果的召回率(正确程度)

效率:查询的响应时间

成本:查询所需的内存大小//索引构建速度

对于向量数据库的典型场景 —— 语义搜索而言。最重要的属性毫无疑问是召回率,这会直接影响终端用户的体验。性能通常来说不是大问题,够用就行:模型编码耗时通常在几十毫秒到上百毫秒,把10毫秒的查询优化到1毫秒对用户体验来说毫无意义;吞吐可以通过无限拖从库的方式解决。内存使用/构建速度通常是最不重要的 —— 对用户无感知,而且只要能跑起来,以目前的内存价格,加钱加资源能解决的问题通常不算什么问题。

经典的暴力全表搜索算法有着无可替代的最好质量,但是性能很差,所需内存资源极少(顺序扫一遍,轮流载入内存)。PGVector 原先使用的 IVFFLAT 索引有着很好的性能,但召回率表现一般,内存使用一般。而现在新增的 HNSW 索引,在召回率和性能上都有优秀的表现,最大的缺点在于索引构建速度/内存使用量高。

HNSW 算法几乎是专用向量数据库的标配,因为它在质量、性能上都有优异的表现。虽然有索引构建速度慢的缺陷,但它也有几个额外的好处:

  • “增量维护”:使用 HNSW索引,您可以在空表上创建索引并随时添加向量,而不会影响召回率!这与 IVFFLAT 不同:IVFFLAT在构建索引之前首先需要加载向量数据,使用 Kmeans 以找到最佳中心点,才能有最好的召回率。当您更新了许多数据时,可能需要重建索引,才能有最好的召回效果。

  • 更新和删除:pgvector 的 HNSW 实现允许更新删除,你可以使用标准的 UPDATE / DELETE 语句。许多 HNSW 向量数据库实现都不支持这一功能!

这意味着 HNSW 索引几乎不需要什么额外的维护工作:您可以并发写入/更新,增量维护,在不影响读写请求的前提下新建索引,也不用担心数据的变化会影响索引的质量。数据是持久化的,受到PITR时间点恢复的保护,并且可以使用标准 WAL 基础设施可无缝复制到从库上。

PGVector 的 HNSW 实现性能表现优异,根据 Jonathan Katz 的测试结果,显著优于 pg_embedding (基于磁盘的实现) 的表现。各种 PostgreSQL 的向量扩展分叉恐怕要面对巨大的生存竞争压力了。

与此同时,原有的 IVFFLAT 索引也有一系列改进:您现在可以并行创建 IVFFLAT 索引了。视并发程度可以加速几倍到十几倍不等。而距离度量函数的性能也进行了优化,例如 L2 距离计算在 ARM64 下有 36% 的性能提升。

PGVECTOR 的战略卡位

实现一个向量数据类型/索引功能只需要几千行代码,而实现 PostgreSQL 这样功能完备稳定可靠的数据库需要的是百万行级的代码,复杂度根本不可同日而语。一个合格的向量数据库 首先得是一个合格的数据库,而从零开始做到这一点并不容易。错误的路线将耗费百倍力气做无用功,PGVector 选择站在巨人的肩膀上,而不是造土法轮子重新发明一个数据库,这是明智而务实的做法。

例如,您可以将向量功能与各种 PostgreSQL 提供的功能组合使用:使用表达式索引只索引一部分感兴趣的内容,实时查看索引创建进度,不阻塞读写请求在线创建/重建索引,使用多个进程并发创建索引。

当然,您也可以将 Vector 模糊搜索 / 语义搜索 与 PostgreSQL 原有的全文检索/倒排索引功能组合使用,提供可解释性更佳的搜索结果。 您也可以继续使用标准 SQL 对元数据/各种字段进行精准的过滤,将精确搜索与模糊搜索相结合。并避免在多个专用数据组件中来回搬运数据的烦恼。


专用向量数据库本来唯一能拿的出手的亮点特色就是性能,然而 pgvector 的 HNSW 实现让这唯一的亮点都面临挑战,恐怕我们很快就会看见地理数据库、文档数据库、时序数据库、分布式数据库的历史再一次上演。

最近我会专门写一篇文章,聊一聊向量数据库的选型, pgvector 0.5 的新特性,以及 HNSW / IVFFLAT 索引的实现原理与使用上的利弊权衡。

PostgreSQL 16 RC 1

PostgreSQL 16 的第一个候选发布版本 RC1 于9月1号释出!正式发布日期为 9月14日。

Pigsty 也许是最先提供 PostgreSQL 16 支持的发行版:从 16 beta1 就支持了。尽管目前仍然没有正式发布,但你已经可以拉起 PostgreSQL 16 的高可用集群。PostgreSQL 16 有一些比较实用的新功能:从库逻辑解码与逻辑复制,针对I/O的新统计视图,全连接的并行执行,更好的冻结性能,符合 SQL/JSON 标准的新函数集,以及在HBA认证中使用正则表达式。

Pigsty 特别关注 PostgreSQL 16 中的可观测性改进,新的 pg_stat_io 视图,让用户可以直接从数据库内访问到重要的 I/O 统计指标,对于性能优化,故障分析具有非常重要的意义。在以前,用户只能在数据库/BGWriter上看到有限的统计指标,想要更精细的统计数据,只能关联操作系统层面的I/O指标进行分析。现在,你可以从后端进程类型/关系类型/操作类型三个维度,对读/写/追加/回刷/Fsync/命中/逐出等行为进行深入的洞察。

另外一个非常有价值的可观测性改进点是,pg_stat_all_tables 与 pg_stat_all_indexes 会记录最后一次顺序扫描 / 索引扫描的时间。尽管这个功能在 Pigsty 的监控系统中可以通过扫描统计图表实现,但官方提供直接的支持肯定更好:用户可以直观地得出一些结论:比如某一个索引是不是没用上可以考虑移除。此外,n_tup_newpage_upd 指标可以告诉我们表上有多少行在更新时不是在页内原地更新,而是移动到了一个新的页面上,这个指标对于优化 UPDATE 性能,调整表填充因子具有重要的参考价值。

在 Pigsty v2.3.1 中,EL 8 / EL 9 的离线软件包中已经默认收录了 PostgreSQL 16 RC1 的RPM包。并将在下个 Release 中立即跟进 PostgreSQL 16 的正式版本。

中文文档

从 v2.0 开始,Pigsty 的官方文档就一直只有英文。不过从这个版本开始,中文文档又回来了!多亏了 GPT-4 提供了高质量的中英互译。原有的英文文档,也新增了许多补充内容。

此外,原有 Github Pages 托管文档的地址是 https://vonng.github.io/pigsty/ ,现在则有了一个新的专用域名 https://doc.pigsty.cc 。针对墙内用户访问不便的问题,我们还提供了镜像的官方站点: https://pigsty.cc ,这里的中英双语文档都也都已经更新至 v2.3.1 最新版本。

另一个变化是,Pigsty的公开Demo https://demo.pigsty 现在也使用机构签发的正规 HTTPS 证书,而不是 Pigsty 自签名的证书了。 

Pigsty.cc 官方网站也进行了修缮整理:本公众号的往期系列文章 《数据库正本清源》 和 《云计算泥石流》都已经搬运到了 https://pigsty.cc 中。进行校正整理,以飨读者。

测试环境

在以前,Pigsty 的测试一直是个头疼的问题:需要对五个受支持的PG数据库大版本(PG 12,13,14,15,16),三个操作系统的大版本(EL7,EL8,EL9),以及几种操作系统的兼容发行版变体(RHEL,CentOS,Alma,Rocky)之间的排列组合进行测试。

所以在 v2.3.1 中,提供了一个新的配置文件 check.yml ,一次性拉起 30 台不同操作系统、不同大版本、不同规格的数据库集群进行测试。这个配置文件(check.yml),也演示了不同大版本的安装方式,具有一定的参考价值。


问题修复

Pigsty v2.3.1 修复了 v2.3.0 中的两个问题。

第一个问题与 Watchdog 有关:当您希望在极端情况下避免脑裂,可以将 patroni_watchdog_mode 参数设置为 required ,在这种情况下,Patroni 的服务现在将自动执行 modprobe softdog 与 chown postgres watchdog 操作,确保 Patroni 拥有 watchdog 的使用权限。

第二个问题是关于从上游下载软件包的:当您下载的软件包中使用了通配符 '*' 时,现在会使用单引号扩起转义,避免受到目标目录中已有软件包的影响。

软件更新

此外,在离线软件包中,一些软件包也更新到了最新的版本。例如,Grafana 升级到了 v10.1 ,引入了一些有趣的新特性。Loki / Promtail 升级至 2.8.4 ,提供 MongoDB 兼容性的中间组件 FerretDB 升级到了 1.9,PG日志分析组件 pgbadger 升级至了 1.12.2,TimescaleDB 扩展升级至了 2.11.2。

Pigsty v2.3.1 的默认软件包中还添加了 SealOS,这是一个快速部署 Kubernetes 集群的精简二进制软件。Pigsty 会在后续版本中对 Kubernetes,以及 Kubernetes 中的数据库有进一步的支持。

Release Note

Pigsty v2.3 发布:应用生态丰富

Pigsty v2.2 发布 —— 监控系统大升级

Pigsty v2.1 发布:向量扩展 / PG12-16 支持

Pigsty v2.0.2 更好的开源RDS替代:Pigsty

Pigsty v2.0 发布,炮打 RDS

Pigsty v2 正式发布:更好的RDS PG开源替代

Pigsty v1.5.1发布

Pigsty v1.5 发布与新特性

Pigsty v1.4 正式发布!

Pigsty v1.4 前瞻

Pigsty v1.3.1 安装教程

开箱即用的Redis发行版 —— Pigsty v1.3

Pigsty v1.2 发布

Pigsty v1.1 发布/新功能介绍

Pigsty v1正式发布:开箱即用的PostgreSQL开源发行版



继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存