docker部署MongoDB单机多节点集群

原文

目录

概述-MongoDB Replication(副本集,可参考官方英文)

冗余&&数据可用性

MongoDB副本集

单机多节点docker部署流程

参考文献#t4)


概述-MongoDB Replication(副本集,可参考官方英文)

跨主机多节点的集群docker部署可移步至该参考文献

​ MongoDB中的副本集可以理解为同一组维护相同数据集的mongod进程。副本集作为所有生产部署的基础,它提供了冗余性、高可用性。下面主要介绍MongoDB中的副本以及副本集的组件及其架构。

  • 冗余&&数据可用性

    副本集相当于在多个数据库服务端(或者说多个节点)进行了数据备份,这种方式有效提高了单节点数据库服务段的容错能力。也就是说当某个节点发生异常后,仍然可以从其他节点获取数据。副本集允许客户端从不同的服务端读取数据,因此该部署方式提供了更强大的数据读取的能力。在不同节点上维护副本集可以提高数据局部性以及数据可用性。

  • MongoDB副本集

​ 一个副本集由多个mongod实例组成,这些mongod实例维护着相同的数据集。副本集的组成包括多个数据负载节点1个可选的仲裁节点。其中,多个数据负载节点中=1个主节点+多个从节点

主从节点及其关系:如图1所示,主节点能够接受所有的读写操作;对于某个副本集来讲,通常只允许1个主节点存在。如图2所示,从节点相当于继承了主节点的操作,复制了主节点的数据集以保证各个节点的数据统一。

img img

图1 图2

​ 如图3所示,当存在主、从节点时,可以添加仲裁节点。其作用面对异常情况(比如说主节点出现连接超时的情况时候,其他从节点就会被选举为主节点,这种情况可以粗浅对应下图4所示的状态)通过选举机制推选主节点。仲裁节点不存储数据集,并且其本身不会参与选举,也就是说不管总、从节点如何变化,仲裁节点都不会变化。

imgimg

图3 图4

​ 此外,客户端进行数据查询等操作时默认是请求主节点的,不过MongoDB副本集允许客户端优先从指定的从节点进行数据库的读取操作。

img

单机多节点docker部署流程

  • 镜像拉取:
sudo docker pull mongo

img

  • 创建MongoDB容器(主节点、从节点、仲裁节点)

配置MongoDB容器挂载文件

# 创建本地文件夹作为各docker容器的挂载目录
sudo mkdir -p /data/application/mongo1/db
sudo mkdir -p /data/application/mongo2/db
sudo mkdir -p /data/application/mongo3/db
sudo mkdir -p /data/application/mongo1/configdb
sudo mkdir -p /data/application/mongo2/configdb
sudo mkdir -p /data/application/mongo3/configdb
 
# 在对应文件夹内创建配置文件
sudo vim /data/application/mongo1/configdb/mongod.conf
sudo cp /data/application/mongo1/configdb/mongod.conf /data/application/mongo2/configdb/
sudo cp /data/application/mongo1/configdb/mongod.conf /data/application/mongo3/configdb/
# 粘贴下面的配置文件后保存
# net:
#   port: 27017
#   bindIp: 0.0.0.0
# systemLog:
#   logAppend: true
# security: 
#   keyFile: "/data/configdb/mongodbKeyfile.key"    # 注意该路径为稍后创建容器内的路径,非本地宿主机
#   clusterAuthMode: "keyFile"
#   #authorization: "enabled"                       
# replication: 
#   replSetName: "mongoRs" 
 
# 生成Key文件,这里需要切换至root
openssl rand -base64 756 > /data/application/mongo1/configdb/mongodbKeyfile.key
 
# 复制Key文件至各节点配置
sudo cp /data/application/mongo1/configdb/mongodbKeyfile.key /data/application/mongo2/configdb
sudo cp /data/application/mongo1/configdb/mongodbKeyfile.key /data/application/mongo3/configdb
 
# Key文件可读权限
sudo chmod 400 /data/application/mongo1/configdb/mongodbKeyfile.key
sudo chmod 400 /data/application/mongo2/configdb/mongodbKeyfile.key
sudo chmod 400 /data/application/mongo3/configdb/mongodbKeyfile.key

启动容器(3个节点):

# 实例化docker容器
sudo docker run -di --name=mongo_server1 -p 37017:27017 -v /data/application/mongo1/configdb:/data/configdb/ -v /data/application/mongo1/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
sudo docker run -di --name=mongo_server2 -p 47017:27017 -v /data/application/mongo2/configdb:/data/configdb/ -v /data/application/mongo2/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf
sudo docker run -di --name=mongo_server3 -p 57017:27017 -v /data/application/mongo3/configdb:/data/configdb/ -v /data/application/mongo3/db:/data/db/ mongo --replSet "mongoRs" --bind_ip_all -f /data/configdb/mongod.conf

查看当前容器运行状态:

img

  • 配置主、从、仲裁节点

分别配置容器1、配置容器2、配置容器3为主节点、从节点、仲裁节点

# 进入容器
sudo docker exec -it mongo_server1 mongosh admin
# 配置节点
rs.initiate({_id:"mongoRs", members:[{_id:0, host:"你的IP:37017"}, {_id:1, host:"你的IP:47017"}, {_id:2, host:"你的IP:57017", arbiterOnly:true}]})

img

创建用户用mongodb-compass连接验证下数据集的同步

img

Ubuntu如何安装mongodb-compass的方法可以参考下面:

wget https://downloads.mongodb.com/compass/mongodb-compass_1.32.3_amd64.deb
sudo dpkg -i mongodb-compass_1.32.3_amd64.deb
mongodb-compass  # 执行compass

从下图可以看出,在主节点创建记录,从节点同步产生记录!

img

上述已完成!!!

参考文献


MongoDB 设置账号密码

1、安装

安装可以看我这篇文章:https://blog.csdn.net/u014641168/article/details/123937775

2、说明

由于默认安装的MongoDB是没有设置用户密码的,极其危险,所以需要设置一下用户密码

3、创建用户

Navicat15连接MongoDB,正常连接没有问题。

在这里插入图片描述
执行命令

use admin

使用admin数据库
输入创建用户命令,返回1说明成功

db.createUser({user:"admin",pwd:"123456",roles:["root"]})

这就创建了一个用户名为database_admin,密码为123456的管理员账户。实际上这个用户名可以随便取,例如root、LiHua都行,因为这个用户是属于admin数据库的超级用户。

注:超级用户一定是属于admin数据库的

在这里插入图片描述

#默认好像是当前数据库的权限,但是可以通过这个来指定数据库(没试过)
db.createUser({user:"admin",pwd:"123456",roles:[role:"root",db:"admin"]})

4、查看用户

use admin;
db.system.users.find()

在这里插入图片描述

5、关闭免密登录

找到E:\MongoDB\Server\5.0\bin下的 mongod.cfg 文件,在 #security: 下添加下面代码

security:
 authorization: enabled

完整配置

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: E:\MongoDB\Server\5.0\data
  journal:
    enabled: true
#  engine:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  E:\MongoDB\Server\5.0\log\mongod.log

# network interfaces
net:
  port: 27017
  
  #配置可以远程登录
  bindIp: 127.0.0.1,0.0.0.0


#processManagement:

#security:
security:
 authorization: enabled


#operationProfiling:

#replication:

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

5、连接测试

无密码登录,双击Navicat中的连接,出现需要认证,没问题。
在这里插入图片描述

使用Navicat15连接,认证方式选为password,数据库是admin,用户名admin,密码123456

在这里插入图片描述
在这里插入图片描述


连接mongodb时show dbs 提示“command listDatabases requires authentication“验证

今天想重新创建一个带有密码的数据库,之前用的时候创建过,所以这次直接进powershell操作时,发现需要验证: command listDatabases requires authentication

那么验证就可以啦,不过要有之前创建时候的用户名和密码,我当时admin啥都是root, 所以直接切换到admin验证就行了

use admin
db.auth(“root”, “root”)
1
返回1就验证成功了

有关参考:https://www.jianshu.com/p/79caa1cc49a5

首次给数据库添加用户名和密码可以参考这个,这个时黑马教程教的步骤,我之前也是按这个步骤来的
https://blog.csdn.net/weixin_44679078/article/details/105543895

现在我直接给需要数据库加用户名密码就行了,不需要再创建admin那些了。


MongoDB 查看当前节点状态

连接成功后,我们可以使用rs.status()命令来查看当前节点的状态信息。以下是相关代码:

rs.status()

运行上述代码后,将返回一个包含节点状态信息的JSON对象。可以通过打印对象的属性来查看节点的状态和详细信息。

代码解释

  • rs.status():是MongoDB的一个内置命令,用于查看副本集状态。执行该命令后,MongoDB会返回一个包含节点状态信息的JSON对象。该对象包含了节点的详细信息,如节点角色、健康状况、心跳延迟等。
  • JSON对象:是一种轻量级的数据交换格式,用于存储和传输数据。我们可以通过打印JSON对象的属性来查看节点状态和详细信息。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值