K8s 一键部署 MongoDB 的 Replica-Set 和 MongoDB-Express

什么是 MongoDB 副本集?

MongoDB 副本集(Replica-Set)是一个分布式数据库系统,它包含一个主节点和多个从节点。主节点负责处理所有写操作,从节点用于读取数据。当主节点发生故障时,从节点可以自动选举一个新的主节点。

副本集的主要目的是 提供高可用性和数据冗余。如果主节点发生故障,系统仍然可用并且数据不会丢失。

接下来我们详细讲解如何在 k8s 中部署 MongoDB 副本集集群模式。

部署步骤

详细拆解 k8s 部署 mongodb 副本集(Replica-Set)模式相关服务的执行步骤。

1. Secret

apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: <base64-encoded-username>
  mongo-root-password: <base64-encoded-password>
  • 优化建议:确保 <base64-encoded-username><base64-encoded-password> 已经正确编码为 Base64 格式。
  • 解释:Secret 用于存储敏感信息,如用户名和密码,以保护这些信息不被直接暴露。

2. ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-init
data:
  init-mongo.js: |
    rs.initiate(
      {
        _id : "rs0",
        members: [
          { _id: 0, host: "mongodb-replica-set-0.mongodb-replica-set:27017" },
          { _id: 1, host: "mongodb-replica-set-1.mongodb-replica-set:27017" },
          { _id: 2, host: "mongodb-replica-set-2.mongodb-replica-set:27017" }
        ]
      }
    )
  • 优化建议:确保 init-mongo.js 脚本中的主机名和端口与 StatefulSet 中的配置一致。
  • 解释:ConfigMap 用于存储配置文件或脚本,这里用于初始化 MongoDB 的副本集。

3. StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb-replica-set
spec:
  serviceName: "mongodb-replica-set"
  replicas: 3
  selector:
    matchLabels:
      app: mongodb-replica-set
  template:
    metadata:
      labels:
        app: mongodb-replica-set
    spec:
      containers:
      - name: mongodb
        image: mongo:7.0.14
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-data
          mountPath: /data/db
        - name: mongodb-init-scripts
          mountPath: /docker-entrypoint-initdb.d
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password
        - name: MONGO_REPLICA_SET_NAME
          value: rs0
  volumeClaimTemplates:
  - metadata:
      name: mongodb-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 20Gi
  volumes:
  - name: mongodb-init-scripts
    configMap:
      name: mongodb-init
  • 优化建议:
    • 确保 volumeClaimTemplates 中的存储请求大小(storage: 20Gi)符合实际需求。
    • 确保 image: mongo:7.0.14 是否最新的稳定版本。
  • 解释:StatefulSet 用于管理有状态的应用程序,如 MongoDB 副本集。它确保每个 Pod 有一个唯一的标识符,并且可以持久化存储数据。

4. Service for MongoDB

apiVersion: v1
kind: Service
metadata:
  name: mongodb-replica-set
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    app: mongodb-replica-set
  • 优化建议:确保 clusterIP: None,这表示这是一个 Headless Service,适用于 StatefulSet
  • 解释:Service 用于定义如何访问 PodHeadless Service 不会分配集群 IP,而是通过 DNS 解析 PodIP 地址。

5. Deployment for Mongo Express

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-express
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-express
  template:
    metadata:
      labels:
        app: mongo-express
    spec:
      containers:
      - name: mongo-express
        image: mongo-express:1.0.2-20-alpine3.19
        ports:
        - containerPort: 8081
        env:
        - name: ME_CONFIG_MONGODB_URL
          value: "mongodb://<username>:<password>@mongodb-replica-set-0.mongodb-replica-set:27017,mongodb-replica-set-1.mongodb-replica-set:27017,mongodb-replica-set-2.mongodb-replica-set:27017/?replicaSet=rs0"
        - name: ME_CONFIG_MONGODB_ENABLE_ADMIN
          value: "true"
        - name: ME_CONFIG_MONGODB_ADMINUSERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: ME_CONFIG_MONGODB_ADMINPASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password
  • 优化建议:
    • 确保 ME_CONFIG_MONGODB_URL 中的 <username><password> 替换为实际的用户名和密码。
    • 确保 image: mongo-express:1.0.2-20-alpine3.19 是最新的稳定版本。
  • 解释:Deployment 用于管理无状态的应用程序,如 Mongo Express,它提供了一个 Web 界面来管理和监控 MongoDB

6. Service for Mongo Express

apiVersion: v1
kind: Service
metadata:
  name: mongo-express
spec:
  ports:
  - port: 8081
    targetPort: 8081
  selector:
    app: mongo-express
  type: LoadBalancer
  • 优化建议:确保 type: LoadBalancer 符合你的环境要求,如果你在本地开发环境中,可能需要改为 NodePort
  • 解释:Service 用于定义如何访问 mongo-expressLoadBalancer 类型通常用于云环境中,提供外部访问。

应用配置

可将上述内容保存为一个文件(例如:k8s-mongodb-replicaset.yaml):

---
apiVersion: v1
kind: Secret
metadata:
  name: mongodb-secret
type: Opaque
data:
  mongo-root-username: <base64-encoded-username>
  mongo-root-password: <base64-encoded-password>

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mongodb-init
data:
  init-mongo.js: |
    rs.initiate(
      {
        _id : "rs0",
        members: [
          { _id: 0, host: "mongodb-replica-set-0.mongodb-replica-set:27017" },
          { _id: 1, host: "mongodb-replica-set-1.mongodb-replica-set:27017" },
          { _id: 2, host: "mongodb-replica-set-2.mongodb-replica-set:27017" }
        ]
      }
    )

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mongodb-replica-set
spec:
  serviceName: "mongodb-replica-set"
  replicas: 3
  selector:
    matchLabels:
      app: mongodb-replica-set
  template:
    metadata:
      labels:
        app: mongodb-replica-set
    spec:
      containers:
      - name: mongodb
        image: mongo:7.0.14
        ports:
        - containerPort: 27017
        volumeMounts:
        - name: mongodb-data
          mountPath: /data/db
        - name: mongodb-init-scripts
          mountPath: /docker-entrypoint-initdb.d
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password
        - name: MONGO_REPLICA_SET_NAME
          value: rs0
  volumeClaimTemplates:
  - metadata:
      name: mongodb-data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 20Gi
  volumes:
  - name: mongodb-init-scripts
    configMap:
      name: mongodb-init

---
apiVersion: v1
kind: Service
metadata:
  name: mongodb-replica-set
spec:
  ports:
  - port: 27017
    targetPort: 27017
  clusterIP: None
  selector:
    app: mongodb-replica-set

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-express
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo-express
  template:
    metadata:
      labels:
        app: mongo-express
    spec:
      containers:
      - name: mongo-express
        image: mongo-express:1.0.2-20-alpine3.19
        ports:
        - containerPort: 8081
        env:
        - name: ME_CONFIG_MONGODB_URL
          value: "mongodb://<username>:<password>@mongodb-replica-set-0.mongodb-replica-set:27017,mongodb-replica-set-1.mongodb-replica-set:27017,mongodb-replica-set-2.mongodb-replica-set:27017/?replicaSet=rs0"
        - name: ME_CONFIG_MONGODB_ENABLE_ADMIN
          value: "true"
        - name: ME_CONFIG_MONGODB_ADMINUSERNAME
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-username
        - name: ME_CONFIG_MONGODB_ADMINPASSWORD
          valueFrom:
            secretKeyRef:
              name: mongodb-secret
              key: mongo-root-password

---
apiVersion: v1
kind: Service
metadata:
  name: mongo-express
spec:
  ports:
  - port: 8081
    targetPort: 8081
  selector:
    app: mongo-express
  type: LoadBalancer

然后使用以下命令将其应用到 Kubernetes 集群中:

kubectl apply -f k8s-mongodb-replicaset.yaml

这样,你就可以在 Kubernetes 中部署一个高可用的 MongoDB 副本集(Replica-Set)和一个用于管理和监控的 Mongo Express

MongoDB 副本集连接字符串

连接字符串是连接到 MongoDB 副本集的必要信息。它包含以下几个部分:

  • 主机和端口:指定主节点的主机和端口号。
  • 副本集名称:指定要连接的副本集的名称。
  • 鉴权信息:如果需要用户名和密码进行身份验证,可以提供鉴权信息。
  • 其他选项:其他可选参数,如 SSL 配置、连接超时等。

连接字符串示例

  • 示例1:mongo-express 连接字符串示例

通过上面 k8s-mongodb-replicaset.yaml 文件部署的 MongoDB 副本集连接字符串示例如下:

# 字符串格式
mongodb://username:password@host1:port1,host2:port2,host3:port3/database?replicaSet=myReplicaSet&ssl=true

# 集群部署式例
mongodb://<username>:<password>@mongodb-replica-set-0.mongodb-replica-set:27017,mongodb-replica-set-1.mongodb-replica-set:27017,mongodb-replica-set-2.mongodb-replica-set:27017/?replicaSet=rs0&ssl=true

在上面的示例中,我们提供了用户名<username> 和密码<password>进行身份验证,并指定了三个主机和端口号以及要连接的副本集名称为 “rs0”,并且还设置了 SSLtrue

  • 示例2:

假设我们有一个 MongoDB 副本集,包含一个主节点和两个从节点。主节点的主机和端口号为 “host1:27017″,从节点分别为 “host2:27017”“host3:27017″。我们使用的副本集名称为 “myReplicaSet”,需要使用用户名 “admin” 和密码 “password” 进行身份验证。

以下是一个示例的连接字符串:

mongodb://admin:password@host1:27017,host2:27017,host3:27017/test?replicaSet=myReplicaSet&ssl=true&authSource=admin

在上面的示例中,我们连接到了该副本集的主节点,使用了用户名 “admin” 和密码 “password” 进行身份验证,并将数据库设置为 “test”。副本集的名称为 “myReplicaSet”,启用了 SSL 连接,并且身份验证数据库为 “admin”

连接字符串选项

连接字符串中的选项可以根据需要进行配置。以下是一些常用的选项:

  • authSource:指定用于身份验证的数据库,默认为 “admin”
  • ssl:启用 SSL 连接。
  • retryWrites:如果写操作失败,是否自动重试。
  • readPreference:读操作的偏好设置,可以是 “primary”、”secondary” 或 “nearest”
  • readConcern:读操作的一致性级别,可以是 “local”、”majority” 或 “linearizable”
  • w:写操作的确认级别,可以是 数字或 “majority”

这些选项可以根据应用程序的需求进行配置。

总结

K8s 中的 YAML 文件部署说明:

  • SecretConfigMap 确保了敏感信息和初始化脚本的安全性和正确性。
  • StatefulSetService 确保了 MongoDB 副本集(Replica-Set)的高可用性和数据持久化。
  • DeploymentService 确保了 Mongo Express 的正常运行和外部访问。

MongoDB 副本集连接字符串说明:

  • 连接字符串包含了 必要的信息,例如:主机和端口号、副本集名称以及身份验证信息。我们还讨论了一些常用的 连接字符串选项,并给出了一个示例。
  • 连接到 MongoDB 副本集可以 提供高可用性和数据冗余,确保系统在主节点故障时仍然可用。通过 正确配置连接字符串,我们可以灵活地管理 MongoDB 副本集的连接和访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DataWorks快速入门

DataWorks基于MaxCompute、Hologres、EMR、AnalyticDB、CDP等大数据引擎&#xff0c;为数据仓库、数据湖、湖仓一体等解决方案提供统一的全链路大数据开发治理平台。本文以DataWorks的部分核心功能为例&#xff0c;指导您使用DataWorks接入数据并进行业务处理、周期调度以及数据…

项目学习:仿b站的视频网站项目03-注册功能

概括 通过上一期&#xff0c;完成了项目和数据库的基础结构的搭建&#xff0c;接下来主要是完成项目的注册功能。该功能模块主要分为有两个接口&#xff0c;一个是验证码接口&#xff0c;一个是注册接口。 让我们开始吧&#xff01; 验证码接口 验证码的生成主要配合下面这…

20.100ASK_T113-PRO 开发板开机自动QT程序简单的方法一

本文详细介绍了在嵌入式系统中实现程序开机自启动的多种方法&#xff0c;包括通过修改/etc/profile、/etc/rc.local文件&#xff0c;以及在/etc/init.d目录下创建启动脚本等方式。文章还解释了不同配置文件的作用及它们之间的区别。 开机自动启动QT应用程序 用户模式下的启动 …

【Java】Linux、Mac、Windows 安装 Oracle JDK

一、Linux 环境安装JDK 1、下载 根据实际需求&#xff0c;在 Oracle 官网 上下载某版本JDK&#xff08;如 jdk-8u341-linux-x64.tar.gz&#xff09;&#xff0c;再通过文件传输工具&#xff08;如 Finalshell、FileZilla 等&#xff09;丢到服务器上。 2、安装 # 查看是否安…

Web3与智能合约:区块链技术下的数字信任体系

随着互联网的不断发展&#xff0c;Web3代表着我们迈入了一个去中心化、更加安全和智能的网络时代。作为Web3的核心组成部分&#xff0c;区块链技术为智能合约的出现和发展提供了强有力的基础。智能合约不仅仅是自动化的代码&#xff0c;它们正逐步成为重塑数字世界信任体系的关…

怎么把湖南平江1000吨黄金开采出来?开采露天金矿的实用公式与方案——露天矿山爆破设计施工方案

在露天矿山爆破设计中&#xff0c;面对多溶洞、多破碎带和多断层的复杂地质条件&#xff0c;需要制定一套科学、合理的爆破方案。以下是一份详细的爆破设计施工方案&#xff0c;包括爆破参数与计算公式&#xff1a; 一、爆破设计原则 1.安全性&#xff1a;确保爆破作业过程中的…

电子应用设计方案-20:智能电冰箱系统方案设计

智能电冰箱系统方案设计 一、系统概述 本智能电冰箱系统旨在提供更便捷、高效、智能化的食品存储和管理解决方案&#xff0c;通过集成多种传感器、智能控制技术和联网功能&#xff0c;实现对冰箱内部环境的精确监测和控制&#xff0c;以及与用户的互动和远程管理。 二、系统组成…

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号&#xff0c;由内而外&#xff0c;转向用栈解决。使用两个栈处理&#xff0c;一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…

pandas与open读取csv/txt文件速度比较

pandas与open读取csv/txt文件速度比较 由于在工作中经常需要读取txt或csv文件&#xff0c;使用pandas与open均可以读取并操作文件内容&#xff0c;但不知道那个速度更快一些&#xff0c;所以写了一个脚本去比较在文件大小不同的情况下读取数据的速度 测试结果: 大小pandas速度…

039_SettingsGroup_in_Matlab图形界面的设置选项

只要你知道你自己正在做什么&#xff0c;那么你怎么做都行。—— C.J. DateMatlab的界面与设置 Matlab的界面 Matlab的界面是GUI设计中非常值得讨论的一个议题。先来看&#xff0c;默认的Matlab界面。 这里的界面从上到下分为了四个部分&#xff0c;分别是&#xff1a; 工具…

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

.net的winfrom程序 窗体透明打开窗体时出现在屏幕右上角

窗体透明&#xff0c; 将Form的属性Opacity&#xff0c;由默认的100% 调整到 80%(尽量别低于50%)&#xff0c;这个数字越小越透明&#xff01; 打开窗体时出现在屏幕右上角 //构造函数 public frmCalendarList() {InitializeComponent();//打开窗体&#xff0c;窗体出现在屏幕…

分布式系统稳定性建设-性能优化篇

分布式系统稳定性建设-性能优化篇 系统稳定性建设是系统工程的核心内容之一。以下是一些重要的方面: 架构设计: 采用模块化、松耦合的架构设计,以提高系统的可扩展性和可维护性。合理划分系统功能模块,降低单个模块的复杂度。定义清晰的接口和数据交换标准,确保各模块之间协调…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

电容测试流程

一、外观检测 1. 目的&#xff1a;检验电容样品外观是否与规格书一致&#xff0c;制程工艺是否良好&#xff0c;确保部品的品质。 2. 仪器&#xff1a;放大镜 3. 测试说明&#xff1a; &#xff08;1&#xff09;样品上丝印与规格书中相符&#xff0c;丝印信息&#xff08;…

C++设计模式行为模式———中介者模式

文章目录 一、引言二、中介者模式三、总结 一、引言 中介者模式是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互&#xff0c; 迫使它们通过一个中介者对象进行合作。 中介者模式可以减少对象之间混乱无序的依赖关系&…

一篇保姆式centos/ubuntu安装docker

前言&#xff1a; 本章节分别演示centos虚拟机&#xff0c;ubuntu虚拟机进行安装docker。 上一篇介绍&#xff1a;docker一键部署springboot项目 一&#xff1a;centos 1.卸载旧版本 yum remove docker docker-client docker-client-latest docker-common docker-latest doc…

EasyAnimate:基于Transformer架构的高性能长视频生成方法

这里主要是对EasyAnimate的论文阅读记录&#xff0c;感兴趣的话可以参考一下&#xff0c;如果想要直接阅读原英文论文的话地址在这里&#xff0c;如下所示&#xff1a; 摘要 本文介绍了EasyAnimate&#xff0c;一种利用Transformer架构实现高性能视频生成的高级方法。我们将原…

李宏毅机器学习课程知识点摘要(6-13集)

pytorch简单的语法和结构 dataset就是数据集&#xff0c;dataloader就是分装好一堆一堆的 他们都是torch.utils.data里面常用的函数&#xff0c;已经封装好了 下面的步骤是把数据集读进来 这里是读进来之后&#xff0c;进行处理 声音信号&#xff0c;黑白照片&#xff0c;红…

gpt2的学习

现在学习下gpt2模型做摘要&#xff0c;我们都知道gpt2 是纯decoder&#xff0c;做摘要说话的效果较好。 把数据拆分 按照这个进行tokenizer 用这个tokenizer BertTokenizer.from_pretrained(‘bert-base-chinese’) 2w多词汇表 用交叉熵做lossf&#xff0c; 设好一些简单的…