在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:- ReadWriteOncecapacity:storage: 5Ginfs:path: /data/mongo-1readOnly: falseserver: 192.168.40.179
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mongo-pv-2
spec:accessModes:- ReadWriteOncecapacity:storage: 5Ginfs:path: /data/mongo-2readOnly: falseserver: 192.168.40.179
---
apiVersion: v1
kind: PersistentVolume
metadata:name: mongo-pv-3
spec:accessModes:- ReadWriteOncecapacity:storage: 5Ginfs:path: /data/mongo-3readOnly: falseserver: 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.logpidfilepath=/mongo/key/master.piddirectoryperdb=truelogappend=truebind_ip=0.0.0.0port=27017
kind: ConfigMap
metadata:name: mongodb-confnamespace: 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: mongoname: mongo-1 #需要与podname同名labels:name: mongo
spec:ports:- name: mongo-portport: 27017clusterIP: Noneselector:name: mongo-1
---
apiVersion: v1
kind: Service
metadata:namespace: mongoname: mongo-2 #需要与podname同名labels:name: mongo
spec:ports:- name: mongo-portport: 27017clusterIP: Noneselector:name: mongo-2
---
apiVersion: v1
kind: Service
metadata:namespace: mongoname: mongo-3 #需要与podname同名labels:name: mongo
spec:ports:- name: mongo-portport: 27017clusterIP: Noneselector: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: mongoname: mongo-1
spec: selector: matchLabels: name: mongo-1serviceName: "mongo-1"replicas: 1podManagementPolicy: Paralleltemplate: metadata: labels: name: mongo-1app: mongo-clusterspec: containers: - name: mongoimage: mongo:4.2imagePullPolicy: IfNotPresentcommand:  - mongod - "-f"- "/etc/mongod.conf"- "--bind_ip_all"- "--replSet"- rs0ports: - containerPort: 27017volumeMounts: - name: mongo-cnf-volumemountPath: /etc/mongod.conf/subPath: mongod.conf- name: mongo-dir mountPath: /mongovolumes:- name: mongo-cnf-volume     #映射configMap信息configMap:name: mongodb-confitems:- key: mongod.confpath: mongod.confvolumeClaimTemplates:- metadata:name: mongo-dirspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 5Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata: namespace: mongoname: mongo-2
spec: selector: matchLabels: name: mongo-2serviceName: "mongo-2"replicas: 1podManagementPolicy: Paralleltemplate: metadata: labels: name: mongo-2app: mongo-clusterspec: containers: - name: mongoimage: mongo:4.2imagePullPolicy: IfNotPresentcommand:  - mongod - "-f"- "/etc/mongod.conf"- "--bind_ip_all"- "--replSet"- rs0ports: - containerPort: 27017volumeMounts: - name: mongo-cnf-volumemountPath: /etc/mongod.conf/subPath: mongod.conf- name: mongo-dirmountPath: /mongovolumes:- name: mongo-cnf-volume     #映射configMap信息configMap:name: mongodb-confitems:- key: mongod.confpath: mongod.confvolumeClaimTemplates:- metadata:name: mongo-dirspec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 5Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata: namespace: mongoname: mongo-3
spec: selector: matchLabels: name: mongo-3serviceName: "mongo-3"replicas: 1podManagementPolicy: Paralleltemplate: metadata: labels: name: mongo-3app: mongo-clusterspec: containers: - name: mongoimage: mongo:4.2imagePullPolicy: IfNotPresentcommand:  - mongod - "-f"- "/etc/mongod.conf"- "--bind_ip_all"- "--replSet"- rs0ports: - containerPort: 27017volumeMounts: - name: mongo-cnf-volumemountPath: /etc/mongod.conf/subPath: mongod.conf- name: mongo-dirmountPath: /mongovolumes:- name: mongo-cnf-volume     #映射configMap信息configMap:name: mongodb-confitems:- key: mongod.confpath: mongod.confvolumeClaimTemplates:- metadata:name: mongo-dirspec: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-servicelabels:name: mongo-1namespace: mongo
spec:selector:name: mongo-1type: NodePortexternalTrafficPolicy: Clusterports:- name: mongo-httpnodePort: 30882port: 27017protocol: TCPtargetPort: 27017
---
#slave nodeport service
apiVersion: v1
kind: Service
metadata:name: mongo-2-front-servicelabels:name: mongo-2namespace: mongo
spec:selector:name: mongo-2type: NodePortexternalTrafficPolicy: Clusterports:- name: mongo-httpnodePort: 30883port: 27017protocol: TCPtargetPort: 27017
---
#slave nodeport service
apiVersion: v1
kind: Service
metadata:name: mongo-3-front-servicelabels:name: mongo-3namespace: mongo
spec:selector:name: mongo-3type: NodePortexternalTrafficPolicy: Clusterports:- name: mongo-httpnodePort: 30883port: 27017protocol: TCPtargetPort: 27017
[root@master mongo]# kubectl  apply -f  nodeport.yaml

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新手开抖店不出单?三种方法解决“没曝光,没流量”难题!

哈喽~我是电商月月 新手开抖店经常会这样做:开通后选品上架。然后傻傻的等待流量进来,然后每天就是刷新再刷新?最后还是没流量! 我敢说这样做你两个月也出不了单,方法错误,再好的产品也卖不出去&#xff…

C++内存管理和模板

一、内存管理 关键字:new delete 我们知道,在C语言中内存的开辟和修改,要用到函数malloc/calloc等,而且要直自己判断内存开辟是否正确,所以在C中,提供了两函数:new/delete 由于malloc无法很…

【我的代码生成器】生成React页面类

有了数据表的结构信息,就能生成React 的页面类,快捷方便。 生成界面如下: 生成的React FrmUser.js页面如下: 只需再写里面的操作逻辑代码。

婴儿专用洗衣机有必要买吗?四大宝藏婴儿测评对比

幼龄时期的宝宝的衣物,是比较需要注意的时候。可能一不注意宝宝穿在身上就会有不适宜症状发生。所以宝妈们真的要随时观察,然后在宝宝洗衣服的这上面多下点功夫,不要让宝宝受到这种无谓的伤害。小婴儿的抵抗力比我们差很多。有些细菌、病毒可…

探索未来:智能客服产品架构的演进与创新

随着科技的迅猛发展和人工智能技术的不断成熟,智能客服已经成为了现代企业提供客户服务的重要方式。而智能客服产品的架构设计则直接影响着其在实际运营中的效果和用户体验。本文将探讨智能客服产品架构的演进历程以及未来的创新趋势。 1. 传统客服架构的局限性 传…

数据结构__顺序表

概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改 需要用到数组:数组的绝对优势:下标的随机访问(因为物理空间连续) a[i]等…

Linux下使用C语言实现线程池---代码及分析

线程池 相关文章 协议 Socket编程 高并发服务器实现 线程池 如果一个客户端建立连接使用创建一个线程用于处理这一个线程, 处理结束的时候把这一个线程删除, 这个时候会导致线程的创建以及销毁会消耗大量的时间 这时候可以一次性创建多个线程, 这几个线程统称线程池, 如果客户…

spark实验三-spark进阶编程

1.Spark编程统计各地区租房人数 实验目标: (1) 掌握在IntelliJ IDEA 中操作spark程序开发 (2) 打包程序提交集群运行 实验说明: 现有一份某省份各地区租房信息文件 house.txt,文件中共有8个数据字段,字段说明…

更改ip地址的几种方式有哪些

在数字化时代,IP地址作为网络设备的标识,对于我们在网络世界中的活动至关重要。然而,出于多种原因,如保护隐私、访问特定网站或进行网络测试,我们可能需要更改IP地址。虎观代理将详细介绍IP地址的更改方法与步骤&#…

基于Java停车场管理系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

欢乐钓鱼大师秒杀源码

gg修改器设置里面单选a内存然后去试试e类型搜索鱼竿的拉杆速度然后点修改点很多增加1然后游戏返回在进去看鱼竿拉速然后在修改器的里面找到拉速一样的数值其他恢复全移除不恢复移除会闪退然后点开保留下来的拉速数值点转到会有一堆数值你得找里面找到鱼竿的伤害距离等数值就可以…

[2024最新]MySQL-mysql 8.0.11安装教程

网上的教程有很多,基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的,所以本教程可能也不是普遍适合的。 安装环境:win 10 1、下载zip安装包: MySQL8.0 For Windows zip包下载地…