资讯中心

Ubuntu最小化安装部署Ollama集群:从单机到高可用生产环境实战

📅 2026/8/14 4:10:23
Ubuntu最小化安装部署Ollama集群:从单机到高可用生产环境实战
1. 项目缘起为什么要在最小化Ubuntu上折腾Ollama集群最近在折腾本地大模型推理发现单机跑Ollama虽然方便但遇到稍微复杂点的场景就有点力不从心了。比如想同时开几个不同参数的模型做A/B测试或者处理一批长文档需要并行推理单机的显存和算力很快就见底了。更别提想搞个高可用的服务单点故障一出现整个服务就挂了。这时候把多个Ollama实例组织成一个集群的想法就自然冒出来了。我选择Ubuntu 22.04 LTS最小化安装作为起点原因很直接干净、稳定、资源占用少。服务器环境不需要花里胡哨的桌面组件最小化安装能确保系统纯净所有资源都留给Ollama和它的依赖也减少了不必要的安全维护负担。而Ollama作为当前最流行的本地大模型运行框架其简洁的API和丰富的模型库让它成为构建私有化大模型服务的首选。但这个组合在实际部署时远不是apt install和ollama serve那么简单。从网络配置、服务发现、负载均衡到资源调度和性能调优每一步都有不少细节需要注意。网上能找到的教程大多只讲单机部署或者用Docker Compose简单堆叠缺乏生产环境级别的集群化思考和调优指南。我把自己在几台物理服务器上从零搭建、踩坑、优化的全过程记录下来希望能给同样想构建稳定、高效Ollama集群的朋友们一个靠谱的参考。2. 基础环境准备打造一个坚如磐石的Ubuntu底座在开始安装Ollama之前我们必须先把Ubuntu 22.04最小化安装这个“毛坯房”装修成适合长期运行服务的“精装房”。很多后续的集群问题其实都源于基础环境没配置好。2.1 系统安装后的首要十步最小化安装完成后第一件事不是急着装软件而是进行系统级的加固和优化。这里我列出了一个必做的清单更新源与系统首先替换为国内镜像源以加速下载如阿里云、腾讯云镜像然后执行sudo apt update sudo apt upgrade -y进行全面更新。关键点更新后建议重启一次确保内核升级生效。配置静态IP针对物理机/虚拟机集群节点间需要稳定的网络通信。通过netplan配置静态IP比传统的/etc/network/interfaces更现代。编辑/etc/netplan/00-installer-config.yaml示例如下network: ethernets: ens33: # 网卡名称请用ip a命令确认 dhcp4: no addresses: [192.168.1.101/24] # 本机IP和子网掩码 gateway4: 192.168.1.1 nameservers: addresses: [223.5.5.5, 8.8.8.8] # DNS服务器 version: 2应用配置sudo netplan apply。踩坑提示网卡名不对是最常见的错误务必核对。禁用Swap针对大内存机器Ollama模型加载非常消耗内存频繁使用Swap会导致性能急剧下降。如果机器物理内存足够比如64G以上建议禁用Swapsudo swapoff -a并注释掉/etc/fstab中Swap相关的行使其永久生效。优化内核参数为了支持高并发网络连接和大内存应用需要调整一些内核参数。编辑/etc/sysctl.conf在末尾添加# 增加系统最大文件描述符数量 fs.file-max 1000000 # 增加TCP连接等待队列应对突发请求 net.core.somaxconn 65535 # 加快TCP连接回收适用于内部高速网络 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_fin_timeout 30 # 增加内存溢出分配策略避免OOM Killer误杀Ollama进程 vm.overcommit_memory 1使配置生效sudo sysctl -p。修改文件句柄与进程数限制Ollama服务可能同时打开大量模型文件和处理请求。编辑/etc/security/limits.conf添加* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535注意此修改需要用户重新登录后才能生效。配置时间同步NTP集群节点间时间必须同步这对日志分析和潜在的分布式协调很重要。安装并启用chronysudo apt install -y chrony sudo systemctl enable --now chrony。使用chronyc sources检查同步状态。配置防火墙UFW安全不能忽视。默认只开放SSH端口22Ollama的默认端口11434可以稍后再开或者限定只对集群内网IP开放。sudo ufw allow 22/tcp sudo ufw allow from 192.168.1.0/24 to any port 11434 # 仅允许集群内网访问Ollama端口 sudo ufw enable安装基础诊断工具htop,nload,nvtop(如果NVIDIA GPU),iotop,sysstat(包含sar)等。这些工具在后续的调优和排错中必不可少。配置SSH免密登录为集群管理准备在所有节点上生成密钥并将公钥互相分发到其他节点的~/.ssh/authorized_keys文件中。这是实现脚本化集群管理的基础。创建专用用户和目录不建议直接使用root运行Ollama。创建一个专用用户如ollama并为其创建模型存储目录例如/data/ollama/models并设置好权限。2.2 针对NVIDIA GPU环境的特别准备如果你的集群节点配备了NVIDIA GPU这是性能的关键。Ubuntu 22.04自带的nouveau驱动必须被替换。禁用nouveau驱动编辑/etc/modprobe.d/blacklist-nouveau.conf添加blacklist nouveau options nouveau modeset0然后更新initramfs并重启sudo update-initramfs -u sudo reboot。安装NVIDIA驱动和CUDA Toolkit从NVIDIA官网下载对应GPU型号和系统版本的驱动.run文件。或者使用Ubuntu仓库的版本可能不是最新sudo apt install nvidia-driver-535 nvidia-cuda-toolkit。我更推荐从官网下载以获得最佳兼容性和性能。安装后使用nvidia-smi验证。安装NVIDIA Container Toolkit如果你未来考虑使用Docker运行Ollama这是必须的。按照NVIDIA官方文档安装确保docker run时能使用--gpus all参数。完成以上步骤你的每个Ubuntu节点都应该是一个网络稳定、安全加固、性能基线优化过的状态为承载Ollama服务打下了坚实基础。3. Ollama单节点部署与深度配置在搭建集群之前我们需要先确保单个节点上的Ollama能够完美运行。这里有很多细节比官方文档更值得关注。3.1 安装与启动避开下载的坑Ollama的安装看似简单但网络是第一个拦路虎。官方安装脚本默认从GitHub拉取速度可能极慢甚至失败。方案一使用国内镜像加速推荐这是最一劳永逸的方法。在运行安装脚本前通过环境变量指定镜像源。# 设置OLLAMA_HOST为国内镜像地址示例请寻找可用镜像 # 注意Ollama二进制本身还是从GitHub下但模型拉取会走这个镜像 export OLLAMA_HOSTmirror.ghproxy.com # 然后执行官方安装脚本 curl -fsSL https://ollama.com/install.sh | sh如果找不到合适的OLLAMA_HOST镜像可以尝试在安装后修改Ollama的服务配置文件指定模型下载镜像。方案二手动下载与安装如果脚本安装失败可以手动操作从Ollama的GitHub Releases页面直接下载对应架构通常是amd64的Linux二进制包。解压后将ollama二进制文件移动到/usr/local/bin/。手动创建systemd服务文件/etc/systemd/system/ollama.service。这是关键步骤一个优化的服务配置能解决很多问题[Unit] DescriptionOllama Service Afternetwork-online.target [Service] Typesimple Userollama # 使用我们创建的专用用户 Groupollama EnvironmentPATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin EnvironmentOLLAMA_HOST0.0.0.0 # 监听所有网络接口方便其他节点访问 EnvironmentOLLAMA_MODELS/data/ollama/models # 指定模型存储路径避免默认存到家目录 EnvironmentOLLAMA_KEEP_ALIVE24h # 控制模型在内存中的保持时间减少重复加载开销 WorkingDirectory/home/ollama ExecStart/usr/local/bin/ollama serve Restartalways RestartSec3 # 资源限制防止单个Ollama吃光所有资源 LimitNOFILE65535 LimitMEMLOCKinfinity LimitSTACKinfinity [Install] WantedBymulti-user.target设置权限并启动sudo systemctl daemon-reload sudo systemctl enable --now ollama。使用sudo systemctl status ollama检查状态用curl http://localhost:11434/api/tags测试API是否正常响应。3.2 模型管理拉取、转换与本地化Ollama的核心是模型。直接从官方拉取llama3.2、qwen2.5等模型可能会非常慢。加速模型下载配置镜像源创建或修改~/.ollama/config.json对于ollama用户路径是/home/ollama/.ollama/config.json加入镜像地址。但请注意Ollama的模型镜像并不像Docker镜像那样普遍需要自行寻找或搭建。手动导入模型文件终极方案如果网络实在不通可以从能访问的机器上通过ollama pull拉取完整模型然后使用ollama show --modelfile model-name可以查看模型信息但更直接的是找到模型存储目录通常是~/.ollama/models将整个blobs目录和manifests目录打包复制到目标服务器的相同位置。然后重启Ollama服务它就能识别出本地已存在的模型了。注意不同版本Ollama的模型存储格式可能有变此方法最好在同一版本间进行。模型运行参数调优通过Ollama的Modelfile或运行参数可以对模型进行细粒度控制。例如创建一个名为llama3.2-custom的模型副本FROM llama3.2:latest # 设置运行时的默认参数 PARAMETER num_ctx 4096 # 上下文长度 PARAMETER num_batch 512 # 批处理大小影响吞吐 PARAMETER num_gpu_layers 99 # 尽可能多的层放在GPU上如果显存够 PARAMETER main_gpu 0 # 指定主GPU PARAMETER temperature 0.7 # 创造性 SYSTEM “你是一个专业的助手。”然后使用ollama create llama3.2-custom -f ./Modelfile创建。在启动服务或运行模型时这些参数会成为默认值也可以通过API调用时覆盖。4. 构建Ollama集群从多实例到统一服务单节点搞定后我们进入集群化的核心。目标是将多个独立的Ollama实例整合成一个对客户端而言是单一入口、具备负载均衡和一定容错能力的服务。4.1 架构选型反向代理 vs 专用负载均衡器我们需要一个“交通指挥中心”将到来的推理请求分发到后端的多个Ollama实例。常见方案有Nginx / HAProxy 作为反向代理优点轻量、稳定、配置简单功能足够用于基本的轮询、加权负载。缺点缺乏服务动态发现能力。后端Ollama实例列表需要手动维护在配置文件中某个实例宕机后Nginx可能仍会向其转发请求除非配置健康检查。适用场景集群节点数量固定、变化不频繁的小规模环境。Traefik / Kong 等云原生网关优点支持动态服务发现可对接Consul, Etcd, Kubernetes Service自动健康检查熔断丰富的监控指标。缺点组件更重配置相对复杂。适用场景节点可能动态伸缩、对高可用和可观测性要求较高的生产环境。自定义调度器Python/Go编写优点完全定制化可以实现基于GPU显存剩余量、模型加载情况、请求队列长度等复杂调度策略。缺点开发维护成本高。适用场景有强烈定制化调度需求且技术团队能力较强的场景。对于大多数从零开始的部署我推荐使用Nginx因为它简单可靠足以支撑初期需求。下面以Nginx为例进行配置。4.2 基于Nginx的负载均衡配置实战假设我们有三个Ollama节点IP分别为192.168.1.101,102,103均运行在11434端口。安装Nginx在一台独立的机器上也可以是其中一个Ollama节点但建议独立以避免资源竞争安装Nginxsudo apt install nginx。配置上游Upstream与负载均衡编辑Nginx配置文件例如/etc/nginx/conf.d/ollama_cluster.conf。upstream ollama_backend { # 简单的轮询负载均衡 server 192.168.1.101:11434; server 192.168.1.102:11434; server 192.168.1.103:11434; # 可以配置权重如果某个节点性能更强 # server 192.168.1.101:11434 weight3; # server 192.168.1.102:11434 weight2; # server 192.168.1.103:11434 weight1; } server { listen 80; # 如果有域名可以配置server_name # server_name ollama.yourdomain.com; location / { proxy_pass http://ollama_backend; # 以下是一系列关键代理配置用于正确传递请求 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 以下两个超时设置至关重要大模型推理是长时操作。 proxy_connect_timeout 300s; # 后端连接超时 proxy_send_timeout 300s; # 发送请求超时 proxy_read_timeout 300s; # 读取响应超时可根据模型调整到600s或更长 proxy_buffering off; # 禁用缓冲支持Server-Sent Events (SSE) 流式输出 chunked_transfer_encoding off; # 对于某些客户端可能需要关闭 proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; # 支持WebSocket如果未来需要 } # 可选添加一个基础的健康检查端点 location /health { access_log off; return 200 healthy\n; } }关键解释proxy_buffering off和超时时间的设置是核心。Ollama的流式响应一个字一个字往外吐需要Nginx即时转发开启缓冲会导致客户端长时间收不到数据。超时时间必须远大于模型推理的最长时间。配置健康检查被动式上述配置是“被动”的Nginx不知道后端是否健康。我们可以使用Nginx的商用版或开源模块ngx_http_upstream_hc_module需编译。更简单的方案是使用nginx_upstream_check_module第三方或者用一个定时脚本检测后端失败时动态修改Nginx配置并重载。对于初期可以暂时依赖Ollama服务本身的高可用Restartalways并设置proxy_next_upstream指令在遇到超时等错误时尝试下一个后端。upstream ollama_backend { server 192.168.1.101:11434 max_fails3 fail_timeout30s; server 192.168.1.102:11434 max_fails3 fail_timeout30s; server 192.168.1.103:11434 max_fails3 fail_timeout30s; }在location /块内添加proxy_next_upstream error timeout http_500 http_502 http_503 http_504;测试与生效检查配置语法sudo nginx -t无误后重载sudo systemctl reload nginx。现在客户端只需要访问Nginx服务器的IP或域名请求就会被分发到后端集群。4.3 服务发现与状态同步的简化方案在更动态的环境中节点可能增减。完全手动改Nginx配置不现实。我们可以用一个轻量级的方案使用ConsulConsul-Template在每个Ollama节点上运行Consul Agent并注册服务。在Nginx服务器上运行consul-template它监视Consul中服务的变化并自动生成Nginx的upstream配置块然后重载Nginx。这是从静态配置迈向动态服务发现的关键一步。使用DNS轮询为所有Ollama后端节点配置同一个域名如ollama-backend.internal在DNS服务器上设置多条A记录。客户端或Nginx上游配置中使用这个域名。DNS的TTL决定了变更生效的延迟。这种方法简单但故障转移不灵敏。脚本化同步编写一个简单的脚本定期检查各节点健康状态通过调用/api/tags将健康的节点IP列表写入一个文件然后让Nginx通过include指令加载这个文件作为上游。结合inotifywait或定时重载Nginx也能实现半动态。对于中小规模固定集群方案3的脚本化方法是一个不错的折中选择复杂度可控。5. 集群性能调优与稳定性保障集群搭建起来只是第一步让它跑得又快又稳才是真正的挑战。调优是一个系统性工程需要从多个层面入手。5.1 节点级调优压榨单机性能每个Ollama实例本身的性能是集群性能的基石。GPU利用率优化监控工具使用nvtop实时监控GPU利用率、显存占用、功耗和温度。理想情况下在推理期间GPU-Util应接近100%。瓶颈分析如果GPU利用率低可能是CPU预处理tokenization或PCIe带宽成了瓶颈。使用htop观察CPU核心是否跑满尤其是单核性能。参数调整在Ollama运行命令或API请求中调整num_batch和num_thread参数。增加num_batch可以提高GPU的并行计算粒度但会消耗更多显存。num_thread控制CPU用于计算的线程数通常设置为物理核心数。独占GPU如果服务器有多个GPU可以通过环境变量CUDA_VISIBLE_DEVICES0让Ollama实例只使用第一块GPU从而在单机上运行多个实例每个实例绑定一块GPU实现单机多“卡”并行。内存与Swap管理监控使用free -h和vmstat 1监控内存和Swap使用。确保siswap in和soswap out长期为0。透明大页THP对于大内存应用可以尝试启用透明大页但效果因工作负载而异。可以通过echo always /sys/kernel/mm/transparent_hugepage/enabled临时启用并测试性能差异。OOM Killer防护在/etc/systemd/system/ollama.service中我们已经设置了LimitMEMLOCKinfinity。还可以通过/proc/pid/oom_score_adj调低Ollama进程的OOM分数减少被优先杀死的概率。磁盘I/O优化模型存储介质将模型文件OLLAMA_MODELS目录放在SSD上最好是NVMe SSD。机械硬盘的加载速度会严重拖慢模型启动时间。文件系统使用XFS或EXT4并考虑在挂载时添加noatime选项减少元数据写入。5.2 网络与请求级调优降低延迟提高吞吐集群环境下网络和请求处理策略对整体体验影响巨大。连接池与长连接确保你的客户端或调用Ollama API的应用程序使用了HTTP连接池并与Nginx/LB保持长连接。反复建立TCP/TLS连接的开销在频繁请求下不可忽视。在Nginx的upstream配置中可以设置keepalive指令来保持与后端Ollama的长连接。upstream ollama_backend { server 192.168.1.101:11434; keepalive 32; # 保持最多32个空闲长连接 }在location代理配置中也需要添加proxy_http_version 1.1; proxy_set_header Connection ;负载均衡策略进阶Nginx默认的轮询round-robin可能不是最优的。如果集群节点配置异构比如GPU型号不同、内存大小不同可以使用ip_hash基于客户端IP保证同一用户会话落到同一后端或者使用least_conn最少连接数策略。更复杂的策略如基于负载需要OpenRestyNginxLua或HAProxy来实现。请求排队与限流为了防止某个耗时极长的推理请求阻塞整个后端实例导致其他快速请求也被卡住可以在Nginx层面或应用层面实现请求队列和限流。Nginx限流使用limit_req_zone和limit_req指令对特定接口进行速率限制。应用层队列在Nginx和后端Ollama之间引入一个简单的消息队列如Redis list或者一个轻量级网关用Go/Python写将所有请求先入队由调度器根据后端负载情况出队并分发。这是实现复杂调度和公平性的有效手段。5.3 监控、日志与告警掌控集群脉搏没有监控的集群就是在“裸奔”。基础监控节点资源使用node_exporter收集每个节点的CPU、内存、磁盘、网络指标。GPU监控使用nvidia_gpu_exporter或dcgm-exporter收集GPU指标。Ollama业务指标Ollama自身提供了Prometheus格式的指标端点/api/metrics可以获取模型加载次数、推理请求数、token生成速度等关键信息。重要默认可能未开启需要在启动Ollama时设置环境变量OLLAMA_METRICStrue或在配置文件中指定。Nginx指标使用nginx-module-vts或nginx-prometheus-exporter来暴露Nginx的连接数、请求率、响应状态码等指标。日志集中化配置每个Ollama实例的systemd journal或者将其日志输出到文件然后使用rsyslog或Vector、Fluentd等工具将日志统一收集到中心化的日志服务器如Elasticsearch Kibana, Grafana Loki。在Nginx访问日志和错误日志中添加upstream_addr字段记录请求最终被转发到了哪个后端节点这对于排查问题至关重要。log_format ollama_log $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $upstream_addr $request_time $upstream_response_time; access_log /var/log/nginx/ollama_access.log ollama_log;告警设置在Prometheus Alertmanager体系中为以下情况设置告警GPU利用率持续低于10%可能服务异常或持续100%超过10分钟可能卡死。节点HTTP请求错误率5xx超过1%。模型平均响应时间P95超过设定的阈值如30秒。节点内存使用率超过90%。Ollama进程挂掉通过up指标判断。5.4 高可用与故障转移实践集群的目标之一就是高可用。当某个节点故障时服务应能无缝或尽可能少的中断继续。Nginx层高可用单点Nginx是风险。可以部署两个Nginx节点搭配Keepalived实现虚拟IPVIP漂移。当主Nginx宕机VIP自动漂移到备机客户端无需修改配置。后端节点故障处理结合前面提到的Nginxmax_fails和fail_timeout参数以及proxy_next_upstream指令可以实现基本的故障转移。但更可靠的是结合主动健康检查例如使用nginx_upstream_check_module定期向后端的/api/tags发送请求失败多次后自动将其从上游列表中剔除。会话保持Statefulness的挑战Ollama本身是无状态的吗不完全是。虽然每次API调用是独立的但模型加载在内存中是有状态的。如果一个客户端的长对话请求被负载均衡到不同节点由于模型参数和上下文在不同节点内存中独立对话会断裂。解决方案有会话粘滞Session Affinity在Nginx中使用ip_hash或基于cookie的粘滞确保同一客户端的请求落到同一后端。但这在客户端IP变化或后端节点宕机时会失效。中心化上下文管理这是更彻底的方案。设计一个外部服务来管理对话上下文将历史消息存储在Redis等外部缓存中每次推理请求都附带完整的上下文。这样后端节点就真正无状态了任何节点都可以处理任何请求。但这需要修改客户端调用逻辑或在前端Nginx后增加一个适配层。6. 进阶部署模式与未来演进基础的负载均衡集群满足大多数需求后可以考虑更高级的部署模式来应对特定场景。6.1 混合精度与模型量化部署为了在有限的GPU资源下运行更大的模型或服务更多并发模型量化是关键。Ollama原生量化支持Ollama在拉取模型时可以通过指定标签选择量化版本如llama3.2:7b-q4_K_M。q4_K_M表示4位量化是一种在精度和速度间取得较好平衡的格式。在集群规划时可以部署不同量化版本的同一模型让客户端根据对精度和速度的需求选择不同的上游。集群内异构部署可以在集群中安排一些“高精度节点”运行q8_0或f16精度模型和一些“高吞吐节点”运行q4_K_M或q2_K精度模型。通过Nginx的location规则或自定义调度器将需要高保真生成的请求如创意写作路由到高精度节点将需要快速响应的对话请求如客服问答路由到高吞吐节点。6.2 基于Docker容器化的集群部署虽然Ollama官方提供了Docker镜像但在生产集群中直接使用Docker run管理每个实例比较繁琐。更推荐使用Docker Compose或Kubernetes。Docker Compose编排为每个Ollama节点编写一个docker-compose.yml可以方便地统一管理环境变量、数据卷映射模型目录、资源限制cpus, mem_limit和网络。结合docker-compose.override.yml可以为不同节点配置差异化参数。再利用一个统一的Compose文件启动所有节点并通过外部Nginx做负载均衡。Kubernetes部署这是面向大规模、动态伸缩场景的终极方案。构建镜像可以基于官方Ollama镜像或者自己构建包含特定模型和配置的镜像。StatefulSet vs DeploymentOllama实例本身是无状态的但加载的模型数据是“状态”。如果模型存储于节点本地NVMe盘可以使用DaemonSet配合hostPath卷每个节点运行一个Pod独占本地模型缓存。如果模型存储于网络存储如NFS Ceph则可以使用Deployment。资源管理与调度在Kubernetes中可以为Ollama Pod精确请求和限制CPU、内存特别是GPU资源使用nvidia.com/gpu。Kubernetes调度器能确保Pod被调度到有足够资源的节点上。服务发现与负载均衡使用Kubernetes的ServiceClusterIP类型自动发现后端Pod并通过kube-proxy或Ingress Controller如Nginx Ingress提供统一的访问入口。配合HPAHorizontal Pod Autoscaler可以根据CPU/内存或自定义指标如请求队列长度自动伸缩Pod副本数。从裸机部署到Kubernetes是一个运维复杂度递增但灵活性和自动化程度也大幅提升的过程。对于中小团队从裸机Nginx开始逐步引入Docker Compose待业务规模和团队运维能力增长后再评估是否迁移至Kubernetes是一个稳妥的演进路径。