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

相关推荐
用户51914958484512 分钟前
Windows 渗透测试载荷加载器 POC 工具集
人工智能·aigc
袋鱼不重15 分钟前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
大树8816 分钟前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
用户83562907805118 分钟前
使用 Python 操作 Word 内容控件
后端·python
量子位25 分钟前
刚刚,Fable-5之下,智谱开源的GLM-5.2拿下AI编程第一!
ai编程
通信小呆呆26 分钟前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
施小赞29 分钟前
普通 RAG vs GraphRAG 核心对比
人工智能·ai
量子位29 分钟前
SpaceX一分现金没花收购Cursor,马斯克吞下AI编程工具第一名
ai编程
EAIReport30 分钟前
RuoYi-AI 企业级AI开发平台实战详解
人工智能
程序员黑豆37 分钟前
JDK 下载安装与配置详细教程
java·前端·ai编程