Docker 快速搭建 MongoDB 4.x 集群(一主一从)

目录

  • 1. 生成 mongo-file
  • 2. 启动主节点
  • 3. 启动从节点
  • 4. 配置副本集
  • 5. 注意事项

环境:MongoDB 4.0.25,Alma Linux(建议使用 Linux)

部署的时候是在同一个及其上操作的,实际可以放在不同机器上。

截止到 2024年05月,MongoDB 已经到 7.x 版本,后续再补一个 7.x 较新版本的安装方法。

注意:主要是测试环境使用,如果是生产环境不推荐使用 Docker 进行部署数据库的相关组件。

该方式同样适用于 k8s 部署 MongoDB,但是要注意以下几个必要条件:

  • 做好数据目录的映射,以保持数据的持久化,从而防止重启丢失数据。
  • 保证两个数据库容器的网络互通性。
  • 确保集群认证文件(下面的 mongo-keyfile 文件)可被多个 MongoDB 实例访问。

该镜像使用的 Docker 官方提供的镜像:https://hub.docker.com/_/mongo,并不是 MongoDB 官方提供的;官方 MongoDB 提供的是:https://hub.docker.com/r/mongodb/mongodb-community-server。
两者的参数简单的对比了一下几乎是通用的,但是建议搭建集群的时候使用一样的 image 以及 tag,不要混用

在这里插入图片描述

【注】为了方便测试环境测试,需要设置允许任意 IP 访问 MongoDB 实例;在启动容器时将--bind_ip选项设置为 0.0.0.0即可,这将允许 MongoDB 监听所有网络接口。另外,为了确保安全性,建议使用适当的防火墙规则和安全组来限制访问。

1. 生成 mongo-file

参考官网:Deploy Replica Set With Keyfile Authentication

示例中将 mongo-keyfile 放到了 /home 目录下,实际根据需要修改路径即可。

因为是同一个 Docker 主机,所以其他容器都挂载了同一个认证文件;但是实际上只要保证文件内容一样即可,在每个服务器上都创建一样内容的认证文件,并同时保证权限正确即可。

# 生成一个756字节长的随机数据,使用base64编码后保存到文件中
openssl rand -base64 756 > /home/mongo-keyfile
# OR 也可以自定义数据生成,以保证在各个服务器中是一样的
echo "your-secure-key-content" > /home/mongo-keyfile# 设置文件权限
cd /home# 》》》【看这里】这一步很关键,一定要将文件的所有者设置为 999 用户和用户组,
# 999 对应的是 Mongo 容器中的 mongodb 用户和 mongodb 用户组
# 否则就会出现很头疼的权限问题
chown 999:999 mongo-keyfile# 给个最小权限即可
chmod 400 mongo-keyfile

【注】999:999 这仅适用于 Docker 容器,如果是虚拟机直接部署的话,还需要根据实际情况设置权限:看运行 MongoDB 实例的是哪个用户,就将 mongo-keyfile 的所有者设置为哪个用户即可

生成的文件要设置合适的权限,否则会报错:

# 权限太大
ACCESS   [main] permissions on /home/mongo-keyfile are too open
# 没有权限
ACCESS   [main] error opening file: /home/mongo-keyfile: Permission denied

如果使用 windows 的话,文件权限比较麻烦;建议直接用用 Linux 虚拟机,或者把文件映射到 Linux 容器中来设置。

2. 启动主节点

docker run -d \--name mongo_primary \-p 27017:27017 \-v /xxxx/mongodb/mongo-keyfile:/home/mongo-keyfile-v /xxxx/mongodb/primary:/data/db \-e MONGO_INITDB_ROOT_USERNAME=admin \-e MONGO_INITDB_ROOT_PASSWORD=123456 \mongo:4.0.25 \--replSet rs0 --bind_ip 0.0.0.0 --keyFile /home/mongo-keyfile
  • MongoDB 的数据存储路径,默认是 /data/db。这是最重要的路径,需要将其映射到主机上的持久存储,以确保数据在容器重启或删除后不会丢失。
  • --keyFile:指定集群认证文件。

3. 启动从节点

如果不部署的话,就一个节点也可以设置为集群(只有一个主节点)。

docker run -d \--name mongo_slave001 \-p 27018:27017 \-v /xxxx/mongodb/mongo-keyfile:/home/mongo-keyfile-v /xxxx/mongodb/slave001:/data/db \-e MONGO_INITDB_ROOT_USERNAME=admin \-e MONGO_INITDB_ROOT_PASSWORD=123456 \mongo:4.0.25 \--replSet rs0 --bind_ip 0.0.0.0 --keyFile /home/mongo-keyfile

参数大部分与主节点一样,如果是在同一个机器上需要注意端口冲突。因为示例中是在同一个 host 上部署了两个容器,所以从节点使用了 27018 端口。

如果是多个从节点的话就继续部署多个即可,保证认证文件 (monog-keyfile) 的内容是一样的。

4. 配置副本集

等到容器启动后,进入主节点容器:

# 进入容器内部
docker exec -it mongo_primary bash# 容器内部
mongo -u admin -p 123456 --authenticationDatabase admin

在MongoDB shell中运行以下命令以初始化副本集:

rs.initiate({_id: "rs0",members: [{ _id: 0, host: "192.168.10.110:27017" },{ _id: 1, host: "192.168.10.110:27018" }]
})
  • IP 不要使用 127.0.0.1,如果使用的话是表示本容器,将无法访问其他容器中的服务;建议使用宿主机器的 IP
  • 这里为了省事就在同一个机器上部署了多个 MongoDB 容器,条件允许的话可以在多个机器上部署 MongoDB 容器。
  • 初始化副本集的 rs0 名称要与运行容器时指定的 --replSet rs0 参数保持一致,这种一致性确保了所有实例能够正确地识别和加入同一个副本集,
  • 一个节点也可以设置为集群(只有一个主节点),但是实际生产中推荐至少三个节点

等待副本集初始化完成,然后通过运行以下命令检查副本集状态:

rs.status()

5. 注意事项

  1. 安全性: 将 MongoDB 实例暴露给任意 IP 访问可能会带来安全风险,确保白名单的配置。如果使用云厂商提供的数据库,请确保在生产环境中使用防火墙或云提供商的安全组来限制对 MongoDB 实例的访问。
  2. 防火墙配置: 如果您在云环境中运行 MongoDB 实例,请确保安全组或防火墙规则允许对 MongoDB 端口(如27017)的访问。
  3. 使用SSL/TLS: 考虑启用 SSL/TLS 来加密客户端和 Mongo DB服务器之间的通信。

在这里插入图片描述

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

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

相关文章

JAVA学习·String类的常用方法

String 类及其创建 String 类的创建 String 类是 Java 内置的一个类,其完全限定类名是java.lang.String。想要创建一个字符串有多重方式,比如创建字符串"Hello": String s1 "Hello"; // 字面量创建 String s2 new St…

在组件外使用pinia的坑

来源 项目包含很多静态的类型,我新建了一个js来专门管理和使用这些类型,如下图这种,有一部分是固定的,千年不变,有一部分是偶尔会变(需要后台获取),还有一部分是要登录后才能拿到的…

python PyQt5 数字时钟程序

效果图: 概述 本文档将指导您如何使用Python的PyQt5库创建一个简单的时钟程序。该程序将显示当前时间,并具有以下特性: 始终在最前台显示。窗口可拖动。鼠标右键点击窗口可弹出退出菜单。时间标签具有红色渐变效果。窗口初始化时出现在屏幕…

骨折分类数据集1129张10类别

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):1129 分类类别数:10 类别名称:["avulsion_fracture",…

鸿蒙OS开发:【一次开发,多端部署】(导航栏) 导航栏

一多导航栏 介绍 本示例展示了导航组件在不同设备形态下的样式。 在sm设备上,以tabs形式展示,内容、导航为上下样式布局,通过点击底部tabs切换内容;在md/lg设备上,以[SideBarContainer]形式展示,内容、导…

RocketMQ学习(1) 快速入门

mq的一些前置知识和概念知识可以看这篇文章——SpringCloud入门(3) RabbitMQ,比如常见mq的对比等等,这篇文章不再赘述。 目录 RocketMQ概念、安装与配置docker配置 RocketMQ快速入门**同步消息消费模式 **异步消息*单向消息**延迟消息*顺序消息批量消息事…

大工作量LUAD代谢重编程模型多组学(J Transl Med)

目录 1,单细胞早期、晚期和转移性 LUAD 的细胞动力学变化 2,细胞代谢重编程介导的LUAD驱动恶性转移的异质性 3,模型构建 S-MMR评分管线构建 4,S-MMR 模型的预后评估 5, 还开发了S-MMR 评分网络工具 6&#xff0c…

Windows 使用技巧

Windows 使用技巧 ①局域网内共享文件 ②CTRL Y 和 CTRL Z ①局域网内共享文件 第一步: 选择要共享的文件(分享方操作) 第二步: 右键打开属性,选择共享(分享方操作) 第三步: …

简单得阴影引导实现

效果如下: 实现方式: 1、引入三方库: implementation io.github.razerdp:BasePopup:3.2.0 2、代码实现 class NewUserGuide3Popup : BasePopupWindow {constructor(activity: Activity) : super(activity)constructor(context: Context) : super(con…

js检验一个字符串是否是正确时间格式的工具方法

js检验一个字符串是否是正确时间格式的工具方法 (()> {/*** 检验字符串是否为时间格式* param {String} date 需要检验的时间格式* returns true 为时间格式,false 为非时间格式*/const isTimaFormat (date) > {if(!date) return false;try{const tempTime …

基于maxkey接入jeecgboot并实现账户同步

1. 注册应用 1.1 在统一认证中心注册第三方应用 1.1.1 填写应用名和登录地址 1.1.2 填写认证地址授权方式和作用域 1.1.3 选择权限范围并提交 1.2 配置访问权限 1.2.1 指定用户组 1.1.2 选择注册的应用 1.1.3 在单点登录认证页面查看添加的应用 1.3 同步一个第三方应用的账号…

VolWeb:集中式增强型数字取证内存分析平台

关于VolWeb VolWeb是一款最新开发的集中式增强型数字取证内存分析平台,该平台基于Volatility 3框架实现其功能,该工具旨在辅助广大研究人员执行安全分析和事件应急响应等任务。 VolWeb可以提供集中式、可视化的增强型网络应用程序,并提高安全…

车机壁纸生成解决方案,定制化服务,满足个性化需求

在数字化与智能化浪潮的推动下,汽车内部设计已不再仅仅满足于基本功能的需求,更追求为用户带来前所未有的视觉享受与沉浸式体验。美摄科技,凭借其在图像生成与处理领域的深厚积累,推出了一款创新的车机壁纸生成解决方案&#xff0…

代码随想录——左叶子之和(Leetcode404)

题目链接 BFS 队列 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

磁珠笔记汇总

磁珠笔记汇总 磁珠是和电感很相似的器件。 电感磁珠单位亨(H)欧姆(Ω)是否储能存储能量消耗高频能量应用场景通常用于开关电源吸收高频,EMC保护如何看待损耗使用电感时希望损耗越小越好使用磁珠时是利用其损耗来消耗不需要的高频分量 一、磁珠的工作原理 磁珠与…

【Linux】解决误操作libc.so.6导致的问题,补充:升级glibc注意事项

千万不要轻易动/usr/lib64/libc.so.6。 glibc是Linux系统中最底层的api,Linux几乎所有运行库都依赖glibc。/usr/lib64/libc.so.6属于glibc,在centos7中是个软链接。 一旦误删或误操作libc.so.6,或者glibc新版本不兼容等原因,都可…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接(@arkui-x.bridge)】

平台桥接(arkui-x.bridge) 简介 平台桥接用于客户端(ArkUI)和平台(Android或iOS)之间传递消息,即用于ArkUI与平台双向数据传递、ArkUI侧调用平台的方法、平台调用ArkUI侧的方法。 以Android平台为例,Ark…

揭开 SOCKS5 有哪些强大的功能?

在在线隐私和安全领域,SOCKS5 是一种多功能且功能强大的协议,为用户提供了一种无缝的方式来加密他们的互联网流量、绕过防火墙并以增强的匿名性和灵活性访问网络。无论您是担心在线监控、地理封锁还是数据隐私,了解如何利用 SOCKS5 的功能都可…

OpenHarmony 实战开发PhotoView——支持图片缩放、平移、旋转的一个优雅的三方组件

简介 PhotoView是OpenAtom OpenHarmony(简称“OpenHarmony”)系统的一款图片缩放及浏览的三方组件,用于声明式应用开发,支持图片缩放、平移、旋转等功能。 使用场景 PhotoView为广大OpenHarmony应用开发者在处理图片时&#xf…

材料物理 笔记-9

原内容请参考哈尔滨工业大学何飞教授:https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》(哈尔滨工业大学出版社) ——…