Milvus:数据库层操作详解(二)

一、概述​

本篇文章聚焦于 Milvus 向量数据库,旨在帮助各位全面掌握其数据库操作,从而提升在数据管理方面的能力。在接下来,我们将深入探讨 Milvus 数据库的基础概念,通过实际操作演示让大家直观感受其强大功能,并针对使用过程中可能遇到的常见问题进行详细解答。希望通过本篇文章,大家能够熟练运用 Milvus 进行数据管理,为后续工作和学习提供有力支持。

二、基础知识讲解​

(一)数据库的基本概念​

在数字化时代,数据如同企业的 "石油",是一种极为珍贵的资源。而数据库,则是存储和管理这些宝贵数据的 "仓库"。简单来说,数据库是按照一定的结构组织并长期存储在计算机内、可共享的数据集合 ,它不仅包含数据本身,还包括用于管理这些数据的软件系统,即数据库管理系统(DBMS)。​

我们可以用图书馆来类比数据库。图书馆里存放着各种各样的书籍,为了方便读者查找,图书管理员会对书籍进行分类、编号,并记录每本书的相关信息,如书名、作者、出版社等。这些书籍和相关信息就相当于数据库中的数据。而图书馆的管理系统,比如用于登记借阅信息、查询书籍位置的软件,就类似于数据库管理系统,负责对数据进行管理和维护。​

在实际应用中,数据库有着广泛的用途。以电商平台为例,它需要存储大量的商品信息,包括商品名称、价格、库存、图片等,这些信息都保存在数据库中。当用户在平台上搜索商品时,数据库会快速检索并返回相关结果。同时,用户的订单信息、购买记录等也会存储在数据库里,方便电商平台进行订单处理、数据分析等操作。再比如社交网络,用户的个人资料、好友关系、发布的动态等数据都依赖数据库进行存储和管理。通过数据库,社交网络能够实现用户登录验证、动态展示、好友推荐等功能。​

在 Milvus 中,数据库作为组织和管理数据的逻辑单元,具有更加重要的意义。为了提高数据安全性并实现多租户,我们可以创建多个数据库,为不同的应用程序或租户从逻辑上隔离数据。比如说,一家公司有多个业务部门,每个部门都有自己的数据需求。我们可以为销售部门创建一个数据库,专门存储销售数据,如客户信息、订单记录等;为研发部门创建另一个数据库,用于存储研发过程中的实验数据、代码文件等。这样,不同部门的数据相互隔离,既保证了数据的安全性,又提高了数据管理的效率。​

多租户是一种软件架构技术,它使得单个软件实例能够为多个不同的用户组(即租户)提供服务。这些租户在使用软件系统时,感觉就像是在使用自己独占的系统,但实际上他们共享软件的基础设施、数据库、服务器等资源 。在 Milvus 的数据库中采用多租户技术,就像一座公寓楼,每个租户都有自己独立的房间(相当于独立的数据空间),但他们共享楼梯、电梯、水电等基础设施(相当于共享数据库的底层资源)。这种方式不仅降低了成本,还提高了资源的利用率。同时,通过严格的数据隔离机制,确保每个租户的数据安全,不会相互干扰。​

(二)Milvus 数据库的独特之处​

与传统数据库相比,Milvus 数据库在架构和功能上都有着显著的创新。许多传统数据库主要面向结构化数据,采用表格形式存储数据,而 Milvus 则专注于向量数据的存储和检索,在集合之上引入了数据库层,这是一个非常独特的设计。它就像是在一个大型商场里,不仅有各个店铺(集合),还设置了不同的楼层(数据库层)来对店铺进行分类管理,使得数据的组织和管理更加高效。​

以常见的关系型数据库 MySQL 为例,MySQL 擅长处理结构化的事务数据,如银行的交易记录、企业的财务报表等。它通过 SQL 语言进行数据操作,注重数据的一致性和事务的完整性。而 Milvus 主要应用于人工智能领域,处理高维向量数据,如图片的特征向量、文本的嵌入向量等。在图片搜索场景中,我们可以将图片转换为向量存储在 Milvus 中,当用户上传一张图片进行搜索时,Milvus 能够快速找到与之相似的图片,这是传统数据库难以实现的。​

在支持多租户方面,Milvus 也展现出了强大的优势,极大地拓展了应用场景。在云计算环境下,多个企业可能共用一个云服务提供商的基础设施。通过 Milvus 的多租户功能,云服务提供商可以为每个企业创建独立的数据库,每个企业的数据相互隔离,保证了数据的安全性和隐私性。同时,企业在使用过程中,就像拥有自己独立的数据库一样,能够灵活地进行数据管理和操作。比如,一家云服务提供商为多家电商企业提供服务,每个电商企业都有自己的商品数据、用户数据等。通过 Milvus 的多租户功能,云服务提供商可以轻松地为这些电商企业提供隔离的数据空间,满足它们各自的业务需求。

三、操作流程演示​

(一)创建数据库​

在实际应用中,创建数据库是我们使用 Milvus 进行数据管理的第一步。接下来,我们将通过代码示例,用 pymilvus 库展示创建数据库的两种方式。​

首先,我们需要导入必要的库并初始化客户端。代码如下:

python 复制代码
from pymilvus import MilvusClient
client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)

这里,uri指定了我们要连接的 Milvus 服务的地址,token则是用于身份验证的凭证,就像我们进入一个系统需要输入用户名和密码一样。​

普通创建数据库的方式非常简单,只需指定数据库名称即可。示例代码如下:

python 复制代码
client.create_database(db_name="my_database_1")

在这段代码中,db_name参数指定了要创建的数据库的名称为my_database_1。就好比我们要在一个仓库里划分不同的区域,这里我们创建了一个名为my_database_1的区域,后续可以在这个区域里存放数据。​

除了普通创建方式,我们还可以在创建数据库时为其设置属性。例如,设置数据库的副本数量:

python 复制代码
client.create_database(
    db_name="my_database_2",
    properties={
        "database.replica.number": 3
    }
)

在这个示例中,properties参数用于设置数据库的属性。database.replica.number表示数据库的副本数量,这里我们将其设置为 3。副本的作用就像我们有多个相同的文件备份,当一个副本出现问题时,其他副本可以继续提供服务,从而提高了数据的可用性和可靠性。比如在一个电商系统中,订单数据非常重要,通过设置多个副本,可以确保在高并发的情况下,订单数据的读取和写入都能稳定进行。

(二)查看数据库​

创建数据库后,我们常常需要查看数据库的相关信息,以便了解我们创建的数据库是否正确,以及当前系统中都有哪些数据库。接下来,我们演示使用 SDK 列出所有数据库和查看指定数据库详细信息的操作。​

列出所有现有数据库的代码如下:

python 复制代码
client.list_databases()

执行上述代码后,会返回一个包含所有数据库名称的列表。例如,输出可能如下:

python 复制代码
['default','my_database_1','my_database_2']

这里的default是 Milvus 系统默认创建的数据库,my_database_1和my_database_2则是我们刚刚创建的数据库。这个列表就像是一个仓库的目录,我们可以通过它快速了解仓库里都有哪些区域(数据库)。​

查看指定数据库详细信息的代码如下:

python 复制代码
client.describe_database(db_name="default")

执行这段代码后,会返回指定数据库的详细信息。以default数据库为例,输出可能如下:

python 复制代码
{"name": "default"}

这里只返回了数据库的名称,在实际应用中,如果数据库设置了其他属性,也会在这里显示出来。通过查看数据库详细信息,我们可以了解数据库的各种配置,就像我们查看一个仓库区域的详细说明,以便更好地管理和使用它。

(三)管理数据库属性​

每个数据库都有自己的属性,这些属性对于数据库的性能和管理有着重要的影响。接下来,我们介绍数据库属性种类及作用,并通过代码演示更改和删除属性的操作。
数据库属性有很多种,以下是一些常见的属性及其作用:

  • database.replica.number:整数类型,指定数据库的副本数量。如前文所述,副本数量的设置可以提高数据的可用性和可靠性。
  • database.resource_groups:字符串类型,以逗号分隔的列表形式列出的与指定数据库相关的资源组名称。资源组可以帮助我们对数据库使用的资源进行管理和分配,就像将不同的工具分配到不同的小组,以便更好地使用和管理。
  • database.diskQuota.mb:整数类型,指定数据库的最大磁盘空间大小(MB)。通过设置这个属性,可以控制数据库占用的磁盘空间,避免磁盘空间被过度占用。例如,在一个共享的服务器环境中,为每个数据库设置合理的磁盘配额,可以保证各个数据库都能正常运行,不会因为某个数据库占用过多磁盘空间而影响其他数据库。
  • database.max.collections:整数类型,指定数据库中允许的最大 Collections 数量。Collections 类似于数据库中的表,设置这个属性可以限制数据库中表的数量,有助于管理数据库的结构和性能。
  • database.force.deny.writing:布尔类型,是否强制指定的数据库拒绝写操作。当我们需要对数据库进行维护或者保护数据不被意外修改时,可以设置这个属性为True,禁止对数据库进行写操作。
  • database.force.deny.reading:布尔类型,是否强制指定的数据库拒绝读取操作。在一些安全要求较高的场景下,可能需要禁止对某些数据库的读取操作,以保护数据的安全。
    接下来,我们演示更改数据库属性的操作。例如,限制可以在数据库中创建的 Collections 数量:
python 复制代码
client.alter_database_properties(
    db_name="my_database_1",
    properties={
        "database.max.collections": 10
    }
)

在这段代码中,alter_database_properties方法用于更改数据库属性。db_name指定了要更改属性的数据库名称为my_database_1,properties参数则指定了要更改的属性及新的值。这里我们将database.max.collections属性的值设置为 10,表示在my_database_1数据库中最多只能创建 10 个 Collections。​

我们还可以删除数据库属性来重置该属性。例如,删除可以在数据库中创建的 Collection 数量限制:

python 复制代码
client.drop_database_properties(
    db_name="my_database_1",
    property_keys=[
        "database.max.collections"
    ]
)

drop_database_properties方法用于删除数据库属性。db_name指定了要操作的数据库名称,property_keys参数则指定了要删除的属性键。这里我们删除了my_database_1数据库的database.max.collections属性,从而取消了对该数据库中 Collections 数量的限制。

(四)使用数据库​

在实际应用中,我们可能需要在不同的数据库之间进行切换,以便使用不同数据库中的数据。接下来,我们解释切换数据库的意义,并展示使用 SDK 切换数据库的代码。​

切换数据库的意义在于,当我们的应用程序需要使用多个数据库中的数据时,不需要重新连接 Milvus 服务,只需要在不同的数据库之间进行切换即可。这就好比我们在一个大型商场里,要去不同的楼层(数据库)购物,只需要乘坐电梯(切换数据库操作)就可以到达,而不需要离开商场再重新进入。​

使用 SDK 切换数据库的代码如下:

python 复制代码
client.use_database(db_name="my_database_2")

在这段代码中,use_database方法用于切换数据库。db_name指定了要切换到的数据库名称为my_database_2。执行这段代码后,后续对数据库的操作都将在my_database_2中进行。需要注意的是,RESTful API 不支持此操作符,所以我们只能使用 SDK 来进行数据库切换操作。

(五)删除数据库​

当我们不再需要某个数据库时,可以将其删除,以释放资源。接下来,我们说明删除数据库的前提条件,并展示使用 SDK 删除数据库的代码。​

删除数据库有两个重要的前提条件:一是不能丢弃默认数据库,因为默认数据库是系统正常运行所必需的;二是在删除数据库之前,需要先删除数据库中的所有 Collections。这就好比我们要拆除一个仓库区域(数据库),首先要确保这个区域不是仓库的核心区域(默认数据库),并且要把这个区域里的所有物品(Collections)都搬走。​

使用 SDK 删除数据库的代码如下:

python 复制代码
client.drop_database(db_name="my_database_2")

在这段代码中,drop_database方法用于删除数据库。db_name指定了要删除的数据库名称为my_database_2。执行这段代码后,my_database_2数据库将被删除,其中的所有数据也将被永久删除,所以在执行删除操作时一定要谨慎,确保不再需要该数据库及其数据。

四、常见问题

(一)权限管理问题​

在 Milvus 中,权限管理至关重要,它确保了数据的安全性和隐私性。Milvus 使用基于角色的访问控制(RBAC)来管理权限,这种方式极大地简化了权限分配和管理的复杂性 。RBAC 的核心思想是将权限与角色关联,然后把用户与角色进行绑定,这样用户就可以通过角色间接获得相应的权限。这就好比在一个公司中,不同的职位(角色)拥有不同的职责和权限,员工(用户)通过担任某个职位来获得相应的工作权限。​

例如,我们可以创建一个名为 "DataAnalyst" 的数据分析师角色,这个角色需要具备对所有集合的查询权限。在 Milvus 中,我们可以通过以下代码来实现:

python 复制代码
from pymilvus import MilvusClient
client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus"
)
client.grant_privilege(
    role_name="DataAnalyst",
    object_type="Collection",
    privilege="Query",
    object_name="*"
)

在这段代码中,grant_privilege方法用于授予角色权限。role_name指定了要授予权限的角色名称为 "DataAnalyst",object_type表示对象类型为 "Collection",即集合;privilege指定了权限为 "Query",也就是查询权限;object_name设置为 "*",表示所有集合。通过这几行代码,我们就赋予了 "DataAnalyst" 角色对所有集合的查询权限。​

再比如,我们有一个名为 "Editor" 的编辑角色,这个角色需要对名为 "UserCollection" 的特定集合执行插入和删除操作。我们可以通过以下代码来实现:

python 复制代码
# 授予插入权限
client.grant_privilege(
    role_name="Editor",
    object_type="Collection",
    privilege="Insert",
    object_name="UserCollection"
)
# 授予删除权限
client.grant_privilege(
    role_name="Editor",
    object_type="Collection",
    privilege="Delete",
    object_name="UserCollection"
)

在这个示例中,我们分两步分别授予了 "Editor" 角色对 "UserCollection" 集合的插入和删除权限。通过这种方式,我们可以根据不同的业务需求,精确地为不同的角色分配不同的权限,从而保证数据的安全性和操作的规范性。

(二)配额限制问题​

为了确保系统的稳定运行和资源的合理分配,Milvus 允许我们为数据库设置配额限制。这些配额限制就像是为数据库设置了一个 "边界",规定了它在某些方面的使用上限,避免因资源过度使用而导致系统出现问题。​

其中,收藏的最大数量限制是一个重要的配额限制。比如,我们在创建数据库时,可以设置database.max.collections属性来指定数据库中允许的最大 Collections 数量。假设我们设置一个数据库的database.max.collections为 50,这就意味着在这个数据库中,最多只能创建 50 个 Collections。如果我们尝试创建第 51 个 Collection,系统就会提示错误,阻止我们继续创建,从而保证了数据库结构的合理性和稳定性 。​

除了收藏的最大数量限制,还有其他一些限制。例如,database.diskQuota.mb用于指定数据库的最大磁盘空间大小(MB)。假设我们设置这个属性为 10240,即 10GB,那么这个数据库在磁盘上占用的空间最多不能超过 10GB。当数据库中的数据量接近或达到这个限制时,我们需要采取相应的措施,如清理不必要的数据、扩展磁盘空间等,以确保数据库的正常运行。​

再如,database.resource_groups属性可以帮助我们对数据库使用的资源进行分组管理。我们可以将数据库与特定的资源组关联,通过对资源组的配置和管理,来控制数据库对资源的使用。这在多租户环境或资源有限的情况下非常有用,可以避免不同数据库之间因资源竞争而产生的问题。​

相关推荐
骥龙4 小时前
2.4、恶意软件猎手:基于深度学习的二进制文件判别
人工智能·深度学习·网络安全
hans汉斯4 小时前
【计算机科学与应用】基于BERT与DeepSeek大模型的智能舆论监控系统设计
大数据·人工智能·深度学习·算法·自然语言处理·bert·去噪
大模型真好玩4 小时前
LangChain1.0速通指南(二)——LangChain1.0 create_agent api 基础知识
人工智能·langchain·mcp
开放知识图谱4 小时前
论文浅尝 | 图约束推理:在知识图谱上实现大语言模型的忠实推理(ICML2025)
人工智能·语言模型·自然语言处理·知识图谱
凯歌的博客4 小时前
python虚拟环境应用
linux·开发语言·python
机器之心4 小时前
英伟达发射了首个太空AI服务器,H100已上天
人工智能·openai
西柚小萌新4 小时前
【深入浅出PyTorch】--8.1.PyTorch生态--torchvision
人工智能·pytorch·python
MonkeyKing_sunyuhua4 小时前
can‘t read /etc/apt/sources.list: No such file or directory
python
m0_650108245 小时前
【论文精读】迈向更好的指标:从T2VScore看文本到视频生成的新评测范式
人工智能·论文精读·评估指标·文本到视频生成·t2vscore·tvge数据集·视频质量评估