开篇先交代背景:我这几天正好在帮一个做数据平台的朋友搭集群,从基础设施到数据层再到应用层,一路踩了不少坑。趁着记忆还热乎,我把“部署集群”这个主题拆成一整套可以照抄的实操笔记,今天是 Day 1,先把最核心的架构思路、选型逻辑和真实踩坑记录整理出来。无论你是要部署 Kubernetes、Redis、Kafka、Doris,还是想本地跑大模型服务(比如 Ollama、Dify、DeepSeek),这篇文章都能帮你少走弯路。
1. 部署集群前必须想清楚的三件事
很多人一上来就急着装 Kubeadm、配 etcd、拉镜像,结果装到一半发现网络规划错了,或者高可用方案根本不适合自己的场景,白熬几个通宵。我见过太多这种案例,所以先花一晚上把“为什么需要集群、需要什么形式的集群、怎么定义成功”这三件事捋清楚,后面才能顺畅。
1.1 什么样的项目真的需要集群
先说个反直觉的结论:如果你的业务只是单个服务、日均请求量不高,集群带来的复杂度会吃掉你全部收益。集群不是镀金,是有代价的——网络开销、一致性协调、故障域扩大、运维复杂度上升,每一项都在增加成本。
那什么情况才需要上集群?我一般按这三条来判断:
- 单点故障不可接受:比如核心数据库、消息中间件、对象存储,挂了就是事故,必须做故障转移。
- 单机资源不够:比如大模型推理、Spark 计算、Doris 分析引擎,一台机器的 CPU/内存/磁盘撑不住数据量。
- 需要横向扩缩容:流量有明显的波峰波谷,比如电商大促、月末结算,集群能让你动态加节点。
三条满足任意两条,就值得认真规划集群。只满足一条,先评估用单机加备份方案能否兜底,别急着上规模。
1.2 高可用、数据一致性、运维边界,哪个优先
这是部署集群前必须先定的“契约”,不同业务优先级完全不一样。
- 高可用优先:典型的如 Redis 哨兵、Kubernetes 控制面、Nacos 注册中心,它们可以容忍少量数据延迟,但绝对不能断。
- 数据一致性优先:典型如 Kafka、ZooKeeper、ES 副本写入、分布式数据库同步,必须保证数据不丢不重,否则业务会算错账。
- 运维边界优先:典型如小型企业部署 Harness、简单的 Docker Swarm 集群,团队只有一两个人,管不了太复杂的东西,那就别上太重的调度平台。
我自己的经验是:用一张表格把这些优先级列出来,每个组件后面写清楚“可容忍的宕机时间”和“可容忍的数据丢失量”,再选架构。比如 Redis 集群允许缓存丢几秒没问题,但 ES 集群写入了就不能丢,这直接决定了副本数和同步策略。
提示:在选型文档里把“如果集群挂了我该怎么办”写清楚,比“如果集群要扩容我该怎么办”重要十倍。前者决定了你半夜会不会被叫醒。
2. 基础设施层:Docker、Kubernetes 与 Proxmox 的选型博弈
基础设施层是所有上层组件的底座,也是 Day 1 里最耗时间的部分。这里的热词很密集——Docker、Kubernetes、Docker Swarm、Proxmox 高可用集群、服务器集群、集群调度,全部指向同一件事:用什么方式把一堆机器变成“一台大机器”。
2.1 先容器化还是先上编排平台
很多新手上来就想直接部署 Kubernetes,但容器化本身没做好,直接上 K8s 只会被 pod 网络、存储卷、调度策略这些概念淹没。正确路线是分两步走:
- 先用 Docker 把应用容器化,保证单个服务能在任意机器上跑起来,镜像能启动、能访问、日志能采集。
- 再引入编排平台,解决“容器多了谁来管、挂了怎么重启、流量怎么分发”的问题。
Docker Compose 适合单机多容器编排,Docker Swarm 适合小规模集群,Kubernetes 适合大规模生产环境。我见过很多小团队用 Docker Swarm 跑了一两年很稳,也有团队一开始就上 K8s 最后折腾到放弃,关键看你的规模和维护人力。
我个人的建议是:如果节点数在 5 台以内、团队没有专职运维,Docker Swarm 完全够用,部署简单、心智负担小。如果节点会持续增长、需要精细的调度和自愈能力,那就一步到位上 Kubernetes,别中途迁移,迁移成本比一开始就学 K8s 高得多。
2.2 用 kubeadm 部署 Kubernetes 集群的完整思路
Kubernetes 集群部署是热词里出现频率最高的,选型上我推荐用 kubeadm,它把控制面组件、etcd、网络插件都做了标准化处理,最适合自己管理集群的场景。下面是我整理的最稳部署路径:
# 1. 所有节点初始化(关闭 swap、加载内核模块、配置 sysctl) swapoff -a && sed -i '/swap/d' /etc/fstab modprobe br_netfilter cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 EOF sysctl --system # 2. 安装 container runtime(这里以 containerd 为例) apt-get update && apt-get install -y containerd mkdir -p /etc/containerd && containerd config default | tee /etc/containerd/config.toml # 3. 安装 kubelet kubeadm kubectl apt-get update && apt-get install -y kubelet kubeadm kubectl控制面节点执行kubeadm init之后,用生成的 kubeconfig 文件配置 kubectl,然后安装 CNI 网络插件(我习惯用 Calico 或 Flannel)。工作节点用kubeadm join加入集群。
踩坑点非常明确:
- swap 必须关掉,否则 kubelet 会不稳定,这是新手最常见的第一个报错。
- 国内网络环境下镜像拉取经常失败,kubeadm 需要指定镜像仓库地址,containerd 也要把 sandbox_image 改掉。
- Pod 网段和服务网段要在 init 时就规划好,后期改非常痛苦。我一般习惯用
10.244.0.0/16和10.96.0.0/12,并保证这俩网段和机房物理网段不冲突。
2.3 Proxmox 高可用集群是物理机层的另一种选择
如果你要部署的对象不是容器,而是虚拟机本身,那 Proxmox VE(PVE)的高可用集群就非常合适。它是基于 Debian 的虚拟化平台,底层用 Corosync 做集群通信,配合 fence 机制实现故障转移。
我去年帮一个朋友搭过三节点的 PVE 集群,核心操作是:
- 每个节点装好 PVE 后,用
pvecm create创建集群,其他节点用pvecm add加入。 - 配置好 Fencing(一般用 IPMI 或 watchdog),防止“脑裂”。
- 需要高可用的虚拟机,在硬件选项卡里启用 Watchdog,并在 Options 里勾选 Start at boot。
PVE 和 K8s 的关系不是互斥,而是互补:物理机层用 PVE 做虚拟化高可用,虚拟机里再部署 K8s 集群,这是很多企业的标准做法,隔离性和灵活性都能兼顾。
注意:PVE 高可用集群最少三节点,两节点会出现投票打平的局面,必须引入 QDevice 作为仲裁者。只买两台机器的话,别硬上 HA。
3. 数据层集群部署:Redis、Kafka、ES、Doris、MinIO 一盘棋
数据层是整个集群的“心脏”,也是热词里占比最高的部分。这一节我按照“缓存-消息-检索-对象存储-分析引擎”的链路,把这些组件的部署逻辑串起来讲,重点给出每一步的关键参数和容易忽略的坑。
3.1 Redis 集群部署的两种姿势
热词里有一条“redis集群1如何将数据同步到集群2”,这其实是 Redis 集群部署中非常经典的场景:两套集群之间怎么做数据同步。先理清 Redis 自身的集群方案:
- 主从复制:一主多从,主节点写入,从节点同步,手动或通过哨兵做故障转移。适合读多写少、能容忍秒级切换的场景。
- Redis Cluster:数据自动分片到 16384 个哈希槽,每个主节点带副本节点,官方推荐至少三主三从。
- 迁移同步工具:RedisShake、redis-port,用于两个独立集群间的数据迁移,支持全量加增量同步。
我踩过的坑是:Redis Cluster 模式下的keys命令会直接报错,因为 key 分布在不同节点。排查问题时得改用redis-cli -c集群模式,或者按哈希槽逐个节点扫描。
关于“数据同步到集群2”,最稳的姿势是用 RedisShake:
# 源集群配置 redis-shake -type sync -conf redis-shake.conf # 目标集群配置,conf 里设置 source.address 和 target.address它会先做 RDB 全量同步,再通过增量复制追平增量数据,对业务影响很小。唯一要注意的是源端必须开启repl-backlog-size,否则增量缓冲不够会追不上。
3.2 Kafka 集群部署与宕机排查
Kafka 部署的热度一直很高,核心是 ZooKeeper(或 KRaft)加 Broker 的架构。如果集群规模不大,我推荐直接用 KRaft 模式,省掉 ZooKeeper 这一层,部署简单很多。
Kafka 部署的关键参数:
broker.id全局唯一,不能重复。log.dirs数据目录建议挂独立磁盘,不要和系统盘混在一起。offsets.topic.replication.factor至少设 3,保证 offset 不丢。min.insync.replicas配合acks=all使用,防止 Partition 只有 leader 时写入成功但数据没复制。
热词里有一条“kafka 集群宕机”,这个我处理过好多次。宕机分两种:一种是整个集群不可用,另一种是单个 broker 挂掉但集群还能读。第一种通常是 ZooKeeper 集群挂了或网络分区,第二种一般不影响整体可用性,但分区副本会变成 UnderReplicated。
排查顺序我固定是:先看 broker 日志里的kafka.server.ReplicaFetcherThread和kafka.controller.ControllerChannel报错,再看 ZooKeeper 连接状态,最后用kafka-topics.sh --describe看分区副本状态。
提示:Kafka 集群的监控必须做。热词里也有 Prometheus 监控 Redis,其实用 Prometheus 加上 kafka_exporter 监控 Kafka 同样重要。没有监控的 Kafka 集群,出事就是大事故。
3.3 ES、MinIO、Doris、ClickHouse 的数据链路协同
对象存储、检索、分析引擎这块,热词也给了很多信号:ES 集群数据写入查询、MinIO 集群扩容、Doris 安装部署、ClickHouse 23 集群模式认证失败。
先说ES 集群,核心是节点角色划分:master 节点(负责集群状态管理)、data 节点(存数据和查询)、ingest 节点(数据预处理)。小集群可以 node.roles 混合,但超过 20 个节点必须分离。ES 数据写入路径是 rest -> coordinating node -> primary shard -> replica shard,所以写入性能瓶颈常在磁盘 IO 和 refresh interval。
关于写入调优,三个参数我每次都调:
refresh_interval:从默认的 1s 改成 30s,批量导入能快好几倍,实时性要求不高的场景非常香。index.number_of_replicas:写入期间可临时设 0,写完了再调回来。- 批量写入的
bulk大小,一般 5-15MB 一个批次,太大会导致内存压力。
MinIO 集群扩容是热词里的另一个重点。MinIO 集群部署时会把磁盘和节点绑成一个 erasure coded 池,旧版本扩容要整个集群停机,新版支持minio server新节点后缀方式在线扩容。关键是--config-dir下的 pool 配置要保持一致,并且所有节点的 access key/secret key 相同。
Doris 安装部署是另一个高频词。Doris 是 MPP 分析型数据库,部署相对简单:FE(Frontend)负责查询解析和元数据管理,BE(Backend)负责数据存储和计算。部署时要注意 FE 的元数据目录meta_dir不能放在临时盘,BE 的storage_root_path要规划好 medium 类型(HDD/SSD)。我试过直接跑官方的一键部署脚本,但生产环境最好手动部署,每一台机器的角色和目录都要可控。
ClickHouse 23 集群模式,热词里提到 authentication failed: password is i,这种报错十有八九是default用户的密码配置问题。ClickHouse 集群模式用remote_servers配置分片和副本,节点间通信需要 users.xml 里的密码一致。排查方法很简单:用clickhouse-client --password逐节点测试连接,再看system.clusters表确认集群拓扑是否生效。
- 部署顺序建议:先 MinIO(对象存储在底层)→ 再 ES(检索引擎)→ 再 Doris/ClickHouse(分析引擎)。数据链路是层叠关系,依赖先建的组件起来。
3.4 ZooKeeper 与 Nacos:协调服务的双雄
ZooKeeper 和 Nacos 在集群体系里负责“协调”,Kafka、HBase、Spark 依赖前者,微服务和部分大数据组件依赖后者。它们本身也是集群。
ZooKeeper 部署的关键是奇数节点(3 或 5),myid文件、zoo.cfg里的 server 列表每台机器必须一致。Nacos 部署如果使用 IPV6 地址,要在application.properties里配置nacos.core.auth.plugin.nacos.token.secret.key,同时把server.servlet.context-path和 IP 绑定关系弄清楚,否则注册中心会一直报错。
Nacos 2.x 和 1.x 的部署差异不小:2.x 引入了 gRPC 通信,需要额外开放 9848、9849 端口,很多人部署完了发现服务注册不上,就是忘了开这些端口。
4. 应用层与大模型私有化部署的实战
最近“本地部署大模型”的热度高得吓人,Ollama、DeepSeek、Dify、AnythingLLM、ComfyUI、Minimax H3 这些关键词满天飞。这一节我把它们分成“模型运行时”和“应用框架”两类来讲,否则会乱。
4.1 Ollama 与 DeepSeek 本地部署的完整链路
Ollama 是本地部署大模型的最简单入口,一条命令就能拉起 Llama、Qwen、DeepSeek 系列模型。它的原理是把模型量化后下载到本地,通过 llama.cpp 或 ggml 推理引擎在 CPU/GPU 上运行。
# 安装 Ollama curl -fsSL https://ollama.com/install.sh | sh # 拉取并运行 DeepSeek-R1 模型 ollama run deepseek-r1:7b部署完成后,Ollama 默认监听127.0.0.1:11434,如果要让集群其他节点访问,需要设置环境变量:
OLLAMA_HOST=0.0.0.0踩坑点:Ollama 默认模型存储在~/.ollama/models,如果系统盘不够大,要么把模型目录软链到数据盘,要么用OLLAMA_MODELS环境变量指定路径。还有 GPU 显存不够时,Ollama 会自动退到 CPU 推理,速度慢到你怀疑人生,建议先用ollama list确认模型实际用的引擎。
DeepSeek 本地部署大家最关注显存需求。以 DeepSeek-R1 系列为例,7B 量化版大概需要 6-8GB 显存,32B 需要 20GB 以上,671B 满血版基本别想着单机跑了,需要多卡甚至多机分布式推理。这正是“集群”的意义所在——大模型推理天然需要多机协同。
4.2 Dify 与 AnythingLLM 离线部署的差异化选择
热词里 Dify 本地部署教程、AnythingLLM 离线部署都出现了。两者的定位不同:
- Dify 是“大模型应用开发平台”,提供 RAG、Agent、工作流编排、模型管理,适合要搭建完整 AI 应用的团队。
- AnythingLLM 是“个人知识库助手”,主打轻量和私有化,适合自己或小团队把文档变成可问答的数据库。
Dify 部署一般用 Docker Compose,一键拉起 API、Worker、Web、PostgreSQL、Redis、Weaviate 或 Qdrant,配置相对重,但功能完整。
AnythingLLM 离线部署要解决的核心问题是“模型离线”和“向量化离线”。它支持 Ollama 作为模型后端,这样模型跑在局域网里,完全不需要外网。向量化模型也可以放到本地目录,通过环境变量指定。
注意:离线部署不是什么都不装,而是把依赖的模型文件、向量模型文件、镜像文件提前拉好。类似 ComfyUI 本地部署,除了主程序,很多自定义节点和模型都要手动下载,离线包要提前准备好。
4.3 大模型分布式部署与集群调度的关系
当单机装不下模型,或者并发请求太多时,“大模型部署”就变成了“集群调度”问题。热词里的“集群调度”和“ai 模型部署”在这里交汇。
常见方案有两类:
- 模型并行:把一个大模型切到多张卡或多台机器上,用 Tensor Parallel / Pipeline Parallel 协同推理。典型如 vLLM、MindSpore、Ray Serve。
- 请求级负载均衡:多副本部署同一模型,前面挂一层负载均衡,按显存和 QPS 分发请求。典型如使用 Nginx、Envoy,或者 Kubernetes 的 Service。
我的建议:先把 Ollama/Dify 单机跑通,确认模型效果没问题;再考虑多副本加负载均衡;如果模型实在太大,再上分布式推理框架。顺序不要反,否则你会在最复杂的阶段同时面对“模型效果差”和“分布式部署难”两个问题。
5. 集群部署第一天就要养的运维习惯
集群部署完成的那一刻,不是结束,是运维的开始。热词里有一条非常精准:“kubernetes 故障排查实战: 从 pod 到集群的 20 类常见故障全解析”,这提醒我们,故障排查能力是集群部署的必修课。
5.1 Prometheus 监控 Redis 集群和基础设施
Prometheus 监控 Redis 是热词,也是我强烈建议 Day 1 就做好的事。不要等到集群出问题才装监控。
- 每个 Redis 节点部署 redis_exporter,用
--check-keys参数可以额外暴露部分 key 信息。 - Prometheus 通过 static_configs 或 Consul 服务发现拉取指标。
- Grafana 用现成的 Redis Dashboard(比如 Redis Dashboard for Prometheus Redis Exporter)展示。
# prometheus.yml 片段 - job_name: 'redis' static_configs: - targets: - '192.168.1.10:9121' - '192.168.1.11:9121' - '192.168.1.12:9121'除了 Redis,node_exporter 监控每台服务器的 CPU、内存、磁盘,cadvisor 监控容器,这些都是标配。没有监控的集群,故障发生时你只能靠猜,而靠猜的运维是最累的。
5.2 Kubernetes 故障排查的固定套路
K8s 故障排查,我总结了一个循环:
- 先看 Pod:
kubectl get pods -A,确认有没有 CrashLoopBackOff、ImagePullBackOff。 - 再看事件:
kubectl describe pod <pod-name>,事件里通常直接告诉你原因。 - 再看日志:
kubectl logs <pod-name> --previous,取容器上次崩溃的日志。 - 再查网络:Pod 能不能 ping 通、Service 的 Endpoint 有没有就绪。
- 最后查集群整体:
kubectl get nodes,看节点有没有 NotReady,然后查 kubelet 日志。
常见故障类别有镜像拉取失败、资源不足导致调度失败、健康检查写错导致重启循环、PVC 挂载不上、CNI 网络异常、kubelet 证书过期等,多数问题都逃不出这个循环。
5.3 集群故障转移与扩容必须要提前演练
最后说一个很多人忽略的点:集群的故障转移和扩容,一定要在业务低峰期实际演练一次,而不是纸上谈兵。
- 对于 Redis,手动 kill 掉主节点,看哨兵是否自动提升新主;
- 对于 Kafka,停掉一个 broker,看分区副本能不能重新平衡;
- 对于 Kubernetes,直接 cordon 并 drain 一个节点,看工作负载是否迁移到其他节点;
- 对于 MinIO,看数据重构什么时候完成,期间读写是否正常。
这些演练我建议做两次:第一次在测试环境模拟,第二次在准生产环境做。每次演练完,把耗时长、失败的地方记录到运维手册里,这比任何监控告警都更能提升你的集群可靠性。
我个人在 Day 1 部署集群时的体会是:不要追求一步到位把 Kafka、ES、Doris、Redis、K8s 全铺开,那只会让你第一天就陷入泥潭。先把最小可用集跑起来——比如三台机器,一台跑 K8s 控制面和数据层组件,两台做工作节点和数据副本,验证清楚网络、存储、监控链路,再逐步加组件。集群最怕的不是慢,是乱。架构一旦乱了,后面每一步都在还债。
最后再分享一个小技巧:把每台机器的部署命令、关键配置、修改记录都写进一个 Markdown 运维日志,包括日期和原因。等集群出问题时,这一份日志能帮你省下整整一天的排查时间。