共计 2097 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
传统编译安装 PostgreSQL 经常遇到依赖地狱问题,特别是需要集成扩展时。而随着 AI 应用爆发,直接处理向量数据的需求越来越普遍——比如推荐系统的特征匹配、NLP 的语义搜索等场景。pgvector 扩展让 PostgreSQL 原生支持向量运算,避免了维护单独向量数据库的复杂度。

技术选型
- 源码编译:灵活但耗时,需要手动解决所有依赖,升级维护成本高
- Yum 安装:分钟级部署,自动处理依赖,官方仓库保证版本兼容性
选择 PostgreSQL 官方 Yum 仓库的原因:
- 比 EPEL 仓库更新及时
- 提供配套的 contrib 模块
- 长期维护的 RPM 包经过充分测试
核心实现
配置 Yum 仓库
# CentOS 7/ 8 通用命令
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安装 PostgreSQL 15
# 安装核心服务端和客户端
sudo yum install -y postgresql15-server postgresql15-contrib
# CentOS 7 需要手动初始化(8 会自动执行)if [$(rpm -E %{rhel}) -eq 7 ]; then
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
fi
# 启动服务
sudo systemctl enable postgresql-15
sudo systemctl start postgresql-15
安装 pgvector 扩展
# 安装编译依赖
sudo yum install -y gcc make postgresql15-devel
# 下载源码(建议使用最新 release 版)wget https://github.com/pgvector/pgvector/archive/refs/tags/v0.5.1.tar.gz
tar xvf v0.5.1.tar.gz
cd pgvector-0.5.1
# 编译安装
make PG_CONFIG=/usr/pgsql-15/bin/pg_config
sudo make install PG_CONFIG=/usr/pgsql-15/bin/pg_config
关键配置
postgresql.conf 调优
# 内存分配(按服务器实际配置调整)shared_buffers = 4GB # 通常分配 25% 内存
work_mem = 16MB # 每个操作的内存配额
maintenance_work_mem = 512MB # 维护操作内存
# 向量运算相关
max_worker_processes = 8 # 并行计算进程数
max_parallel_workers_per_gather = 4 # 每个查询的并行度
数据库内启用扩展
-- 创建扩展
CREATE EXTENSION vector;
-- 创建带向量字段的表
CREATE TABLE items (
id BIGSERIAL PRIMARY KEY,
embedding vector(384) -- 根据模型维度设置
);
-- 创建 HNSW 索引(适合高维向量)CREATE INDEX ON items USING hnsw (embedding vector_l2_ops);
生产建议
- 内存分配:
- 监控
pg_stat_activity避免 work_mem 溢出 -
大批量导入时临时增大 maintenance_work_mem
-
向量维度:
- OpenAI embeddings 通常 768 维
-
超过 2000 维建议测试性能衰减
-
常见错误:
libstdc++.so.6: version GLIBCXX_3.4.XX not found:sudo yum install -y libstdc++-static
验证测试
Python 测试脚本示例:
import psycopg2
import numpy as np
conn = psycopg2.connect(dbname='postgres', user='postgres')
cur = conn.cursor()
# 生成测试向量
vec1 = np.random.rand(384).tolist()
vec2 = (np.random.rand(384) * 0.5).tolist()
# 插入数据
cur.execute("INSERT INTO items (embedding) VALUES (%s), (%s)",
(vec1, vec2))
# 相似度查询
cur.execute("""
SELECT id, embedding <-> %s AS distance
FROM items
ORDER BY distance LIMIT 1
""", [vec1])
print(cur.fetchall())
conn.commit()
conn.close()
思考题
当面对以下场景时,可能需要考虑专用向量数据库:
– 十亿级向量实时搜索
– 需要分布式横向扩展
– 对 ANN 算法有特殊调优需求
但 pgvector 的优势在于:
– 与业务数据天然共存
– 支持完整 ACID 事务
– 复用现有 PostgreSQL 运维体系
建议通过实际业务场景的 QPS 和召回率测试来评估是否满足需求。
正文完
发表至: 数据库技术
近两天内
