Milvus 作为一款针对海量特征向量的相似性搜索引擎,在单台服务器上就可以处理十亿级数据规模。而对于百亿或者千亿级数据,则需要具有水平扩展能力的 Milvus 集群来满足对海量向量数据的高性能检索需求。Mishards 是一个用 Python 开发的 Milvus 集群中间件。使用 Mishards 搭建的 Milvus 集群可以实现请求转发、读写分离、水平扩展、动态扩容等核心功能,帮助用户获得处理超大规模向量相似性检索的能力。
本文将展示如何使用 Mishards 分片中间件来搭建 Milvus 集群,实现 Milvus 集群化能力。文章共分为三个章节:
Mishards 简介:Mishards 的工作原理和 Milvus 集群架构
搭建步骤:以 2 台服务器为例,搭建一个 Milvus 集群
测试:将一亿数据集导入搭建完成的 Milvus 集群,并分析集群的运行情况
工作原理:
工作流程:
向 Proxy 发送客户端请求
将客户端请求进行拆分
路由到内部各细分子实例
每个实例将各自的结果发送至 Proxy
汇总结果
得到最终结果并返回给客户端
集群架构:
您需要在每一个服务器上都安装并启动 Milvus
您只需在任意一台服务器上启动 Mishards
您可以选择任意一台服务器作为共享存储
1. 安装 MySQL
根据 MySQL 官网教程安装并启动 MySQL 服务
或通过 docker 安装 MySQL
2. 启动 Milvus
集群中只能有一个 Milvus 实例配置为可写,其他均为只读。
server_config.yml。按照如下示例进行修改:version:0.1# config versionserver_config: address:0.0.0.0# milvus server ip address (IPv4) port:19530# milvus server port, must in range [1025, 65534] deploy_mode: cluster_readonly # deployment type: single, cluster_readonly, cluster_writable time_zone: UTC+8# time zone, must be in format: UTC+Xdb_config: primary_path:/var/lib/milvus # path used to store data and meta secondary_path:# path used to store data only, split by semicolon backend_url: mysql://root:milvusroot@192.168.1.38:3306/milvus # URI format: dialect://username:password@host:port/databasedeploy_mode 决定了 Milvus 实例为只读还是可写。在单机版中,这一参数设置为 single ;当使用 Mishards 时,每一个 Milvus 实例配置为 cluster_writable 或 cluster_readonly 。cluster_writable表示该Milvus实例可写cluster_readonly表示该Milvus实例只读
backend_url 按上述格式修改为 MySQL 所安装的服务器地址及端口。其余配置参照 Milvus 单机版时的配置。cluster_mishards.yml 文件中的相应参数:version:"2.3"services: mishards: restart: always image: milvusdb/mishards ports:-"0.0.0.0:19531:19531"-"0.0.0.0:19532:19532"#volumes:#- /tmp/milvus/db:/tmp/milvus/db# - /tmp/mishards_env:/source/mishards/.env command:["python","mishards/main.py"] environment: FROM_EXAMPLE:'true' SQLALCHEMY_DATABASE_URI: mysql+pymysql://root:milvusroot@192.168.1.85:3306/milvus?charset=utf8mb4 DEBUG:'true' SERVER_PORT:19531 WOSERVER: tcp://192.168.1.85:19530 DISCOVERY_PLUGIN_PATH:static DISCOVERY_STATIC_HOSTS:192.168.1.85,192.168.1.38 DISCOVERY_STATIC_PORT:19530SERVER_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 地址。测试
数据准备
在本次测试中,我们提取了原始数据集中的 1 亿条数据,该文件大小约为 13G。
搭建并启动 Mishards 后,您可以使用 Milvus 进行相应操作。根据 Mishards 所在服务器的 IP 地址和 Mishards 服务端口来连接该集群的 Milvus 服务
>>> milvus =Milvus()>>> milvus.connect(host='192.168.1.38', port='19531')测试步骤:
$ python3 milvus_toolkit.py --table <table_name>--dim <dim_num>-cmilvus_load.py中的你所导入的文件路径。修改完成后使用如下命令行导入数据:$ python3 milvus_load.py --table <table_name>-b$ python3 milvus_toolkit.py --table <table_name>--index <sq8 or sq8h or flat or ivf>--build$ python3 milvus_toolkit.py --table <table_name>--nprobe <np_num>-s#执行-s,性能查询。np是指定查询时要搜索的桶的数量运行情况
从运行日志可以看到,IP 地址为 192.168.1.85 和 192.168.1.38 都参与了查询的工作。
如下两图所示,192.168.1.85 和 192.168.1.38 的所有 CPU 都在工作。可在 PID USER 行的 RES 栏下观察得到,192.168.1.85 的内存占用为 10.7G,192.168.1.38 的内存占用为 9344M,总内存占用为 19.825G
而当使用 Milvus 单机版处理该数据集时,内存占用为 15.9G。使用 Mishards 时,内存占用比使用单机版时多了将近 4G。这是由于多个 Milvus 实例,每个 Milvus 实例都会消耗内存。虽然 Mishards 基本不消耗内存,但由于 Milvus 实例的增加,相应的内存占用也有所增加。
本文利用 Mishards 搭建了一个 Milvus 集群,并且使用了一亿数据集对 Milvus 集群进行了相关测试和运行情况分析。当您需要处理海量特征向量时,您可以使用基于 Mishards 的 Milvus 分布式集群方案以获得更好的体验。Mishards 的后续版本将会持续更新,欢迎您提供各种意见或者代码根据具体场景需求和我们一起探索更加完善的集群方案。
github.com/milvus-io/milvus
milvus.io
milvusio.slack.com
© 2020 ZILLIZ™