Milvus实战 | 基于Mishards的分布式集群方案

 

 

​Milvus 作为一款针对海量特征向量的相似性搜索引擎,在单台服务器上就可以处理十亿级数据规模。而对于百亿或者千亿级数据,则需要具有水平扩展能力的 Milvus 集群来满足对海量向量数据的高性能检索需求。

Mishards 是一个用 Python 开发的 Milvus 集群中间件。使用 Mishards 搭建的 Milvus 集群可以实现请求转发、读写分离、水平扩展、动态扩容等核心功能,帮助用户获得处理超大规模向量相似性检索的能力。

 

本文将展示如何使用 Mishards 分片中间件来搭建 Milvus 集群,实现 Milvus 集群化能力。文章共分为三个章节:

  • Mishards 简介:Mishards 的工作原理和 Milvus 集群架构

  • 搭建步骤:以 2 台服务器为例,搭建一个 Milvus 集群

  • 测试:将一亿数据集导入搭建完成的 Milvus 集群,并分析集群的运行情况

 

Mishards 简介

工作原理:

Mishards 负责将来自客户端的请求拆分,并路由到内部各细分子实例,最后将子实例结果汇总,返回给客户端。Mishards 的工作流程如下:

工作流程:

  1.  向 Proxy 发送客户端请求

  2.  将客户端请求进行拆分

  3.  路由到内部各细分子实例

  4.  每个实例将各自的结果发送至 Proxy

  5.  汇总结果

  6.  得到最终结果并返回给客户端

 

集群架构:

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. 安装 MySQL

MySQL 服务只需要在集群中任意一台服务器上启动即可。本示例安装在服务器A(192.168.1.38)中。

  • 根据 MySQL 官网教程安装并启动 MySQL 服务

  • 或通过 docker 安装 MySQL

 

2. 启动 Milvus

集群中每一台服务器均需要安装 Milvus 实例,不同的 Milvus 实例配置不同的读写权限。本示例中,将第一台服务器上的 Milvus 实例配置为可写,将第二台服务器上的 Milvus 实例配置为只读。

集群中只能有一个 Milvus 实例配置为可写,其他均为只读。

根据官网步骤安装 Milvus,但需要修改配置文件server_config.yml。按照如下示例进行修改:

根据实际环境,在配置文件中定位到如下片段,并修改相应参数:


 
  1. version:0.1# config version

  2.  

  3. server_config:

  4. address:0.0.0.0# milvus server ip address (IPv4)

  5. port:19530# milvus server port, must in range [1025, 65534]

  6. deploy_mode: cluster_readonly # deployment type: single, cluster_readonly, cluster_writable

  7. time_zone: UTC+8# time zone, must be in format: UTC+X

  8.  

  9. db_config:

  10. primary_path:/var/lib/milvus # path used to store data and meta

  11. secondary_path:# path used to store data only, split by semicolon

  12.  

  13. backend_url: mysql://root:milvusroot@192.168.1.38:3306/milvus # URI format: 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. 启动 Mishards

Mishards 实例只需在集群中任意一台服务器上启动即可。本示例在服务器 A 上启动Mishards。

Mishards 需要通过docker 启动,其中启动时的相关配置文件如下。启动前需要修改 cluster_mishards.yml 文件中的相应参数:

  1. version:"2.3"

  2. services:

  3. mishards:

  4. restart: always

  5. image: milvusdb/mishards

  6. ports:

  7. -"0.0.0.0:19531:19531"

  8. -"0.0.0.0:19532:19532"

  9. #volumes:

  10. #- /tmp/milvus/db:/tmp/milvus/db

  11. # - /tmp/mishards_env:/source/mishards/.env

  12. command:["python","mishards/main.py"]

  13. environment:

  14. FROM_EXAMPLE:'true'

  15. SQLALCHEMY_DATABASE_URI: mysql+pymysql://root:milvusroot@192.168.1.85:3306/milvus?charset=utf8mb4

  16. DEBUG:'true'

  17. SERVER_PORT:19531

  18. WOSERVER: tcp://192.168.1.85:19530

  19. DISCOVERY_PLUGIN_PATH:static

  20. DISCOVERY_STATIC_HOSTS:192.168.1.85,192.168.1.38

  21. DISCOVERY_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/bootcamp/tree/master/solutions/Mishards。

 

测试

数据准备

本实验所使用的原始数据集为 SIFT1B ,关于该数据集的详细信息请参考:

http://corpus-texmex.irisa.fr/ 。

在本次测试中,我们提取了原始数据集中的 1 亿条数据,该文件大小约为 13G。

1 亿测试数据集下载地址:https://pan.baidu.com/s/1N5jGKHYTGchye3qR31aNnA

搭建并启动 Mishards 后,您可以使用 Milvus 进行相应操作。根据 Mishards 所在服务器的 IP 地址和 Mishards 服务端口来连接该集群的 Milvus 服务

  1. >>> milvus =Milvus()

  2. >>> milvus.connect(host='192.168.1.38', port='19531')

接下来您可以完成建表、插入向量、创建索引、查询等一些列操作。

 

测试步骤:

将 Bootcamp: https://github.com/milvus-io/bootcamp.git 克隆至服务器,进入bootcamp/benchmark_test/scripts 目录。

1. 建表:

  1. $ python3 milvus_toolkit.py --table <table_name>--dim <dim_num>-c

2. 根据你要导入文件的格式(npy,csv,fvecs,bvces),参考 Milvus Bootcamp 脚本使用说明:https://github.com/milvus-io/bootcamp/tree/0.5.3/scripts ,修改milvus_load.py中的你所导入的文件路径。修改完成后使用如下命令行导入数据:

  1. $ python3 milvus_load.py --table <table_name>-b

3. 创建索引:

  1. $ python3 milvus_toolkit.py --table <table_name>--index <sq8 or sq8h or flat or ivf>--build

4. 查询:

  1. $ python3 milvus_toolkit.py --table <table_name>--nprobe <np_num>-s

  2. #执行-s,性能查询。np是指定查询时要搜索的桶的数量

运行情况

可以通过 Mishards 的日志查看每一台服务器的工作情况,如下图:

从运行日志可以看到,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 的后续版本将会持续更新,欢迎您提供各种意见或者代码根据具体场景需求和我们一起探索更加完善的集群方案。

更多关于 Mishards 的内容请访问:

https://github.com/milvus-io/milvus/blob/master/shards/README_CN.md

 

往期实战系列👇

Milvus实战 | 轻松搭建以图搜图系统

Milvus实战 | 个性化推荐系统

Milvus实战 | 基于Keepalived的高可用方案

 

欢迎加入Milvus社区

Milvus 源码
github.com/milvus-io/milvus

Milvus 官网
milvus.io

Milvus Slack 社区
milvusio.slack.com

Milvus CSDN 博客
zilliz.blog.csdn.net

 

Milvus 线上交流群

关注 ZILLIZ 公众号 > 点击菜单「线上交流」 > 添加 ZILLIZ bot 并回复入群

© 2020 ZILLIZ™

 

展开阅读全文

没有更多推荐了,返回首页

应支付0元
点击重新获取
扫码支付

支付成功即可阅读