当前位置: 首页 > 后端技术 > Python

Milvus实践-基于Mishards的分布式集群解决方案

时间:2023-03-26 00:02:19 Python

Milvus作为海量特征向量的相似度搜索引擎,单台服务器可处理数十亿级数据。百亿级、千亿级的数据,需要具备水平扩展能力的Milvus集群来满足海量矢量数据的高性能检索需求。Mishards是一个用Python开发的Milvus集群中间件。使用Mishards搭建的Milvus集群,可以实现请求转发、读写分离、水平扩展、动态扩展等核心功能,帮助用户获得处理超大规模向量相似度检索的能力。本文将展示如何使用Mishards分片中间件搭建Milvus集群,实现Milvus的集群能力。文章分为三章:Mishards简介:Mishards工作原理及Milvus集群架构搭建步骤:以2台服务器为例搭建Milvus集群测试:将1亿数据集导入完成的Milvus集群,分析集群Mishards运行状态工作原理介绍:Mishards负责将客户端的请求进行拆分并路由到内部的子实例,最后汇总子实例的结果返回给客户端。Mishards的工作流程如下:工作流程:将客户端请求发送给Proxy拆分客户端请求路由到内部子实例每个实例将自己的结果发送给Proxy汇总结果得到最终结果返回给客户端集群架构:Mishards实例可以安装在集群中的任何服务器上。使用Mishards搭建的集群整体结构如下:选择其中一个Milvus实例可写,其余为只读。设置为可写的Milvus实例通过Mishards将数据导入共享存储。通过Mishards,数据从共享存储分配到集群中的每个实例(包括可写实例),这个分配过程使用一致性哈希算法。每个实例完成查询任务后,汇总最终结果返回给客户端。搭建步骤搭建一个Milvus集群需要两台或多台服务器和共享存储设备:需要在每台服务器上安装并启动Milvus,只需要在任意一台服务器上启动Mishards,可以选择任意一台服务器作为共享存储本例将使用两台服务器A和B搭建一个Milvus集群:在服务器A(192.168.1.38)上启动Mishards和第一个Milvus实例;在服务器B(192.168.1.85)上启动第二个Milvus实例,并将此服务器作为共享存储来存储集群中所有Milvus实例的数据。注意:需要在启动Milvus和Mishards之前完成相应的参数配置。具体构建过程如下:1、安装MySQLMySQL服务,只需要在集群中任意一台服务器上启动即可。此示例安装在服务器A(192.168.1.38)中。按照MySQL官网教程安装并启动MySQL服务或者通过docker安装MySQL2。启动Milvus集群中的各个服务器,需要安装一个Milvus实例,不同的Milvus实例配置不同的读写权限。本例中,将第一台服务器上的Milvus实例配置为可写,将第二台服务器上的Milvus实例配置为只读。集群中只有一个Milvus实例可以配置为可写,其他为只读。按照官网的步骤安装Milvus,但需要修改配置文件server_config.yml。按照下面的例子修改:根据实际环境,在配置文件中找到如下段,修改相应的参数:version:0.1#configversionserver_config:address:0.0.0.0#milvusserveripaddress(IPv4)port:19530#milvus服务器端口,必须在[1025,65534]范围内deploy_mode:cluster_readonly#部署类型:single,cluster_readonly,cluster_writabletime_zone:UTC+8#时区,必须格式:UTC+Xdb_config:primary_path:/var/lib/milvus#用于存储数据的路径和metasedary_path:#仅用于存储数据的路径,以分号分隔backend_url:mysql://root:milvusroot@192.168.1.38:3306/milvus#URI格式:dialect://username:password@host:port/database在配置文件中,参数deploy_mode决定了Milvus实例是只读还是可写。在单机版中,该参数设置为single;使用Mishards时,每个Milvus实例都配置为cluster_writable或cluster_readonly。cluster_writable表示Milvus实例是可写的cluster_readonly表示Milvus实例是只读的。参数backend_url按照上述格式修改为MySQL安装的服务器地址和端口。其余配置参考Milvus单机版的配置。此外,集群中的所有设备数据存储位置应设置为相同的共享存储。在本例中,选择第二台服务器作为共享存储。修改配置后,启动Milvus服务。3.启动MishardsMishards实例只需要在集群中的任意一台服务器上启动即可。本例在服务器A上启动Mishards,Mishards需要通过docker启动,启动时的相关配置文件如下。开始前需要修改cluster_mishards.yml文件中的相应参数:version:"2.3"services:mishards:restart:alwaysimage:milvusdb/mishardsports:-"0.0.0.0:19531:19531"-"0.0.0.0:19532:19532"#volumes:#-/tmp/milvus/db:/tmp/milvus/db#-/tmp/mishards_env:/source/mishards/.envcommand:["python","mishards/main.py"]环境:FROM_EXAMPLE:'true'SQLALCHEMY_DATABASE_URI:mysql+pymysql://root:milvusroot@192.168.1.85:3306/milvus?charset=utf8mb4DEBUG:'true'SERVER_PORT:19531WOSERVER:tcp://192.168.1.85:19530DISCOVERY_PLUGINOST:STAT_DISCOVERY_PLUGINOST192.168.1.85,192.168.1.38DISCOVERY_STATIC_PORT:19530参数说明:SERVER_PORT:定义Mishards的服务端口。WOSERVER:定义Milvus可写实例的地址,目前只支持静态设置。参考格式:tcp://127.0.0.1:19530。DISCOVERY_PLUGIN_PATH:用户自定义的服务发现插件搜索路径,默认使用系统搜索路径。DISCOVERY_STATIC_HOSTS:服务地址列表,以逗号分隔,例如192.168.1.188,192.168.1.190。DISCOVERY_STATIC_PORT:服务地址监听端口。参数修改:SQLALCHEMY_DATABASE_URI:改为MySQL所在的IP地址。WOSERVER:更改为Milvus可写示例的IP地址。DISCOVERY_STATIC_HOSTS:集群中的所有IP地址。修改后,启动Mishards。更详细的搭建步骤请参考Bootcamp:https://github.com/milvus-io/...。测试数据准备本次实验使用的原始数据集为SIFT1B。有关此数据集的更多信息,请参阅:http://corpus-texmex.irisa.fr/。本次测试,我们从原始数据集中提取了1亿条数据,文件大小约为13G。亿级测试数据集下载地址:https://pan.baidu.com/s/1N5jG...构建并启动Mishards后,即可使用Milvus进行相应的操作。根据Mishards所在服务器IP地址和Mishards服务端口连接集群的Milvus服务>>>milvus=Milvus()>>>milvus.connect(host='192.168.1.38',port='19531')接下来你可以完成建表、插入向量、创建索引、查询等一些列操作。测试步骤:CloneBootcamp:https://github.com/milvus-io/...到服务器,进入bootcamp/benchmark_test/scripts目录。1.创建表:$python3milvus_toolkit.py--table--dim-c2。根据你要导入的文件格式(npy、csv、fvecs、bvces),参考MilvusBootcamp脚本说明:https://github.com/milvus-io/...,修改你的文件路径在milvus_load.py中导入。修改后使用如下命令行导入数据:$python3milvus_load.py--table-b3。创建索引:$python3milvus_toolkit.py--table--index--build4。查询:$python3milvus_toolkit.py--table--nprobe-s#Execute-s,性能查询。np是指定查询时要搜索的桶数。运行状态可以通过Mishards日志查看各个服务器的工作状态,如下图所示:从运行日志中我们可以看到IP地址192.168.1.85和192.168.1.38都参与了查询工作。如下两图所示,192.168.1.85和192.168.1.38的所有CPU都在工作。在PIDUSER这一行的RES栏下可以观察到192.168.1.85的内存占用为10.7G,192.168.1.38的内存占用为9344M,总内存占用为19.825G。占用15.9G。使用Mishards时,内存占用比使用单机版多了将近4G。这是由于多个Milvus实例,每个实例都消耗内存。虽然Mishards基本不消耗内存,但是由于Milvus实例的增加,相应的内存占用也增加了。本文使用Mishards搭建Milvus集群,并使用亿级数据集在Milvus集群上进行相关测试和运行分析。当你需要处理海量特征向量时,可以使用基于Mishards的Milvus分布式集群方案,以获得更好的体验。Mishards的后续版本将持续更新。欢迎大家根据具体场景需求,提供各种意见或代码,与我们一起探索更完善的集群解决方案。更多关于Mishards的内容请访问:https://github.com/milvus-io/..._CN.md过去实战系列?Milvus实战|轻松搭建图片搜索系统Milvus实战|个性化推荐系统MilvusCombat|基于Keepalived的高可用解决方案欢迎来到Milvus社区Milvus源码github.com/milvus-io/milvusMilvus官网Milvus.ioMilvusSlack社区Milvusio.slack.comMilvusCSDN博客zilliz.blog.csdn.netMilvus在线交流群关注ZILLIZ公众号>点击菜单“在线交流”>添加ZILLIZ机器人并回复群?2020ZILLIZ?