本节导读:掌握 Milvus 的多种部署方式,从单机测试到分布式生产环境,了解不同场景下的最佳实践和运维要点。
Milvus 提供三种主要的部署模式,满足不同规模和场景的需求:
| 组件 | 功能 | 部署要求 | 资源需求 |
|---|---|---|---|
| RootCoord | 元数据管理 | 单节点 | CPU: 2核, 内存: 4GB |
| QueryCoord | 查询协调 | 多节点 | CPU: 4核, 内存: 8GB |
| QueryNode | 查询执行 | 多节点 | CPU: 8核, 内存: 16GB |
| IndexCoord | 索引协调 | 单节点 | CPU: 4核, 内存: 8GB |
| IndexNode | 索引构建 | 多节点 | CPU: 8核, 内存: 32GB |
| DataCoord | 数据协调 | 单节点 | CPU: 4核, 内存: 8GB |
| DataNode | 数据存储 | 多节点 | CPU: 4核, 内存: 8GB, 存储: 100GB+ |
| Proxy | 代理服务 | 多节点 | CPU: 2核, 内存: 4GB |
class HardwareRequirementCalculator: """硬件需求计算器""" def calculate_requirements(self, workload_type: str, data_size: str) -> Dict: """计算硬件需求""" # 基础配置 base_config = { "cpu_per_node": 0, "memory_per_node": 0, "storage_per_node": 0, "node_count": 0 } # 根据工作负载类型调整 if workload_type == "development": base_config.update({ "cpu_per_node": 4, "memory_per_node": 8, "storage_per_node": 50, "node_count": 1 }) elif workload_type == "production_small": base_config.update({ "cpu_per_node": 8, "memory_per_node": 16, "storage_per_node": 200, "node_count": 3 }) elif workload_type == "production_medium": base_config.update({ "cpu_per_node": 16, "memory_per_node": 32, "storage_per_node": 500, "node_count": 6 }) elif workload_type == "production_large": base_config.update({ "cpu_per_node": 32, "memory_per_node": 64, "storage_per_node": 1000, "node_count": 12 }) # 根据数据规模调整 if data_size == "small": # < 1M 向量 base_config["storage_per_node"] = int(base_config["storage_per_node"] * 0.5) elif data_size == "medium": # 1M-10M 向量 base_config["storage_per_node"] = int(base_config["storage_per_node"] * 1.0) elif data_size == "large": # 10M-100M 向量 base_config["storage_per_node"] = int(base_config["storage_per_node"] * 2.0) elif data_size == "xlarge": # > 100M 向量 base_config["storage_per_node"] = int(base_config["storage_per_node"] * 4.0) return base_config # 使用示例 calculator = HardwareRequirementCalculator() requirements = calculator.calculate_requirements("production_medium", "large") print(f"硬件需求: {requirements}")
# 创建 Docker 网络 docker network create milvus-network # 启动 Milvus 单机实例 docker run -d \ --name milvus-standalone \ --network milvus-network \ -p 19530:19530 \ -v /tmp/milvus-data:/var/lib/milvus \ milvusdb/milvus:v2.6.19 # 验证服务状态 docker logs milvus-standalone | tail -20
# docker-compose.yml version: '3.8' services: milvus: image: milvusdb/milvus:v2.6.19 container_name: milvus-standalone environment: - ETCD_ENDPOINTS=etcd:2379 - MINIO_ADDRESS=minio:9000 volumes: - milvus-data:/var/lib/milvus ports: - "19530:19530" depends_on: - etcd - minio networks: - milvus-network etcd: image: quay.io/coreos/etcd:v3.5.0 container_name: etcd environment: - ETCD_AUTO_COMPACTION_MODE=revision - ETCD_AUTO_COMPACTIONRetention=1000 - ETCD_QUOTA_BACKEND_BYTES=4294967296 volumes: - etcd-data:/var/lib/etcd ports: - "2379:2379" - "2380:2380" networks: - milvus-network minio: image: minio/minio:RELEASE.2023-03-20T20-16-18Z container_name: minio environment: - MINIO_ROOT_USER=minioadmin - MINIO_ROOT_PASSWORD=minioadmin command: minio server /data --console-address ":9001" volumes: - minio-data:/data ports: - "9000:9000" - "9001:9001" networks: - milvus-network volumes: milvus-data: etcd-data: minio-data: networks: milvus-network: driver: bridge
# 添加 Milvus Helm 仓库 helm repo add milvus https://milvus-io.github.io/milvus-helm/ # 更新仓库 helm repo update # 安装 Milvus 集群 helm install milvus milvus/milvus-cluster \ --namespace milvus-system \ --create-namespace \ --set cluster.enabled=true \ --set etcd.replicaCount=3 \ --set minio.replicaCount=3 \ --set pulsar.replicaCount=2
# values.yaml - 自定义配置 cluster: enabled: true # 组件配置 components: rootCoord: replicas: 1 resources: limits: cpu: "2" memory: "4Gi" requests: cpu: "1" memory: "2Gi" queryCoord: replicas: 2 resources: limits: cpu: "4" memory: "8Gi" requests: cpu: "2" memory: "4Gi" queryNode: replicas: 4 resources: limits: cpu: "8" memory: "16Gi" requests: cpu: "4" memory: "8Gi" indexCoord: replicas: 1 resources: limits: cpu: "4" memory: "8Gi" requests: cpu: "2" memory: "4Gi" indexNode: replicas: 2 resources: limits: cpu: "8" memory: "32Gi" requests: cpu: "4" memory: "16Gi" dataCoord: replicas: 1 resources: limits: cpu: "4" memory: "8Gi" requests: cpu: "2" memory: "4Gi" dataNode: replicas: 3 resources: limits: cpu: "4" memory: "8Gi" requests: cpu: "2" memory: "4Gi" proxy: replicas: 3 resources: limits: cpu: "2" memory: "4Gi" requests: cpu: "1" memory: "2Gi" # 存储配置 storage: data: size: 100Gi etcd: size: 10Gi minio: size: 100Gi # 监控配置 metrics: enabled: true serviceMonitor: enabled: true
class AutoScaler: """自动伸缩配置器""" def configure_autoscaling(self, cluster_config: Dict) -> Dict: """配置自动伸缩""" # HPA 配置 hpa_config = { "apiVersion": "autoscaling/v2", "kind": "HorizontalPodAutoscaler", "metadata": { "name": "milvus-query-node", "namespace": "milvus-system" }, "spec": { "scaleTargetRef": { "apiVersion": "apps/v1", "kind": "Deployment", "name": "milvus-query-node" }, "minReplicas": 2, "maxReplicas": 10, "metrics": [ { "type": "Resource", "resource": { "name": "cpu", "target": { "type": "Utilization", "averageUtilization": 70 } } }, { "type": "Resource", "resource": { "name": "memory", "target": { "type": "Utilization", "averageUtilization": 80 } } } ] } } return hpa_config
class EnterpriseMilvusDeployer: """企业级 Milvus 部署器""" def __init__(self, deployment_config: Dict): self.config = deployment_config self.deployment_type = deployment_config["type"] self.environment = deployment_config["environment"] # 初始化组件 self.hardware_calculator = HardwareRequirementCalculator() self.auto_scaler = AutoScaler() def create_deployment_plan(self) -> Dict: """创建部署计划""" # 计算硬件需求 hardware_requirements = self.hardware_calculator.calculate_requirements( self.config["workload_type"], self.config["data_size"] ) # 生成配置文件 configuration = self._generate_configuration() # 创建部署脚本 deployment_scripts = self._generate_deployment_scripts() # 制定监控方案 monitoring_plan = self._create_monitoring_plan() return { "deployment_type": self.deployment_type, "environment": self.environment, "hardware_requirements": hardware_requirements, "configuration": configuration, "deployment_scripts": deployment_scripts, "monitoring_plan": monitoring_plan, "estimated_time": self._estimate_deployment_time() } def execute_deployment(self) -> Dict: """执行部署""" try: print("开始执行部署...") # 1. 环境准备 self._prepare_environment() # 2. 创建基础架构 self._create_infrastructure() # 3. 部署组件 self._deploy_components() # 4. 配置网络和安全 self._configure_network_security() # 5. 启动服务 self._start_services() # 6. 验证部署 validation_result = self._validate_deployment() if validation_result["success"]: print("✓ 部署完成") return { "status": "success", "deployment_id": uuid.uuid4().hex, "validation_results": validation_result } else: print("✗ 部署验证失败") raise Exception(f"部署验证失败: {validation_result['errors']}") except Exception as e: print(f"✗ 部署失败: {e}") self._rollback_deployment() raise # 使用示例 deployment_config = { "type": "cluster", "environment": "production", "workload_type": "production_medium", "data_size": "large", "regions": ["us-west-2", "us-east-1"] } deployer = EnterpriseMilvusDeployer(deployment_config) deployment_plan = deployer.create_deployment_plan() print(f"部署计划: {deployment_plan}")
A:
A:
A:
A:
通过本节的学习,你已经掌握了 Milvus 的多种部署方案,从单机测试到分布式集群,再到多云架构。这些部署技术将帮助你在不同的业务场景下选择最适合的部署策略。
关键词:Milvus, 部署方案, Docker, Kubernetes, 云原生
难度:进阶
预计阅读:50 分钟