TiDB Vector 本地部署的亲身体验与心得

作者: CuteRay

今年4月份,TiDB 的向量特性正式开放给大家体验,当时只能在 TiDB Cloud上提交申请,体验、试用。半年的时间过去了,如今想体验TiDB Vector的功能已经不需要提交申请,直接在 TiDB Cloud 创建一个集群,新创建的集群虽然版本还是V7.1.3,但是默认就自带向量功能了。

这里弄一个demo,体验一下。

复制代码
-- 创建一张带有向量字段的表,长度是3维
USE test;
CREATE TABLE embedded_documents (
    id INT PRIMARY KEY,
    document  TEXT,
    embedding VECTOR(3)
);

-- 往表中插入向量数据
INSERT INTO embedded_documents VALUES
	(1,'大语言模型','[2.1,4.5,6.7]'),
	(2,'大语言模型实践','[2.6,4.1,7.1]'),
	(3,'TiDB V7.1.5 文档','[0.7,2.8,8.7]'),
	(4,'TiDB 从入门到入土','[0.9,2.3,8.1]'),
	(5,'语文(六年级)','[4.1,4.5,7.7]'),
	(6,'golang 从入门到入土','[3.1,4.5,5.7]');

-- 根据指定的向量做搜索
SELECT *, vec_cosine_distance(embedding, '[1.3,2.6,5.8]') as distance FROM embedded_documents ORDER BY distance;

+----+---------------------------+---------------+----------------------+
| id | document                  | embedding     | distance             |
+----+---------------------------+---------------+----------------------+
|  2 | 大语言模型实践            | [2.6,4.1,7.1] | 0.010422578786698833 |
|  3 | TiDB V7.1.5 文档          | [0.7,2.8,8.7] | 0.013749613899774693 |
|  4 | TiDB 从入门到入土         | [0.9,2.3,8.1] | 0.014722191279520014 |
|  1 | 大语言模型                | [2.1,4.5,6.7] | 0.015064725667609857 |
|  5 | 语文(六年级)            | [4.1,4.5,7.7] | 0.031277385366076604 |
|  6 | golang 从入门到入土       | [3.1,4.5,5.7] |   0.0475918144531462 |
+----+---------------------------+---------------+----------------------+
6 rows in set (0.09 sec)
image-20241025112433476

这里的distance就是两个向量之间的相似度,这个相似度是用vec_cosine_distance函数计算出来的,意味着两个向量之间的夹角越小相似性越高,夹角大小用余弦值来衡量。

这也意味着不管两个向量是否有关联性,总是能计算出一个相似度, distance越小相似度越高。

上述就是最直接、最简单的体验 TiDB Vector 的方式了,但是某些企业受限于网络,无法访问TiDB cloud,无法连接到 TiDB serverless 服务,导致无法正常体验这一非常有意思的功能,非常可惜,于是这里教大家一种在本地编译部署的方式去体验 TiDB Vector。

理论基础

在内核设计上,TiDB 分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的 TiDB 系统。

tidb-architecture-v6

通过架构图不难看出,TiDB 有一个非常大的优势,各组件是分离的,存储、计算、调度完全分开,各个组件分别负责各自的功能,彼此之间通过各种 API 进行通信。其中 TiDB Server 属于计算层,或者说 SQL 层,主要负责接受客户端的连接,执行 SQL 解析和优化,最终生成执行计划。TiKV 属于存储层,主要负责存储数据,以及事务支持。PD 则是整个集群的元信息管理模块。

想体验 TiDB Vector 功能,在 TiDB 集群中,首先就需要搞定 TiDB Server,最起码让 TiDB 能够解析对应的 SQL 语法,理解相关的字段类型,比如 VECTOR

其次,可能需要对存储层做一点处理,毕竟向量数据与普通的数据还是存在着区别。PD 层则不需要过多关注,对主要功能来说,应该没有影响,有影响再做单独处理。

搞定以上步骤,一个 '定制化' 的 TiDB 集群架子就有了,接下来考虑的就是如何部署到服务器上了。这里的思路其实也很简单,先通过 tiup 部署启动一个正常的 TiDB 集群,接着通过 tiup cluster patch ,把我们定制的组件替换进正常 TiDB 集群中就好了。

替换完成之后,就会得到一个支持 TiDB Vector 功能的本地化部署的 TiDB 集群。

理论存在,实践开始!

实践部署

第一步,搞定支持向量功能得 TiDB Server 组件。这个当然不是让你去开发一个,别忘了,TiDB 集群中所有组件均是开源的,既然 TiDB Serveless 新创建的集群都支持 TiDB Vector功能,那就往往意味着,其开源版本中,有一个分支能找到相关源代码,供我们编译部署安装。最简单的就是去查看master 分支,先去PARSER 模块中,找 parser.y 文件中 VECTOR 关键字,找到其再 ast 语法树中对应的类型。然后再在实现 COLUMN TYPE 的位置搜索关键词 TypeTiDBVectorFloat32

image-20241028111018420
image-20241028111352389

接下来就是将 master 分支的代码编译启动 ,尝试看支不支持向量功能。(具体怎么编译启动TiDB 源码,这里就不做过多介绍,感兴趣的小伙伴可以去看这篇文章:专栏 - TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解(文末彩蛋) | TiDB 社区)

image-20241028141709418

通过编译启动 TiDB Server 的源码,简单测试了一下,发现对于向量功能的支持是完全OK的,那接下来需要做的事情,就是将源码编译打包成二进制文件,这点在源码的 ./cmd/tidb-server/目录下执行 go build 就行,然后就会得到一个名称为 tidb-server 的二进制文件,将这个二进制文件打包成 .tar.gz 格式,这样我们就做好了一个定制化的 patch 包了。

同理,将 tikv 源码的 master 分支也编译打包成二进制文件,然后打包压缩成 .tar.gz 格式,具体编译打包方式跟 tidb server 不太一样,具体可以参考 tikv 源码的 contributing 文档 。

image-20241028143259321

完成前面的步骤,我们会得到两个 .tar.gz 的包,如下图:

image-20241028143148567

有了这两个包之后,就可以开始对正常的集群来进行打 patch ,来实现我们想要的功能了。

有了这两个包之后,就可以开始对前面正常的集群来进行打patch ,来实现我们想要的功能了。

image-20241028115305923

完成整个 patch 操作之后,display 集群,集群中的 tidbtikv 节点会带有 patch 标识。

image-20241028115409262

完成打包之后,就可以简单测试一下新集群向量功能了。

image-20241028144141239

接下来就是开始愉快的基于向量数据库的 AI 之旅了!

相关推荐
赵渝强老师5 天前
【赵渝强老师】TiDB SQL层的工作机制
数据库·sql·tidb
观测云13 天前
TiDB 可观测性最佳实践
tidb
赵渝强老师16 天前
【赵渝强老师】使用TiDB的审计日志
数据库·tidb
可观测性用观测云18 天前
TiDB 可观测性最佳实践
tidb
Sirius Wu18 天前
TiDB 深度解析与 K8S 实战指南
容器·kubernetes·tidb
PingCAP19 天前
PingCAP“一号员工”唐刘:回顾我与 TiDB 的十年成长之旅
数据库·tidb
转转技术团队20 天前
告别人工搬运!TiDB/MySQL双库同步工具如何为业务提效100%?
mysql·tidb·测试
MiniFlyZt25 天前
分布式数据库TiDB:架构、核心特性与生产实践(分库分表)
java·数据库·分布式·spring cloud·微服务·tidb
PingCAP1 个月前
从单一到多活,麦当劳中国的数据库架构迁移实战
数据库·tidb
XMYX-01 个月前
TiDB 部署指南(单机模式)& CentOS 7 安装 MariaDB 教程
centos·tidb·mariadb