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服务器之间的通信。

在这里插入图片描述

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

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

相关文章

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后,大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战,欢迎您在OceanBase社区问答论坛中交流、讨论。此次,《DBA从入门到…

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接…

以太坊现货ETF获批:引发ETH价格暴涨,市场热议达到高潮

2024年5月24日,北京时间,以太坊现货ETF正式获得美国证券交易委员会(SEC)的批准,成为继比特币之后,美国主权政府承认的又一加密货币基金产品。这一意外的利好消息引发了加密货币市场的狂欢,以太坊…

阳光电源临摹品引发的EMC正向设计思考

画画可以临摹。画电路板临摹的人更多。 抄板,抄的是过去的板子,容易出问题。现在市场竞争激烈,欧美客户对出口产品的标准要求推陈出新,防不胜防。由于市场的竞争,欧洲客户已经意识到EMC电磁兼容的重要性,不…

【PID算法详解】

PID算法 PID算法介绍用途pid数学表达式及其含义P算法D算法I算法 PID总结数学公式转换代码设计实际运用PID代码实现 PID算法介绍 PID控制器是一种广泛应用于工业控制系统的反馈控制器,它通过比例(Proportional)、积分(Integral&am…

LeetCode450删除二叉搜索树中的节点

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤&#xff1…

合约的值类型

基本数据类型:整数、枚举、布尔(类似java的数据类型)Address、Contract(这两种是solidity特有的数据类型)Fixed byte array(定长字节数组) Integer(int/uint) int/uint 以8位字节递增&#xf…

代码随想录算法训练营Day2|977.有序数组的平方、59.螺旋矩阵||、 209.长度最小的子数组

977.有序数组的平方 这道题给出的原数组有两个特点: 1、由小到大 2、有负数有正数 因此,这个数组平方后的数应该是从两头向中间的0减小的,但是两头的大小需要我们用两个指针便历之后去判断大小。在遍历的同时left指针向右走,righ…

Spring使用的设计模式

Spring 框架是一个广泛使用的 Java 框架,它内部使用了多种设计模式来简化开发过程、提高代码的可维护性和扩展性。 以下是一些在 Spring 框架中常见的设计模式,以及用代码示例来解释它们: 一、工厂模式(Factory Pattern&#xff…

DIYGW UniApp可视化开发工具:前端开发人员的新宠

在前端开发的领域中,API接口的测试与调试一直是开发人员面临的挑战之一。传统的测试工具虽然能够完成基本的测试任务,但在效率、易用性和直观性方面仍有提升的空间。随着技术的发展,DIYGW UniApp可视化工具应运而生,为开发人员提供…

智慧园区:打造未来城市的新模式

随着城市化进程的加速和科技创新的推动,城市面临着诸多挑战和机遇。如何提升城市的竞争力和可持续性,是一个亟待解决的问题。在这个背景下,智慧园区作为一种新型的城市发展模式,引起了越来越多的关注和探索。 什么是智慧园区&…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面,登陆管理员账号 (测试服务器安装的gitlab,浏览器输入ip或配置的gitlab地址) 创建新项目 使用gitlab创建项目 创建一个新项目(忽略分组) (忽略分组) 在创建工…

CSS文本粒子动画特效之爱心粒子文字特效-Canvas

1. 效果图 2.完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;paddin…

一篇文章带你快速搞定Kafka术语no.2

在Kafka的世界中有很多概念和术语是需要你提前理解并熟练掌握的&#xff0c;这对于后面你深入学习Kafka各种功能和特性将大有裨益。下面我来盘点一下Kafka的各种术语。 在专栏的第一期我说过Kafka属于分布式的消息引擎系统&#xff0c;它的主要功能是提供一套完备的消息发布与…

全球排名第一的免费开源ERP:Odoo与微信集成的应用场景解析

概述 本文介绍了世界排名第一的开源免费企业应用软件Odoo ERP和企业微信、个人微信的各种对接功能。包括微信登录的对接、微信公众号的对接、微信消息的对接、微信支付的对接、微信打卡的对接、微信小程序的对接。 微信登录的对接 Odoo的登录&#xff0c;除了标准的用户名/密码…

律所电子签章有效吗,怎么操作?

电子签章在很多国家和地区是合法有效的&#xff0c;但其有效性、使用条件和操作流程可能依据具体的法律法规而有所不同。在中国&#xff0c;随着《中华人民共和国电子签名法》的实施&#xff0c;电子签章在满足一定条件下是具有法律效力的。电子签章可以提高合同签订的效率&…

QT 自定义协议TCP传输文件

后面附带实例的下载地址 一、将文件看做是由:文件头+文件内容组成,其中文件头包含文件的一些信息:文件名称、文件大小等。 二、文件头单独发送,文件内容切块发送。 三、每次发送信息格式:发送内容大小、发送内容类型(文件头或是文件块内容)、文件块内容。 四、效果展…

【香橙派 AIpro】OrangePi AIpro :教育、机器人、无人机领域的超级AI大脑,华为昇腾处理器驱动的AI开发板新标杆

【OrangePi AIpro&#xff1a;教育、机器人、无人机领域的超级AI大脑&#xff0c;华为昇腾处理器驱动的AI开发板新标杆】 文章目录 一、开箱与初印象1. 初印象2. 上手开机3. 安装和运行 TightVNC 远程桌面3.1. 安装 TightVNC 服务器3.2. 启动 VNC 服务器3.3. 在 Windows 上使用…

clickhouse 特性——clickhouse 基础篇(一)

文章目录 列式存储向量化查询执行引擎数据压缩使用磁盘支持SQL实时数据更新 列式存储 列式存储的目的有两个&#xff0c;一是缩小数据扫描范围&#xff0c;二是减少数据传输大小&#xff0c; 因此列存储和数据压缩通常是伴生的&#xff0c;列存储是数据压缩的前提。列存储的好…

MySQL测试数据

012熟悉测试数据 查看表结构&#xff1a;desc或describe&#xff0c;语法格式&#xff1a;desc或describe 表名 desc dept;查询部门的所有信息 &#xff1a; select * from dept;013查一个字段 语法格式&#xff1a;select 字段名 from 表名;&#xff08;大小写都可以&…