milvus-logo
LFAI
Home

(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

  • Terraform installieren und konfigurieren

  • AWS CLI installieren und konfigurieren

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 und inventory.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 von index_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 eine my_ip Variable. Die Variable key_name steht für den AWS-Zugangsschlüssel. Die Variable my_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 in variables.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 Sie root_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

  1. Öffnen Sie ein Terminal und navigieren Sie zu dem Ordner, in dem main.tf gespeichert ist.

  2. Um die Konfiguration zu initialisieren, führen Sie terraform init aus.

  3. Um die Konfiguration anzuwenden, führen Sie terraform apply aus und geben Sie yes 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

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.

Stellen Sie sicher, dass die Binärdatei terraform auf Ihrem PATH verfügbar ist.
  1. Führen Sie terraform destroy aus und geben Sie yes ein, wenn Sie dazu aufgefordert werden.

  2. 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:

Übersetzt vonDeepLogo

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?