尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MongoDB 高可用集群部署

MongoDB 高可用集群部署 MongoDB 高可用集群部署一、方案概述1.1 目标在 K8s 高可用集群上部署一套 MongoDB 高可用集群具备高可用3 数据节点副本集容忍 1 个节点故障自动故障转移主节点故障时从节点自动提升为主仲裁节点避免偶数节点脑裂持久化每个节点独立 PVC数据落盘外部访问Ingress HTTPS可选1.2 技术选型组件用途Bitnami MongoDB Helm Chart部署 MongoDB 副本集StatefulSet管理 MongoDB PodPersistentVolumeClaim每个节点的持久化存储Longhorn分布式存储MongoDB Replica Set副本集高可用1.3 架构应用 ↓ Service: mongodb.mongodb.svc.cluster.local:27017 ↓ MongoDB Replica Set (3 数据节点 1 仲裁) ├── mongodb-0 (PRIMARY) ├── mongodb-1 (SECONDARY) ├── mongodb-2 (SECONDARY) └── mongodb-arbiter-0 (ARBITER) ↓ PersistentVolume (longhorn)二、前置条件2.1 集群状态K8s 集群kubectl get nodes全部ReadyLonghorn 已部署longhornStorageClass 就绪节点数量≥ 3保证副本集能选举2.2 存储要求MongoDB 需要 PVC 持久化数据。必须提前配好 StorageClass。kubectl get storageclass这命令看 StorageClass 列表预期看到longhorn。2.3 Longhorn 存储设置这是关键步骤不改的话Longhorn 会因为“空间不足”拒绝调度副本。kubectl patch settings.longhorn.io storage-over-provisioning-percentage -n longhorn-system --typemerge -p {value:200}这条命令允许 Longhorn 超配到磁盘总容量的 200%。kubectl patch settings.longhorn.io storage-minimal-available-percentage -n longhorn-system --typemerge -p {value:10}这条命令把最小可用空间从 25% 降到 10%。2.4 镜像网络要求MongoDB 的镜像在registry-1.docker.io/bitnami/mongodb上。Bitnami 从 2025 年 8 月 28 日起移除了 Docker Hub 公共目录的免费镜像直接拉会返回 403。解决方案用bitnami/mongodb:latest标签DaoCloud 代理可用。ansible k8s_cluster -i inventory.ini -m shell -a crictl pull docker.m.daocloud.io/bitnami/mongodb:latest -b这条命令在所有节点上从 DaoCloud 代理拉bitnami/mongodb:latest。ansible k8s_cluster -i inventory.ini -m shell -a ctr -n k8s.io images tag docker.m.daocloud.io/bitnami/mongodb:latest registry-1.docker.io/bitnami/mongodb:latest -b这条命令给镜像打标签让 containerd 认为本地有registry-1.docker.io/bitnami/mongodb:latest。三、下载 MongoDB Chart3.1 从 DaoCloud 拉取不能用helm repo add bitnami因为 Bitnami 的 chart 走 Docker Hub OCI国内不通。helm pull oci://docker.m.daocloud.io/bitnamicharts/mongodb --version 19.3.0这条命令从 DaoCloud 代理拉 MongoDB chart。预期输出Pulled: docker.m.daocloud.io/bitnamicharts/mongodb:19.3.0 Digest: sha256:fe65e88b838f225d13a1df988e323d47715c7c85f14863f5b05837c12ceed000下载后本地会有mongodb-19.3.0.tgz四、部署 MongoDB4.1 生成密码和密钥openssl rand -base64 24这条命令生成一个随机密码执行两次分别得到 root 密码和副本集密钥。把两次输出保存下来。4.2 安装 MongoDBhelm install mongodb ./mongodb-19.3.0.tgz \ --namespace mongodb \ --create-namespace \ --set architecturereplicaset \ --set replicaCount3 \ --set auth.rootPasswordroot密码 \ --set auth.replicaSetKey副本集密钥 \ --set persistence.storageClasslonghorn \ --set persistence.size10Gi这条命令用本地 chart 安装 MongoDB 副本集。逐项解析参数含义mongodbrelease 名./mongodb-19.3.0.tgz本地 chart 包--namespace mongodb装到 mongodb 命名空间--create-namespace自动创建命名空间architecturereplicaset副本集模式replicaCount33 个数据节点auth.rootPasswordroot 密码auth.replicaSetKey副本集内部认证密钥persistence.storageClasslonghorn用 Longhorn 存储persistence.size10Gi每个节点 10Gi4.3 观察 Pod 启动kubectl get pods -n mongodb -w这条命令观察 Pod 启动按CtrlC退出。预期mongodb-0 1/1 Running mongodb-1 1/1 Running mongodb-2 1/1 Running mongodb-arbiter-0 1/1 Running注意chart 会自动加一个arbiter节点用于投票不存数据。五、验证 MongoDB5.1 查看 Pod 和 PVCkubectl get pods -n mongodb kubectl get pvc -n mongodb这两条命令看 Pod 和 PVC 状态。预期4 个 Pod 全部Running。PVC 全部BoundSTORAGECLASS是longhorn。5.2 查看副本集状态kubectl exec -it -n mongodb mongodb-0 -- mongosh -u root -p root密码 --authenticationDatabase admin --eval rs.status()这条命令查看副本集状态。预期1 个PRIMARY2 个SECONDARY1 个ARBITER所有成员health: 15.3 测试读写kubectl exec -it -n mongodb mongodb-0 -- mongosh -u root -p root密码 --authenticationDatabase admin --eval db.test.insertOne({name: hello})这条命令插入一条测试数据。kubectl exec -it -n mongodb mongodb-0 -- mongosh -u root -p root密码 --authenticationDatabase admin --eval db.test.find()这条命令查询数据预期返回刚才插入的记录。六、应用接入6.1 连接信息在集群内部用途地址MongoDBmongodb.mongodb.svc.cluster.local:27017简写同命名空间mongodb:27017跨命名空间mongodb.mongodb.svc.cluster.local:27017用户名root密码从 Secret 取。6.2 取密码kubectl get secret -n mongodb mongodb -o jsonpath{.data.mongodb-root-password} | base64 -d echo这条命令从 Secret 取 root 密码。6.3 应用配置示例Python (pymongo)from pymongo import MongoClient client MongoClient( mongodb://root:密码mongodb.mongodb.svc.cluster.local:27017/?replicaSetrs0authSourceadmin )Node.js (mongodb)const { MongoClient } require(mongodb); const client new MongoClient( mongodb://root:密码mongodb.mongodb.svc.cluster.local:27017/?replicaSetrs0authSourceadmin );Java (mongodb-driver)MongoClient client MongoClients.create( mongodb://root:密码mongodb.mongodb.svc.cluster.local:27017/?replicaSetrs0authSourceadmin );Go (mongo-go-driver)client, err : mongo.Connect(context.TODO(), options.Client().ApplyURI( mongodb://root:密码mongodb.mongodb.svc.cluster.local:27017/?replicaSetrs0authSourceadmin, ))6.4 部署后端服务到 K8sapiVersion: apps/v1 kind: Deployment metadata: name: my-backend namespace: default spec: replicas: 2 selector: matchLabels: app: my-backend template: metadata: labels: app: my-backend spec: containers: - name: my-backend image: my-backend:latest ports: - containerPort: 8080 env: - name: MONGODB_HOST value: mongodb.mongodb.svc.cluster.local - name: MONGODB_PORT value: 27017 - name: MONGODB_USER value: root - name: MONGODB_PASSWORD valueFrom: secretKeyRef: name: mongodb key: mongodb-root-password七、常见问题7.1 Pod 卡在ImagePullBackOff原因MongoDB 镜像在registry-1.docker.io上国内拉取超时。解决ansible k8s_cluster -i inventory.ini -m shell -a crictl pull docker.m.daocloud.io/bitnami/mongodb:latest -b ansible k8s_cluster -i inventory.ini -m shell -a ctr -n k8s.io images tag docker.m.daocloud.io/bitnami/mongodb:latest registry-1.docker.io/bitnami/mongodb:latest -b kubectl delete pod -n mongodb --all7.2 Bitnami 镜像 403原因Bitnami 从 2025 年 8 月 28 日起移除了 Docker Hub 公共目录的免费镜像。解决用bitnami/mongodb:latest标签DaoCloud 代理可用。7.3 PVC 绑不上原因Longhorn 卷调度失败。排查kubectl get volumes.longhorn.io -n longhorn-system kubectl get volume.longhorn.io volume-name -n longhorn-system -o yaml | grep -A5 type: Scheduled如果报insufficient storagekubectl patch settings.longhorn.io storage-over-provisioning-percentage -n longhorn-system --typemerge -p {value:200} kubectl patch settings.longhorn.io storage-minimal-available-percentage -n longhorn-system --typemerge -p {value:10}7.4 副本集PRIMARY选举失败原因节点不够或网络不通。排查kubectl logs -n mongodb mongodb-0 --tail50关注election failednot enough healthy nodes7.5 写操作失败原因没有PRIMARY或多数派不可用。排查kubectl exec -it -n mongodb mongodb-0 -- mongosh -u root -p 密码 --authenticationDatabase admin --eval rs.status()如果所有节点都是SECONDARY说明选举失败。八、常用操作8.1 查看 MongoDB 状态kubectl get pods -n mongodb kubectl get pvc -n mongodb kubectl get svc -n mongodb8.2 查看日志kubectl logs -n mongodb mongodb-0 --tail1008.3 连接 MongoDBkubectl exec -it -n mongodb mongodb-0 -- mongosh -u root -p 密码 --authenticationDatabase admin8.4 扩容helm upgrade mongodb ./mongodb-19.3.0.tgz \ --namespace mongodb \ --set replicaCount5这条命令把副本集从 3 节点扩到 5 节点。8.5 删除 MongoDBhelm uninstall mongodb -n mongodb kubectl delete pvc -n mongodb --all kubectl delete namespace mongodb警告删除 PVC 会删除所有数据操作前先备份。九、架构总结9.1 组件清单组件数量作用mongodb3数据节点1 主 2 从mongodb-arbiter1仲裁节点不存数据只投票StatefulSet1管理 MongoDB PodPVC3每个数据节点一块存储Service2集群内部通信和客户端入口Secret1root 密码9.2 端口速查端口用途27017MongoDB 客户端连接27018MongoDB 内部通信9.3 高可用机制故障场景影响恢复方式从节点故障无影响主节点继续服务从节点重建后重新同步主节点故障短暂不可写从节点自动选举为新主10-30 秒恢复仲裁节点故障无影响只影响选举不影响读写多个节点故障可能不可写如果超过半数节点故障副本集停止服务9.4 已知隐患隐患影响解决方案Longhorn 空间调度保守卷报insufficient storage改 over-provisioning 和 minimal-availableBitnami 免费镜像移除无法拉取最新镜像用bitnami/mongodb:latestregistry-1.docker.io 超时镜像拉不下来用 DaoCloud 代理拉并打标签未配备份数据无法恢复用 mongodump 定期备份十、总结这套 MongoDB 基于 Bitnami Helm Chart 部署提供了高可用3 数据节点副本集 1 仲裁节点容忍 1 个节点故障自动故障转移主节点故障时从节点自动提升持久化每个数据节点独立 PVC声明式管理Helm chart 一条命令部署部署中最容易踩的坑Bitnami 免费镜像移除必须用bitnami/mongodb:latest标签。registry-1.docker.io 超时必须配 DaoCloud 代理拉镜像并打标签。Longhorn 空间调度保守改storage-over-provisioning-percentage200和storage-minimal-available-percentage10。chart 拉取超时用 DaoCloud 的 OCI 代理。解决了这四个问题MongoDB 就能稳定运行。
返回列表