首页 > 数据库 >Docker 快速搭建 MongoDB 4.x 集群(一主一从)

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

时间:2024-05-28 16:58:29浏览次数:27  
标签:容器 mongo -- MongoDB 一主一 home Docker keyfile

目录

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

在这里插入图片描述

标签:容器,mongo,--,MongoDB,一主一,home,Docker,keyfile
From: https://blog.csdn.net/peng2hui1314/article/details/139206015

相关文章

  • Docker_Docker命令2
    一、进程相关命令 #启动docker服务systemctlstartdocker#停止docker服务systemctlstopdocker#重启docker服务systemctlrestartdocker#查看docker服务状态systemctlstatusdocker#开机启动docker服务systemctlenabledocker二、镜像相关命令 #查看......
  • Docker安装(Linux)
    简单方法:docker.io        Debian团队维护和打包aptinstalldocker.ioaptinstalldocker-compose但是版本会较低复杂方法:docker.ce    Docker官方团队维护和打包安装一些必要的系统工具sudoaptupdatesudoapt-yinstallapt-transport-https......
  • 小米万兆路由器(AX10000)SimpleDocker部署alist+aria2,实现离线下载
     从镜像管理中拉取p3terx/aria2-pro和xhofe/alist: 输入镜像名称后点击OK,出现成功提示后关闭拉取窗口: 等镜像拉取完毕后,创建alist容器: 选择简单模式:alist容器参数:端口映射:5244:5244环境变量:PUID=0;PGID=0;UMASK_SET=022; 复制alist的宿主目录: 创建aria......
  • Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用
    场景Windows10中Docker的安装与遇到的那些坑:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/119209218上面讲DockerDesktop在windows10非家庭版上的安装,如果是家庭版,则需要执行如下步骤。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、虚拟化检......
  • Docker_Docker介绍1
    一、docker概述1、我们写的代码会接触到好几个环境:开发环境、测试环境以及生产环境: 2、概念Docker是一个开源的应用容器引擎诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为DockerInc)Docker可以让开发者打包他们的应用以及依赖包到一个轻......
  • 从零开始写 Docker(十六)---容器网络实现(上):为容器插上”网线”
    本文为从零开始写Docker系列第十六篇,利用linux下的Veth、Bridge、iptables等等相关技术,构建容器网络模型,为容器插上”网线“。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心......
  • docker安装
    1.配置阿里源vim/etc/yum.repo/aliyun.repo[ali_baseos]name=ali_baseosbaseurl=https://mirrors.aliyun.com/centos-stream/9-stream/BaseOS/x86_64/os/gpgcheck=0[ali_appstream]name=ali_appstreambaseurl=https://mirrors.aliyun.com/centos-stream/9-stream/AppStr......
  • docker部署tomcat
    需求:在Docker容器中部署Tomcat,并通过外部机器访问Tomcat部署的项目。点击查看代码#下载[root@localhost~]#dockerpulltomcat#启动运行[root@localhost~]#dockerrun-d-p3355:8080--nametomcat01tomcat[root@localhost~]#dockerexec-ittomcat01/bin/bash......
  • docker containerd runc containerd-shim等组件的关系
    早期kubelet创建容器工作原理因为docker出生的比k8s早,所以k8s早期的容器运行时都是基于docker的,kubelet通过docker的api创建容器。后来,k8s官方不想绑死在docker这架马车上,就把容器运行时抽象出来,定义了一个接口,叫CRI(containerruntimeinterface),容器......
  • docker安装操作
    原文——知乎:如何在Ubuntu20.04上安装和使用Dockerhttps://zhuanlan.zhihu.com/p/143156163原文——腾讯云技术博客:如何在Ubuntu上安装Docker?https://cloud.tencent.com/developer/article/2322853?areaId=106005安装环境:LinuxUbuntu20.04系统启用Docker软件源,导入G......