(Veraltet) Einrichten eines Milvus-Clusters auf EC2
Dieses Thema beschreibt die Bereitstellung eines Milvus-Clusters auf Amazon EC2 mit Terraform und Ansible.
Dieses Thema ist veraltet und wird bald entfernt werden. Wir empfehlen Ihnen, stattdessen auf Deploy a Milvus Cluster on EKS zu verweisen.
Bereitstellung eines Milvus-Clusters
Dieser Abschnitt beschreibt, wie Sie Terraform zur Bereitstellung eines Milvus-Clusters verwenden.
Terraform ist ein Infrastructure as Code (IaC) Software-Tool. Mit Terraform können Sie Infrastrukturen mit Hilfe von deklarativen Konfigurationsdateien bereitstellen.
Voraussetzungen
Konfiguration vorbereiten
Sie können Vorlagenkonfigurationsdateien bei Google Drive herunterladen.
main.tf
Diese Datei enthält die Konfiguration für die Bereitstellung eines Milvus-Clusters.
variables.tf
Diese Datei ermöglicht eine schnelle Bearbeitung der Variablen, die zum Einrichten oder Aktualisieren eines Milvus-Clusters verwendet werden.
output.tf
undinventory.tmpl
Diese Dateien speichern die Metadaten eines Milvus-Clusters. Die in diesem Thema verwendeten Metadaten sind die
public_ip
für jede Knoteninstanz,private_ip
für jede Knoteninstanz und alle EC2-Instanz-IDs.
Variablen vorbereiten.tf
Dieser Abschnitt beschreibt die Konfiguration, die eine variables.tf
Datei enthält.
Anzahl der Knoten
Die folgende Vorlage deklariert eine
index_count
Variable, die verwendet wird, um die Anzahl der Indexknoten festzulegen.Der Wert vonindex_count
muss größer als oder gleich eins sein.variable "index_count" { description = "Amount of index instances to run" type = number default = 5 }
Instanztyp für einen Knotentyp
Die folgende Vorlage deklariert eine
index_ec2_type
Variable, die verwendet wird, um den Instanztyp für Indexknoten festzulegen.variable "index_ec2_type" { description = "Which server type" type = string default = "c5.2xlarge" }
Zugriffsberechtigung
Die folgende Vorlage deklariert eine
key_name
Variable und einemy_ip
Variable. Die Variablekey_name
steht für den AWS-Zugangsschlüssel. Die Variablemy_ip
stellt den IP-Adressbereich für eine Sicherheitsgruppe dar.variable "key_name" { description = "Which aws key to use for access into instances, needs to be uploaded already" type = string default = "" } variable "my_ip" { description = "my_ip for security group. used so that ansible and terraform can ssh in" type = string default = "x.x.x.x/32" }
main.tf vorbereiten
Dieser Abschnitt beschreibt die Konfigurationen, die eine main.tf
Datei enthält.
Cloud-Anbieter und Region
Die folgende Vorlage verwendet die Region
us-east-2
. Siehe Verfügbare Regionen für weitere Informationen.provider "aws" { profile = "default" region = "us-east-2" }
Sicherheitsgruppe
Die folgende Vorlage deklariert eine Sicherheitsgruppe, die eingehenden Datenverkehr aus dem CIDR-Adressbereich zulässt, der durch
my_ip
repräsentiert wird und invariables.tf
deklariert ist.resource "aws_security_group" "cluster_sg" { name = "cluster_sg" description = "Allows only me to access" vpc_id = aws_vpc.cluster_vpc.id ingress { description = "All ports from my IP" from_port = 0 to_port = 65535 protocol = "tcp" cidr_blocks = [var.my_ip] } ingress { description = "Full subnet communication" from_port = 0 to_port = 65535 protocol = "all" self = true } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } tags = { Name = "cluster_sg" } }
VPC
Die folgende Vorlage legt eine VPC mit dem CIDR-Block 10.0.0.0/24 auf einem Milvus-Cluster fest.
resource "aws_vpc" "cluster_vpc" { cidr_block = "10.0.0.0/24" tags = { Name = "cluster_vpc" } } resource "aws_internet_gateway" "cluster_gateway" { vpc_id = aws_vpc.cluster_vpc.id tags = { Name = "cluster_gateway" } }
Subnetze (Optional)
Die folgende Vorlage deklariert ein Subnetz, dessen Verkehr an ein Internet-Gateway geleitet wird. In diesem Fall ist die Größe des CIDR-Blocks des Subnetzes die gleiche wie die des CIDR-Blocks des VPCs.
resource "aws_subnet" "cluster_subnet" { vpc_id = aws_vpc.cluster_vpc.id cidr_block = "10.0.0.0/24" map_public_ip_on_launch = true tags = { Name = "cluster_subnet" } } resource "aws_route_table" "cluster_subnet_gateway_route" { vpc_id = aws_vpc.cluster_vpc.id route { cidr_block = "0.0.0.0/0" gateway_id = aws_internet_gateway.cluster_gateway.id } tags = { Name = "cluster_subnet_gateway_route" } } resource "aws_route_table_association" "cluster_subnet_add_gateway" { subnet_id = aws_subnet.cluster_subnet.id route_table_id = aws_route_table.cluster_subnet_gateway_route.id }
Knoteninstanzen (Nodes)
Die folgende Vorlage deklariert eine MinIO-Knoteninstanz. Die Vorlagendatei
main.tf
deklariert Knoten von 11 Knotentypen. Für einige Knotentypen müssen Sieroot_block_device
einstellen. Weitere Informationen finden Sie unter EBS, Ephemeral und Root Block Devices.resource "aws_instance" "minio_node" { count = var.minio_count ami = "ami-0d8d212151031f51c" instance_type = var.minio_ec2_type key_name = var.key_name subnet_id = aws_subnet.cluster_subnet.id vpc_security_group_ids = [aws_security_group.cluster_sg.id] root_block_device { volume_type = "gp2" volume_size = 1000 } tags = { Name = "minio-${count.index + 1}" } }
Anwenden der Konfiguration
Öffnen Sie ein Terminal und navigieren Sie zu dem Ordner, in dem
main.tf
gespeichert ist.Um die Konfiguration zu initialisieren, führen Sie
terraform init
aus.Um die Konfiguration anzuwenden, führen Sie
terraform apply
aus und geben Sieyes
ein, wenn Sie dazu aufgefordert werden.
Sie haben nun einen Milvus-Cluster mit Terraform bereitgestellt.
Starten des Milvus-Clusters
In diesem Abschnitt wird beschrieben, wie Sie Ansible verwenden, um den Milvus-Cluster zu starten, den Sie bereitgestellt haben.
Ansible ist ein Konfigurationsmanagement-Tool, das zur Automatisierung der Cloud-Bereitstellung und des Konfigurationsmanagements verwendet wird.
Voraussetzungen
- Ansible Controller ist installiert.
Download Ansible Milvus-Knotenbereitstellung Playbook
Klonen Sie das Milvus-Repository von GitHub, um das Ansible Milvus Node Deployment Playbook herunterzuladen.
git clone https://github.com/milvus-io/milvus.git
Konfigurieren Sie die Installationsdateien
Die Dateien inventory.ini
und ansible.cfg
werden verwendet, um die Umgebungsvariablen und die Verifizierungsmethoden für die Anmeldung im Ansible-Playbook zu steuern. In der Datei inventory.ini
werden im Abschnitt dockernodes
alle Server der Docker-Engines definiert. Der Abschnitt ansible.cfg
definiert alle Server der Milvus-Koordinatoren. Der Abschnitt node
definiert alle Server der Milvus-Knoten.
Geben Sie den lokalen Pfad zum Playbook ein und konfigurieren Sie die Installationsdateien.
$ cd ./milvus/deployments/docker/cluster-distributed-deployment
inventory.ini
Konfigurieren Sie inventory.ini
, um die Hosts entsprechend ihrer Rolle im Milvus-System in Gruppen einzuteilen.
Fügen Sie Hostnamen hinzu, und definieren Sie die Gruppen docker
und vars
.
[dockernodes] #Add docker host names.
dockernode01
dockernode02
dockernode03
[admin] #Add Ansible controller name.
ansible-controller
[coords] #Add the host names of Milvus coordinators.
; Take note the IP of this host VM, and replace 10.170.0.17 with it.
dockernode01
[nodes] #Add the host names of Milvus nodes.
dockernode02
[dependencies] #Add the host names of Milvus dependencies.
; dependencies node will host etcd, minio, pulsar, these 3 roles are the foundation of Milvus.
; Take note the IP of this host VM, and replace 10.170.0.19 with it.
dockernode03
[docker:children]
dockernodes
coords
nodes
dependencies
[docker:vars]
ansible_python_interpreter= /usr/bin/python3
StrictHostKeyChecking= no
; Setup variables to control what type of network to use when creating containers.
dependencies_network= host
nodes_network= host
; Setup varibale to control what version of Milvus image to use.
image= milvusdb/milvus-dev:master-20220412-4781db8a
; Setup static IP addresses of the docker hosts as variable for container environment variable config.
; Before running the playbook, below 4 IP addresses need to be replaced with the IP of your host VM
; on which the etcd, minio, pulsar, coordinators will be hosted.
etcd_ip= 10.170.0.19
minio_ip= 10.170.0.19
pulsar_ip= 10.170.0.19
coords_ip= 10.170.0.17
; Setup container environment which later will be used in container creation.
ETCD_ENDPOINTS= {{etcd_ip}}:2379
MINIO_ADDRESS= {{minio_ip}}:9000
PULSAR_ADDRESS= pulsar://{{pulsar_ip}}:6650
QUERY_COORD_ADDRESS= {{coords_ip}}:19531
DATA_COORD_ADDRESS= {{coords_ip}}:13333
ROOT_COORD_ADDRESS= {{coords_ip}}:53100
INDEX_COORD_ADDRESS= {{coords_ip}}:31000
ansible.cfg
ansible.cfg
steuert die Aktion des Playbooks, z. B. SSH-Schlüssel usw. Richten Sie keine Passphrase über den SSH-Schlüssel auf Docker-Hosts ein. Andernfalls wird die Ansible SSH-Verbindung fehlschlagen. Wir empfehlen, auf allen drei Hosts denselben Benutzernamen und SSH-Schlüssel einzurichten und das neue Benutzerkonto so einzurichten, dass es sudo ohne Passwort ausführen kann. Andernfalls erhalten Sie die Fehlermeldung, dass der Benutzername nicht mit dem Kennwort übereinstimmt oder dass Sie beim Ausführen des Ansible-Playbooks keine erhöhten Rechte erhalten.
[defaults]
host_key_checking = False
inventory = inventory.ini # Specify the Inventory file
private_key_file=~/.my_ssh_keys/gpc_sshkey # Specify the SSH key that Ansible uses to access Docker host
deploy-docker.yml
deploy-docker.yml
definiert die Aufgaben während der Installation von Docker. Siehe die Code-Kommentare in der Datei für Details.
---
- name: setup pre-requisites # Install prerequisite
hosts: all
become: yes
become_user: root
roles:
- install-modules
- configure-hosts-file
- name: install docker
become: yes
become_user: root
hosts: dockernodes
roles:
- docker-installation
Testen der Konnektivität von Ansible
Testen Sie die Konnektivität zu Ansible.
$ ansible all -m ping
Fügen Sie -i
in den Befehl ein, um den Pfad zur Inventarisierungsdatei anzugeben, wenn Sie ihn nicht in ansible.cfg
angegeben haben. Andernfalls verwendet Ansible /etc/ansible/hosts
.
Das Terminal gibt die folgende Meldung aus:
dockernode01 | SUCCESS => {
"changed": false,
"ping": "pong"
}
ansible-controller | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python3"
},
"changed": false,
"ping": "pong"
}
dockernode03 | SUCCESS => {
"changed": false,
"ping": "pong"
}
dockernode02 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Überprüfen Sie die Syntax des Playbooks
Überprüfen Sie die Syntax des Playbooks.
$ ansible-playbook deploy-docker.yml --syntax-check
Normalerweise gibt das Terminal Folgendes zurück:
playbook: deploy-docker.yml
Docker installieren
Installieren Sie Docker mit dem Playbook.
$ ansible-playbook deploy-docker.yml
Wenn Docker erfolgreich auf den drei Hosts installiert wurde, gibt das Terminal Folgendes zurück:
TASK [docker-installation : Install Docker-CE] *******************************************************************
ok: [dockernode01]
ok: [dockernode03]
ok: [dockernode02]
TASK [docker-installation : Install python3-docker] **************************************************************
ok: [dockernode01]
ok: [dockernode02]
ok: [dockernode03]
TASK [docker-installation : Install docker-compose python3 library] **********************************************
changed: [dockernode01]
changed: [dockernode03]
changed: [dockernode02]
PLAY RECAP *******************************************************************************************************
ansible-controller : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
dockernode01 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
dockernode02 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
dockernode03 : ok=10 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Überprüfen Sie die Installation
Melden Sie sich bei den drei Hosts mit dem SSH-Schlüssel an, und überprüfen Sie die Installation auf den Hosts.
- Für Root-Hosts:
$ docker -v
- Für Nicht-Root-Hosts:
$ sudo docker -v
Normalerweise gibt das Terminal die folgende Meldung aus:
Docker version 20.10.14, build a224086
Überprüfen Sie den Laufstatus der Container.
$ docker ps
Überprüfen Sie die Syntax
Überprüfen Sie die Syntax von deploy-milvus.yml
.
$ ansible-playbook deploy-milvus.yml --syntax-check
Normalerweise gibt das Terminal folgendes zurück:
playbook: deploy-milvus.yml
Milvus-Container erstellen
Die Aufgaben zum Erstellen von Milvus-Containern sind in deploy-milvus.yml
definiert.
$ ansible-playbook deploy-milvus.yml
Das Terminal gibt zurück:
PLAY [Create milvus-etcd, minio, pulsar] *****************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode03]
TASK [etcd] *******************************************************************************************************
changed: [dockernode03]
TASK [pulsar] *****************************************************************************************************
changed: [dockernode03]
TASK [minio] ******************************************************************************************************
changed: [dockernode03]
PLAY [Create milvus nodes] ****************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode02]
TASK [querynode] **************************************************************************************************
changed: [dockernode02]
TASK [datanode] ***************************************************************************************************
changed: [dockernode02]
TASK [indexnode] **************************************************************************************************
changed: [dockernode02]
PLAY [Create milvus coords] ***************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [dockernode01]
TASK [rootcoord] **************************************************************************************************
changed: [dockernode01]
TASK [datacoord] **************************************************************************************************
changed: [dockernode01]
TASK [querycoord] *************************************************************************************************
changed: [dockernode01]
TASK [indexcoord] *************************************************************************************************
changed: [dockernode01]
TASK [proxy] ******************************************************************************************************
changed: [dockernode01]
PLAY RECAP ********************************************************************************************************
dockernode01 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
dockernode02 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
dockernode03 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Jetzt haben Sie Milvus auf den drei Hosts installiert.
Knoten stoppen
Sie können alle Knoten stoppen, wenn Sie keinen Milvus-Cluster mehr benötigen.
terraform
auf Ihrem PATH
verfügbar ist. Führen Sie
terraform destroy
aus und geben Sieyes
ein, wenn Sie dazu aufgefordert werden.Wenn dies erfolgreich war, werden alle Knoteninstanzen gestoppt.
Wie geht es weiter?
Wenn Sie erfahren möchten, wie Sie Milvus in anderen Clouds einsetzen können: