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: 3selector:matchLabels:app: mongodb-replica-settemplate:metadata:labels:app: mongodb-replica-setspec:containers:- name: mongodbimage: mongo:7.0.14ports:- containerPort: 27017volumeMounts:- name: mongodb-datamountPath: /data/db- name: mongodb-init-scriptsmountPath: /docker-entrypoint-initdb.denv:- name: MONGO_INITDB_ROOT_USERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: MONGO_INITDB_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-password- name: MONGO_REPLICA_SET_NAMEvalue: rs0volumeClaimTemplates:- metadata:name: mongodb-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 20Givolumes:- name: mongodb-init-scriptsconfigMap: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: 27017targetPort: 27017clusterIP: Noneselector:app: mongodb-replica-set
- 优化建议:确保
clusterIP: None
,这表示这是一个Headless Service
,适用于StatefulSet
。 - 解释:
Service
用于定义如何访问Pod
,Headless Service
不会分配集群IP
,而是通过DNS
解析Pod
的IP
地址。
5. Deployment for Mongo Express
apiVersion: apps/v1
kind: Deployment
metadata:name: mongo-express
spec:replicas: 1selector:matchLabels:app: mongo-expresstemplate:metadata:labels:app: mongo-expressspec:containers:- name: mongo-expressimage: mongo-express:1.0.2-20-alpine3.19ports:- containerPort: 8081env:- name: ME_CONFIG_MONGODB_URLvalue: "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_ADMINvalue: "true"- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: 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: 8081targetPort: 8081selector:app: mongo-expresstype: LoadBalancer
- 优化建议:确保
type: LoadBalancer
符合你的环境要求,如果你在本地开发环境中,可能需要改为NodePort
。 - 解释:
Service
用于定义如何访问mongo-express
,LoadBalancer
类型通常用于云环境中,提供外部访问。
应用配置
可将上述内容保存为一个文件(例如: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: 3selector:matchLabels:app: mongodb-replica-settemplate:metadata:labels:app: mongodb-replica-setspec:containers:- name: mongodbimage: mongo:7.0.14ports:- containerPort: 27017volumeMounts:- name: mongodb-datamountPath: /data/db- name: mongodb-init-scriptsmountPath: /docker-entrypoint-initdb.denv:- name: MONGO_INITDB_ROOT_USERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: MONGO_INITDB_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-password- name: MONGO_REPLICA_SET_NAMEvalue: rs0volumeClaimTemplates:- metadata:name: mongodb-dataspec:accessModes: ["ReadWriteOnce"]resources:requests:storage: 20Givolumes:- name: mongodb-init-scriptsconfigMap:name: mongodb-init---
apiVersion: v1
kind: Service
metadata:name: mongodb-replica-set
spec:ports:- port: 27017targetPort: 27017clusterIP: Noneselector:app: mongodb-replica-set---
apiVersion: apps/v1
kind: Deployment
metadata:name: mongo-express
spec:replicas: 1selector:matchLabels:app: mongo-expresstemplate:metadata:labels:app: mongo-expressspec:containers:- name: mongo-expressimage: mongo-express:1.0.2-20-alpine3.19ports:- containerPort: 8081env:- name: ME_CONFIG_MONGODB_URLvalue: "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_ADMINvalue: "true"- name: ME_CONFIG_MONGODB_ADMINUSERNAMEvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-username- name: ME_CONFIG_MONGODB_ADMINPASSWORDvalueFrom:secretKeyRef:name: mongodb-secretkey: mongo-root-password---
apiVersion: v1
kind: Service
metadata:name: mongo-express
spec:ports:- port: 8081targetPort: 8081selector:app: mongo-expresstype: 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”
,并且还设置了 SSL
为 true
。
- 示例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
文件部署说明:
Secret
和ConfigMap
确保了敏感信息和初始化脚本的安全性和正确性。StatefulSet
和Service
确保了MongoDB
副本集(Replica-Set
)的高可用性和数据持久化。Deployment
和Service
确保了Mongo Express
的正常运行和外部访问。
MongoDB
副本集连接字符串说明:
- 连接字符串包含了
必要的信息
,例如:主机和端口号、副本集名称以及身份验证信息
。我们还讨论了一些常用的连接字符串选项
,并给出了一个示例。 - 连接到
MongoDB
副本集可以提供高可用性和数据冗余
,确保系统在主节点故障时仍然可用。通过正确配置连接字符串
,我们可以灵活地管理MongoDB
副本集的连接和访问。
相关文章:
K8s 一键部署 MongoDB 的 Replica-Set 和 MongoDB-Express
什么是 MongoDB 副本集? MongoDB 副本集(Replica-Set)是一个分布式数据库系统,它包含一个主节点和多个从节点。主节点负责处理所有写操作,从节点用于读取数据。当主节点发生故障时,从节点可以自动选举一个…...
2024小迪安全基础入门第四课
目录 Web应用&蜜罐系统&堡垒机运维&API内外接口&第三方拓展架构&部署影响 堡垒机的核心功能 堡垒机的优势 API的结构 Web应用&蜜罐系统&堡垒机运维&API内外接口&第三方拓展架构&部署影响 蜜罐(Honeypot)是…...
一文详解使用java easyexcel导出文件的几种情况
情况一:简单的导出指定类型文档,不要求格式 filePath-文件路径// 设置响应头response.setContentType("application/octet-stream");// 字符集处理,确保文件名的正确显示response.setHeader("Content-Disposition","…...

【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
博客主页: [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 💯前言💯C 语言与 C 语言的输入输出对比1.1 C 语言的输入输出1.2 C 语言的输入输出 💯 std::ios::sync_with_stdio(false) 的作用与意义2.1 什么是 std::ios::sync_with_st…...

NUXT3学习日记四(路由中间件、导航守卫)
前言 在 Nuxt 3 中,中间件(Middleware)是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑,像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用,也可以只在特定页…...

数据科学与SQL:组距分组分析 | 区间分布问题
目录 0 问题描述 1 数据准备 2 问题分析 3 小结 0 问题描述 绝对值分布分析也可以理解为组距分组分析。对于某个指标而言,一个记录对应的指标值的绝对值,肯定落在所有指标值的绝对值的最小值和最大值构成的区间内,根据一定的算法&#x…...

odoo18中模型的常用字段类型
字段的公共属性: Char 字符类型,对应数据库中varchar类型,除了通用类型外接收另外两个参数: size: 字符长度,超出的长度将被截断 trim: 默认True,是否字段值应该被去空白。 Text 文本类型,对应数据库…...
【如何用更少的数据作出更好的决策】-gpt生成
如何用更少的数据作出更好的决策 用更少的数据作出更好的决策是一种能力的体现,需要结合有效的方法、严谨的逻辑以及对问题的深刻理解。以下是一些可以帮助你实现这一目标的策略: 明确目标 在收集和分析数据之前,先明确你的决策目标是什么…...
ara::com 与 AUTOSAR 元模型的关系总结
原文链接:AUTOSAR_EXP_ARAComAPI的7章笔记(6) 整体说明 先是表明此前解释 ara::com API 思想和机制时未涉及具体 AP 元模型清单部分,本章旨在阐明 ara::com 与相关元模型部分的关系,且是较高层次的基本理解性介绍&am…...

springboot整合hive
springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…...

浅谈 proxy
应用场景 Vue2采用的defineProperty去实现数据绑定,Vue3则改为Proxy,遇到了什么问题? - 在Vue2中不能检测数组和对象的变化 1. 无法检测 对象property 的添加或移除 var vm new Vue({data:{a:1} })// vm.a 是响应式的vm.b 2 // vm.b 是…...

Ansys Maxwell:SheetScan - 导入材料特性曲线
你好, 在这篇博文中,我展示了如何使用 Ansys Maxwell“SheetScan”工具导入材料特性数据集。在这篇博文中,我展示了如何导入复杂磁导率实部数据集以用于涡流(频率相关)求解器,并以 Ferroxcube 磁芯材料规格…...

解决 Android 单元测试 No tests found for given includes:
问题 报错: Execution failed for task :testDebugUnitTest. > No tests found for given includes: 解决方案 1、一开始以为是没有给测试类加public修饰 2、然后替换 Test 注解的包可以解决,将 org.junit.jupiter.api.Test 修改为 org.junit.Tes…...

人工智能的核心思想-神经网络
神经网络原理 引言 在理解ChatGPT之前,我们需要从神经网络开始,了解最简单的“鹦鹉学舌”是如何实现的。神经网络是人工智能领域的基础,它模仿了人脑神经元的结构和功能,通过学习和训练来解决复杂的任务。本文将详细介绍神经网络…...
JAVA中的Lamda表达式
JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性,用于简化代码,特别是在处理函数式编程时。Lambd…...

锂电池学习笔记(一) 初识锂电池
前言 锂电池近几年一直都是很热门的产品,充放电管理更是学问蛮多,工作生活中难免会碰到,所以说学习锂电池是工程师的必备知识储备,今天学习锂电池的基本知识,分类,优缺点,循序渐进 学习参考 【…...
深度学习2
四、tensor常见操作 1、元素值 1.1、获取元素值 tensor.item() 返回tensor的元素;只能在一个元素值使用,多个报错,当存在多个元素值时需要使用索引进行获取到一个元素值时在使用 item。 1.2、元素值运算 tensor对元素值的运算:…...

第六节-AppScan扫描报告
第六节-AppScan扫描报告 1.加载扫描结果 1.点击【打开】 2.选择之前保存过的扫描结果 3.等待加载完成 2.领导查看的报告 1.点击【报告】 2.模板选择为【缺省值】 3.最低严重性选择为【中】,测试类型选择为【应用程序】 4.点击【布局】 5.选择【其他徽标】&#x…...

【c++丨STL】stack和queue的使用及模拟实现
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…...

基于SpringBoot的在线教育系统【附源码】
基于SpringBoot的在线教育系统 效果如下: 系统登录页面 系统管理员主页面 课程管理页面 课程分类管理页面 用户主页面 系统主页面 研究背景 随着互联网技术的飞速发展,线上教育已成为现代教育的重要组成部分。在线教育系统以其灵活的学习时间和地点&a…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...