1. 配置文件
Milvus服务依赖于其它服务,自身内部又有各种角色,因此我们需要使用配置文件明确配置出这些角色的信息和相互之间的依赖关系。在Milvus的镜像路径中包含了其配置,但该配置需要根据集群的实际情况进行调整. 对于我们的集群,调整内容如下:
etcd:
endpoints: etcd-proxy:23790
rootPath: cpic-milvus
metastore:
type: etcd
minio:
address: minio-proxy
port: 9000
accessKeyID: minioadmin
secretAccessKey: minioadmin
useSSL: false
bucketName: milvus-bucket
rootPath: file
useIAM: false
iamEndpoint:
mq:
type: pulsar
messageQueue: pulsar
pulsar:
address: broker
port: 6650
maxMessageSize: 5242880
rootCoord:
address: rootcoord
port: 53100
enableActiveStandby: false # Enable active-standby
proxy:
port: 19530
internalPort: 19529
http:
enabled: true
accessLog:
localPath: /milvus/access-logs
filename: milvus_access_log.log # Log filename, leave empty to disable file log.
queryCoord:
address: querycoord
port: 19531
enableActiveStandby: false # Enable active-standby
queryNode:
port: 21123
enableDisk: true # Enable querynode load disk index, and search on disk index
indexCoord:
address: indexcoord
port: 31000
enableActiveStandby: false # Enable active-standby
indexNode:
port: 21121
enableDisk: true # Enable index node build disk vector index
dataCoord:
address: datacoord
port: 13333
enableActiveStandby: false # Enable active-standby
dataNode:
port: 21124
log:
level: info
file:
rootPath: "/milvus/system-logs"
maxSize: 300
maxAge: 10
maxBackups: 20
format: text
common:
chanNamePrefix:
cluster: cpic-milvus
storageType: minio
【备注】最终完整的配置文件参考:github.com/yangxianpku/milvus/blob/main/doc/conf/milvus/milvus.yaml.
2. 协调节点
协调器节点主要负责工作的安排而自己不作任何实际的工作,因此其对硬件资源的需求较低,所以我们可以将4个协调器角色的所有服务部署在2台机器上,实现一个高可用的状态。协调器角色的主机明细如下:
=======================================================================
hostname ip id role
-----------------------------------------------------------------------
gp22aitppapwa92 29.16.21.73 twb7ul6y1uvk23th0yz5z9maw coord
gp22aitppap9mtz 29.16.21.74 ms5me3log9re8ryb74aghf1p6 coord
=======================================================================
2.1 准备工作
我们在/mnt/data目录下建立相应的目录协调节点使用。在29.16.21.73~29.16.21.74共2个节点上分别执行如下操作:
# 1. 在29.16.21.73上执行如下命令
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.74上执行如下命令
mkdir -p /mnt/data/milvus/system-logs
2.2 服务部署
我们将milvus.yaml文件上传到29.16.21.73~29.16.21.74节点的/home/dcos目录,方便后续服务启动时映射到容器内部. 我们将Milvus协调节点的启动配置文件github.com/yangxianpku/milvus/blob/main/doc/yaml/milvus-coord.yaml上传到80节点,然后执行如下命令:
[dcos@gp22aitppap3jmy-M3~]$ docker stack deploy --compose-file milvus-coord.yaml milvus
Creating service milvus_rootcoord
Creating service milvus_datacoord
Creating service milvus_querycoord
Creating service milvus_indexcoord
2.3 服务验证
我们到coord节点上进入协调节点服务的任意容器,使用如下命令查看服务的健康性:
root@rootcoord:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
root@datacoord:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
root@querycoord:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
root@indexcoord:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
3. 工作节点
接下来我们搭建Milvus的工作节点服务。Milvus的工作节点共3个角色,分别为查询节点、索引节点和数据节点。其中,数据节点因为资源要求较低,我们与协调节点公用硬件资源。查询节点和索引节点各自拥有独立的资源,如下:
=======================================================================
hostname ip id role
-----------------------------------------------------------------------
gp22aitppapn50h 29.16.21.64 orn6cvg523jsrvflt45ae4j0w query1
gp22aitppap3j1z 29.16.21.65 qecn8tzfdol91lr2yxwbljeju query2
gp22aitppap224s 29.16.21.66 svprh9iymqlbrbvsokr9uw79m query3
gp22aitppapqbnp 29.16.21.67 njke6pgg1n8vjgzeod72psp1g query4
gp22aitppapggck 29.16.21.68 mfnn5yjmu58y21w372emyhk09 query5
-----------------------------------------------------------------------
gp22aitppapagzs 29.16.21.69 ydt3d0592sagnc04ydrcv6tiw index1
gp22aitppapnha1 29.16.21.70 4j81h9dvxmiqu4boz7nkni036 index2
gp22aitppap1a0m 29.16.21.71 zeexprr05039cvnx6sfsbrsrg index3
gp22aitppapa69j 29.16.21.72 acok3zlmgico5juh63vciry5o index4
-----------------------------------------------------------------------
gp22aitppapwa92 29.16.21.73 twb7ul6y1uvk23th0yz5z9maw coord
gp22aitppap9mtz 29.16.21.74 ms5me3log9re8ryb74aghf1p6 coord
=======================================================================
3.1 准备工作
我们为各个节点在宿主机上创建相应的目录,以便服务保存日志和数据信息。我们在/mnt/data目录下建立相应的目录供工作节点使用。在29.16.21.69~29.16.21.72共4个节点上分别执行如下操作:
# 1. 在29.16.21.69上执行如下命令
mkdir -p /mnt/data/milvus/index-node/data
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.70上执行如下命令
mkdir -p /mnt/data/milvus/index-node/data
mkdir -p /mnt/data/milvus/system-logs
# 3. 在29.16.21.71上执行如下命令
mkdir -p /mnt/data/milvus/index-node/data
mkdir -p /mnt/data/milvus/system-logs
# 4. 在29.16.21.72上执行如下命令
mkdir -p /mnt/data/milvus/index-node/data
mkdir -p /mnt/data/milvus/system-logs
在29.16.21.64~29.16.21.68共5个节点上分别执行如下操作:
# 1. 在29.16.21.64上执行如下命令
mkdir -p /mnt/data/milvus/query-node/data
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.65上执行如下命令
mkdir -p /mnt/data/milvus/query-node/data
mkdir -p /mnt/data/milvus/system-logs
# 3. 在29.16.21.66上执行如下命令
mkdir -p /mnt/data/milvus/query-node/data
mkdir -p /mnt/data/milvus/system-logs
# 4. 在29.16.21.67上执行如下命令
mkdir -p /mnt/data/milvus/query-node/data
mkdir -p /mnt/data/milvus/system-logs
# 5. 在29.16.21.68上执行如下命令
mkdir -p /mnt/data/milvus/query-node/data
mkdir -p /mnt/data/milvus/system-logs
在29.16.21.73~29.16.21.74共2个节点上分别执行如下操作:
# 1. 在29.16.21.64上执行如下命令
mkdir -p /mnt/data/milvus/data-node/data
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.65上执行如下命令
mkdir -p /mnt/data/milvus/data-node/data
mkdir -p /mnt/data/milvus/system-logs
3.2 服务部署
我们将milvus.yaml文件上传到上述11个节点的/home/dcos目录(因为部署协调器服务时,两个coord的机器上已经有了该配置文件,可以不用再传),方便后续服务启动时映射到容器内部. 我们将Milvus工作节点的启动配置文件github.com/yangxianpku/milvus/blob/main/doc/yaml/milvus-worker.yaml上传到80节点,然后执行如下命令:
[dcos@gp22aitppap3jmy-M3~]$ docker stack deploy --compose-file milvus-worker.yaml milvus
Creating service milvus_index1
Creating service milvus_index2
Creating service milvus_index3
Creating service milvus_index4
Creating service milvus_data1
Creating service milvus_data2
Creating service milvus_query1
Creating service milvus_query2
Creating service milvus_query3
Creating service milvus_query4
Creating service milvus_query5
3.3 服务验证
root@query1:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
root@data1:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
root@index1:/milvus# curl -i localhost:9091/healthz
HTTP/1.1 200 OK
Date: Thu, 21 Sep 2023 08:07:43 GMT
Content-Length: 2
Content-Type: text/plain; charset=utf-8
# ... 内容较多,不列出所有了!
4. 代理服务
4.1 准备工作
我们为各个节点在宿主机上创建相应的目录,以便服务保存日志和数据信息。我们在/mnt/data目录下建立相应的目录供工作节点使用。在29.16.21.80~29.16.21.82共3个节点上分别执行如下操作:
# 1. 在29.16.21.80上执行如下命令
mkdir -p /mnt/data/milvus/proxy-node/access-logs
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.81上执行如下命令
mkdir -p /mnt/data/milvus/proxy-node/access-logs
mkdir -p /mnt/data/milvus/system-logs
# 2. 在29.16.21.82上执行如下命令
mkdir -p /mnt/data/milvus/proxy-node/access-logs
mkdir -p /mnt/data/milvus/system-logs
4.2 服务部署
我们将Milvus代理节点的启动配置文件github.com/yangxianpku/milvus/blob/main/doc/yaml/milvus-proxy.yaml上传到80节点,然后执行如下命令:
[dcos@gp22aitppap3jmy-M3~]$ docker stack deploy --compose-file etcd-proxy.yaml milvus
Creating service milvus_milvus-proxy
4.3 服务验证
我们已经将代理的19530端口映射到管理节点的宿主机,因此我们可以在客户端使用如下方式验证Milvus代理也即整个Milvus集群的可用性:
from pymilvus import connections
from pymilvus import Collection
from pymilvus import utility
from pymilvus import CollectionSchema, FieldSchema, DataType
connections.connect(
alias="default", # 链接别名
host='29.16.21.80', # 服务端主机
port='19530' # 服务端端口
)
book_id = FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True,)
book_name = FieldSchema(name="book_name", dtype=DataType.VARCHAR, max_length=200,)
word_count = FieldSchema(name="word_count", dtype=DataType.INT64, )
book_intro = FieldSchema(name="book_intro", dtype=DataType.FLOAT_VECTOR, dim=2)
schema = CollectionSchema(fields=[book_id, book_name, word_count, book_intro], description="Test book search")
collection_name = "book"
collection = Collection(name=collection_name, schema=schema, using='default', shards_num=2)
collection.set_properties(properties={"collection.ttl.seconds": 1800})
has = utility.has_collection("book")
ls = utility.list_collections()
suc = utility.drop_collection("book")
print(has, ls, suc)
connections.disconnect("default")
至此,整个Milvus集群搭建完成,服务已经可用!