在k8s 中部署有状态服务MongoDB高可用集群详解(附带镜像)

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、前言

 1、k8s简介

2、MongoDB介绍

3、为什么要使用MongoDB 

4、Mongodb高可用方案 

二、环境准备

1、k8s集群搭建

2、MongoDB镜像准备

3、NFS存储准备

4、PV准备

5、准备configmap文件

6、创建Service

三、创建MongoDB服务

1、导入镜像

2、初始化mongo集群

3、添加外部访问


一、前言

 1、k8s简介

 Kubernetes单词起源于希腊语, 是“舵手”或者“领航员、飞行员”的意思。

Kubernetes(简称K8s)的前世今生可以追溯到谷歌(Google)内部的一个项目,它起源于2003年,当时谷歌正面临着不断增长的应用程序和服务的管理挑战。这个项目最初被称为"Borg",是一个早期的容器编排系统。Borg 的成功经验成为 Kubernetes 开发的契机。

 有关k8s起源的介绍,请参考《初识K8s之前世今生、架构、组件、前景》这篇文章

Kubernetes的优点包括可移植性、可伸缩性和扩展性。它使用轻型的YAML清单文件实现声明性部署方法,对于应用程序更新,无需重新构建基础结构。管理员可以计划和部署容器,根据需要扩展容器并管理其生命周期。借助Kubernetes的开放源代码API,用户可以通过首选编程语言、操作系统、库和消息传递总线来构建应用程序,还可以将现有持续集成和持续交付(CI/CD)工具集成。

2、MongoDB介绍

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富、最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

3、为什么要使用MongoDB 

  1. 灵活的数据模型:MongoDB采用文档型数据存储,文档以JSON格式存储,无需严格的预定义模式,使得数据存储更加灵活,适应数据模型的变化。
  2. 适用于大规模数据:MongoDB支持水平扩展和垂直扩展,可以处理大规模数据集,并提供高吞吐量和低延迟的查询性能。
  3. 高性能:MongoDB具有高效的查询引擎和索引机制,支持各种复杂的查询操作,并能够快速地返回结果,满足实时数据处理和分析的需求。
  4. 高可用性:MongoDB支持副本集和分片集群,提供自动故障转移和自动恢复功能,确保数据的持久性和可靠性,降低了系统的停机时间。
  5. 丰富的功能:MongoDB提供了丰富的功能和工具,包括复制、分片、索引、聚合框架、地理空间查询等,满足了各种数据管理和分析的需求。
  6. 易于部署和管理:MongoDB提供了简单易用的管理界面和命令行工具,支持各种部署方式,包括单节点部署、副本集部署和分片集群部署,便于开发人员快速构建和部署应用程序。
  7. 活跃的社区和生态系统:MongoDB拥有庞大的开发者社区和丰富的生态系统,提供了各种工具、驱动程序和扩展,支持开发人员快速构建和部署应用程序。

4、Mongodb高可用方案 

MongoDB的高可用方案主要包括复制集(Replica Set)和分片集群(Sharded Cluster)。

复制集:


复制集是MongoDB实现高可用性的基础方案。它由多个MongoDB实例组成,包括一个主节点(Primary)和多个从节点(Secondary)。主节点负责处理所有的写操作,并将数据变更的操作日志(Oplog)复制给从节点。从节点则复制主节点的数据,并可以处理读操作。当主节点发生故障时,从节点会通过选举产生新的主节点,确保服务的连续性。这种架构可以提供一定程度的数据冗余,防止数据丢失。但需要注意的是,复制集最多只能容忍一个节点的故障,当多个节点同时发生故障时,系统将无法正常运行。

分片集群:


分片集群是通过将数据划分为多个分片(Shard)存储在多台服务器上来实现高可用的方案。每个分片可以是一个独立的MongoDB副本集,包含主节点和从节点。应用程序通过路由器(Router)连接到分片集群,并根据分片键将数据路由到相应的分片。这种架构可以实现水平扩展,提高系统的吞吐量和存储能力。

二、环境准备

1、k8s集群搭建

这里我们使用的 k8s 集群的版本是 v1.23.1,如果还未搭建k8s集群,可以参考《在Centos中搭建 K8s 1.23 集群超详细讲解》这篇文章

2、MongoDB镜像准备

准备部署MongoDB所需的docker镜像,离线的镜像包我已经传到资源列表《mongo:4.2的docker镜像离线包》中了,大家可以自行下载,下载完成后,使用 docker load -i mongo.tar.gz 命令导入到work节点即可

3、NFS存储准备

后端存储我们使用网络存储NFS,这样,即使Pod漂移或被误删除,数据依然还在,不会丢失,NFS Server 的搭建请参考《搭建NFS服务器,部署k8s集群,并在k8s中使用NFS作为持久化储存》这篇文章

安装完成后,在NFS服务器上,创建3个数据目录,供Mongo集群使用

[root@nfs data]# mkdir /data/mongo-1 -p && mkdir /data/mongo-2 -p && mkdir /data/mongo-3 -p
[root@nfs data]# mkdir /data/mongo-1/data -p && mkdir /data/mongo-2/data -p && mkdir /data/mongo-3/data -p
[root@nfs data]# mkdir /data/mongo-1/key -p && mkdir /data/mongo-2/key -p && mkdir /data/mongo-3/key -p

添加权限

[root@nfs data]# vim /etc/exports
#添加如下内容
/data/ *(rw,sync,no_root_squash)

[root@nfs data]# exportfs -arv
exporting *:/data

4、PV准备

上面在NFS服务器上创建了3个数据目录,用于存储mongo的数据,接下来创建3个PV。调用上面的NFS存储

在k8s Master节点上编辑创建PV的YAML文件

[root@master1 mongo]# vim pv.yaml
# 添加以下内容
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv-1
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  nfs:
    path: /data/mongo-1
    readOnly: false
    server: 192.168.40.179
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv-2
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  nfs:
    path: /data/mongo-2
    readOnly: false
    server: 192.168.40.179
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mongo-pv-3
spec:
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 5Gi
  nfs:
    path: /data/mongo-3
    readOnly: false
    server: 192.168.40.179
[root@master1 mongo]# kubectl apply -f  pv.yaml
persistentvolume/mongo-pv-1 created
persistentvolume/mongo-pv-2 created
persistentvolume/mongo-pv-3 created

5、准备configmap文件

[root@master1 mongo]# vim config.yaml
# 添加如下内容
apiVersion: v1
data:
  mongod.conf: |-
    dbpath=/mongo/data
    #logpath=/mongo/log/mongodb.log
    pidfilepath=/mongo/key/master.pid
    directoryperdb=true
    logappend=true
    bind_ip=0.0.0.0
    port=27017
kind: ConfigMap
metadata:
  name: mongodb-conf
  namespace: mongo
[root@master1 mongo]# kubectl apply -f  config.yaml

6、创建Service

在k8s Master节点上编写创建Service所需的YAML文件

[root@master1 mongo]# vim service.yaml
#输入以下内容
apiVersion: v1
kind: Service
metadata:
  namespace: mongo
  name: mongo-1 #需要与podname同名
  labels:
    name: mongo
spec:
  ports:
  - name: mongo-port
    port: 27017
  clusterIP: None
  selector:
    name: mongo-1
---
apiVersion: v1
kind: Service
metadata:
  namespace: mongo
  name: mongo-2 #需要与podname同名
  labels:
    name: mongo
spec:
  ports:
  - name: mongo-port
    port: 27017
  clusterIP: None
  selector:
    name: mongo-2
---
apiVersion: v1
kind: Service
metadata:
  namespace: mongo
  name: mongo-3 #需要与podname同名
  labels:
    name: mongo
spec:
  ports:
  - name: mongo-port
    port: 27017
  clusterIP: None
  selector:
    name: mongo-3
[root@master1 mongo]# kubectl apply -f  service.yaml

三、创建MongoDB服务

1、导入镜像

在k8s 各work节点上,导入mongo的镜像

[root@node1 ~]# docker load -i mongo.tar.gz

2、编辑创建mongo的YAML文件

[root@master1 mongo]# vim mongo-sts.yaml
#添加如下内容
apiVersion: apps/v1
kind: StatefulSet
metadata: 
  namespace: mongo
  name: mongo-1
spec: 
  selector: 
    matchLabels: 
      name: mongo-1
  serviceName: "mongo-1"
  replicas: 1
  podManagementPolicy: Parallel
  template: 
    metadata: 
      labels: 
        name: mongo-1
        app: mongo-cluster
    spec: 
      containers: 
      - name: mongo
        image: mongo:4.2
        imagePullPolicy: IfNotPresent
        command:  
        - mongod 
        - "-f"
        - "/etc/mongod.conf"
        - "--bind_ip_all"
        - "--replSet"
        - rs0
        ports: 
        - containerPort: 27017
        volumeMounts: 
        - name: mongo-cnf-volume
          mountPath: /etc/mongod.conf/
          subPath: mongod.conf
        - name: mongo-dir 
          mountPath: /mongo
      volumes:
        - name: mongo-cnf-volume     #映射configMap信息
          configMap:
            name: mongodb-conf
            items:
              - key: mongod.conf
                path: mongod.conf

  volumeClaimTemplates:
  - metadata:
      name: mongo-dir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata: 
  namespace: mongo
  name: mongo-2
spec: 
  selector: 
    matchLabels: 
      name: mongo-2
  serviceName: "mongo-2"
  replicas: 1
  podManagementPolicy: Parallel
  template: 
    metadata: 
      labels: 
        name: mongo-2
        app: mongo-cluster
    spec: 
      containers: 
      - name: mongo
        image: mongo:4.2
        imagePullPolicy: IfNotPresent
        command:  
        - mongod 
        - "-f"
        - "/etc/mongod.conf"
        - "--bind_ip_all"
        - "--replSet"
        - rs0
        ports: 
        - containerPort: 27017
        volumeMounts: 
        - name: mongo-cnf-volume
          mountPath: /etc/mongod.conf/
          subPath: mongod.conf
        - name: mongo-dir
          mountPath: /mongo
      volumes:
        - name: mongo-cnf-volume     #映射configMap信息
          configMap:
            name: mongodb-conf
            items:
              - key: mongod.conf
                path: mongod.conf

  volumeClaimTemplates:
  - metadata:
      name: mongo-dir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata: 
  namespace: mongo
  name: mongo-3
spec: 
  selector: 
    matchLabels: 
      name: mongo-3
  serviceName: "mongo-3"
  replicas: 1
  podManagementPolicy: Parallel
  template: 
    metadata: 
      labels: 
        name: mongo-3
        app: mongo-cluster
    spec: 
      containers: 
      - name: mongo
        image: mongo:4.2
        imagePullPolicy: IfNotPresent
        command:  
        - mongod 
        - "-f"
        - "/etc/mongod.conf"
        - "--bind_ip_all"
        - "--replSet"
        - rs0
        ports: 
        - containerPort: 27017
        volumeMounts: 
        - name: mongo-cnf-volume
          mountPath: /etc/mongod.conf/
          subPath: mongod.conf
        - name: mongo-dir
          mountPath: /mongo
      volumes:
        - name: mongo-cnf-volume     #映射configMap信息
          configMap:
            name: mongodb-conf
            items:
              - key: mongod.conf
                path: mongod.conf

  volumeClaimTemplates:
  - metadata:
      name: mongo-dir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
[root@master1 mongo]# kubectl apply -f  mongo-sts.yaml 
[root@master ~]# kubectl exec -it mongo-1-0 -n mongo -- /bin/bash

2、初始化mongo集群

进入到第一个pod中

[root@master ~]# kubectl exec -it mongo-1-0 -n mongo -- /bin/bash
root@mongo-1-0:/# mongo

初始化集群

rs.initiate({  _id:"rs0", // replSet指定的名称
  members:[{    _id:0,    host:"mongo-1.mongo.svc.cluster.local:27017" // 主节点ip与端口,
  }]
})

将mongo-2和mongo-3加入到集群

rs0:PRIMARY> rs.add("mongo-2.mongo.svc.cluster.local:27017")
rs0:PRIMARY> rs.add("mongo-3.mongo.svc.cluster.local:27017")

3、添加外部访问

[root@master mongo]# vim nodeport.yaml
#添加如下内容
#master nodeport service
apiVersion: v1
kind: Service
metadata:
  name: mongo-1-front-service
  labels:
    name: mongo-1
  namespace: mongo
spec:
  selector:
    name: mongo-1
  type: NodePort
  externalTrafficPolicy: Cluster
  ports:
    - name: mongo-http
      nodePort: 30882
      port: 27017
      protocol: TCP
      targetPort: 27017
---
#slave nodeport service
apiVersion: v1
kind: Service
metadata:
  name: mongo-2-front-service
  labels:
    name: mongo-2
  namespace: mongo
spec:
  selector:
    name: mongo-2
  type: NodePort
  externalTrafficPolicy: Cluster
  ports:
    - name: mongo-http
      nodePort: 30883
      port: 27017
      protocol: TCP
      targetPort: 27017
---
#slave nodeport service
apiVersion: v1
kind: Service
metadata:
  name: mongo-3-front-service
  labels:
    name: mongo-3
  namespace: mongo
spec:
  selector:
    name: mongo-3
  type: NodePort
  externalTrafficPolicy: Cluster
  ports:
    - name: mongo-http
      nodePort: 30883
      port: 27017
      protocol: TCP
      targetPort: 27017
[root@master mongo]# kubectl  apply -f  nodeport.yaml

至此,mongo集群部署完成,通过nodeport即可外部访问使用

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!

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

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

相关文章

精确号码比例放通算法的设计与实现

精确号码比例放通算法的设计与实现 引言背景问题定义算法设计1. 数据结构2. 算法流程3. 伪代码4. C语言实现 结论参考文献 引言 随着通信技术的飞速发展,呼叫中心和电信运营商面临着日益增长的呼叫管理需求。在某些情况下,为了确保服务质量或者遵守特定…

⭐Unity 里调用弹出电脑系统文件选择窗 (选择图片/文件)

今天遇到的需求要从Uinty里调用选择程序外的图片,类似手机环境下拿图库的照片一样。 效果如下: 话不多说 直接上代码! 1.编辑器模式下 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; using Syst…

[阅读笔记2][FLAN]FINETUNED LANGUAGE MODELS ARE ZERO-SHOT LEARNERS

接下来这篇是谷歌的FLAN,提出了指令微调这一新范式,在2022年发表。 这篇论文指出GPT3的zero-shot性能相比few-shot性能差太多了。他们发现如果对预训练模型进行指令微调能使zero-shot性能显著提升,下面右图显示指令微调后zero-shot比GPT3 few…

[Spring Cloud] (3)gateway令牌token拦截器

文章目录 集成redisNacos配置增加 redis配置配置pomredis配置RedisConfigredis序列化工具FastJson2JsonRedisSerializer测试 令牌校验拦截器nacos配置拦截器代码微服务登录接口实现 最终效果-登录接口与数据接口 本文gateway与微服务已开源到gitee 杉极简/gateway网关阶段学习 …

ORA-00742 ORA-00312 恢复---惜分飞

有客户反馈,断电之后数据库启动报ORA-00742和ORA-00312,无法正常open 我们远程上去尝试open库结果也报同样错误 [oracleoldhis oradata]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Apr 10 09:40:03 2024 Copyright (c) 1982, 2013, Oracle. A…

基于Springboot的汉服推广网站

基于SpringbootVue的汉服推广网站设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录页 首页 图文动态区 视频动态区 近期活动 汉服交流 汉服知识 后台登录页 后台首页…

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“汉服文化平台网站”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统功能界面图 用户登录、用…

海外代理IP是什么,如何使用?

海外代理IP是一种网络工具,它允许用户通过位于海外的服务器来访问互联网。这种技术的主要作用是帮助用户突破地域限制,解锁全球视野,并保护用户的隐私和安全。 具体来说,海外代理IP的工作原理是:用户的请求首先被发送…

2024年全球可穿戴腕带设备市场将增长 7%,蓝牙BLE助力其发展

根据市场调查机构 Canalys 今日发布的最新报告,2023 年,全球可穿戴腕带设备市场实现 1.4% 的温和增长,出货量达 1.85 亿台。该机构预测 2024 年,全球可穿戴腕带市场将增长 7%。 Canalys 对 2024 年可穿戴腕带市场持谨慎乐观的态…

每日一题---OJ题: 旋转数组

片头 嗨! 小伙伴们,咱们又见面啦,今天我们一起来学习一道OJ题---旋转数组 emmm,看上去好像没有那么难,我们一起来分析分析 比如: 数组里面有7个元素,分别为 1, 2, 3, 4, 5, 6, 7 , 现在我们将数组中的元素向右轮转3个位置 第一次轮转:将最后一个元素"7"放在第一个…

HashMap与HashSet的不安全问题

HashSet的不安全问题 HashSet与ArrayList一样也存在不安全的问题&#xff0c;当多线程时也会出现ConcurrentModificationException&#xff0c;并发修改异常需要提出解决方案 问题 public static void main(String[] args) {Set<Integer> set new HashSet<>();…

基于 Operator 部署 Prometheus 监控 k8s 集群

目录 一、环境准备 1.1 选择版本 1.2 过滤镜像 1.3 修改 yaml 镜像 1.4 移动 *networkPolicy*.yaml 1.5 修改 service 文件 1.6 提前下载镜像并推送到私有镜像仓库 1.7 修改镜像&#xff08;可选&#xff09; 二、执行创建 三、查看 pod 状态 四、访问 prometheus、…

计算机毕业设计springboot小区物业报修管理系统m8x57

该物业报修管理系统实施的目的在于帮助物业管理企业升级员工管理、住户管理、报修问题管理等内部管理平台&#xff0c;整合物业管理企业物力和人力&#xff0c;全面服务于维修人员管理的内部管理需求,并重视需求驱动、管理创新、与业主交流等外部需求,通过物业管理企业各项资源…

【深入理解Java IO流0x09】解读Java NIO核心知识(下篇)

1. NIO简介 在开始前&#xff0c;让我们再简单回顾一下NIO。 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。也就是说&#xff0c;当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多…

第⑫讲:Ceph集群OSD扩缩容中Reblanceing数据的重分布

文章目录 1.Reblanceing数据重分布的概念2.验证Reblanceing触发的过程3.Reblanceing细节4.临时关闭Reblanceing机制 1.Reblanceing数据重分布的概念 当集群中OSD进行扩缩容操作后&#xff0c;会触发一个Reblanceing数据重分布的机制&#xff0c;简单的理解就是将扩缩容前后OSD…

服务调用-微服务小白入门(4)

背景 各个服务应用&#xff0c;有很多restful api&#xff0c;不论是用哪种方式发布&#xff0c;部署&#xff0c;注册&#xff0c;发现&#xff0c;有很多场景需要各个微服务之间进行服务的调用&#xff0c;大多时候返回的json格式响应数据多&#xff0c;如果是前端直接调用倒…

AI python

AI python 软件方面程序上的人工智能&#xff0c;和物理那种能跑机器人没关系

超聚变服务器快速收集硬件故障日志方法(iBMC)

1、使用网线直接连接服务器的Mgmt口&#xff0c;另外一端连接电脑 2、电脑随便配置一个192.168.2.101段的IP&#xff0c;除100外 3、使用以下默认信息连接IBMC&#xff0c;即可成功登录 默认连接地址&#xff1a;192.168.2.100 默认账号&#xff1a;Administrator 默认密码&am…

【Vit】Vision Transformer 入门与理解

在学习VIT之前&#xff0c;建议先把 Transformer 搞明白了&#xff1a;【transformer】入门与理解 做了那些改进&#xff1f; 看图就比较明白了&#xff0c;VIT只用了Encoder的部分&#xff0c;把每一个图片裁剪成若干子图&#xff0c;然后把一个子图flatten一下&#xff0c;…

[大模型]Langchain-Chatchat安装和使用

项目地址&#xff1a; https://github.com/chatchat-space/Langchain-Chatchat 快速上手 1. 环境配置 首先&#xff0c;确保你的机器安装了 Python 3.8 - 3.11 (我们强烈推荐使用 Python3.11)。 $ python --version Python 3.11.7接着&#xff0c;创建一个虚拟环境&#xff…