使用Docker搭建MongoDB 5.0版本副本集集群
1、mongodb集群
首先我们需要了解mongodb的集群模式,mongodb安装分为单机安装和集群安装。集群安装分为:主从复制(Master-Slaver)集群、副本集(Replica Set)集群和分片集群(Sharded Cluster)。MongoDB的主从复制(Master-Slave Replication)已不再是官方推荐的特性,并且在未来的版本中可能会被移除。MongoDB官方推荐使用副本集(Replica Set)作为高可用性的解决方案。
1.1主从复制存在的问题
- 单点故障:Master节点故障时,没有自动故障转移机制。
- 数据量有限:Slave节点数据通常不可写,限制了数据总量的增长。
- 延迟和同步问题:Slave节点可能会落后于Master,导致数据延迟。
- 资源利用率低:需要额外资源来运行Slave节点。
1.2 副本集的优点
- 自动故障转移。
- 读写分离,能提供更好的读扩展能力。
- 副本集成员可配置为arbiter(仲裁),提供投票决定谁是主节点。
1.3 分片集群
- 用于跨多个服务器分布数据的方法,用于支持非常大的数据集和高吞吐量的操作
2、副本集节点选择
一个副本集最多有50个节点并且最多支持7个投票节点,其余节点必须是没有投票权的节点。副本集通过设置priority决定优先级,默认优先级为1,priority值是0到100之间的数字,数字越大优先级越高,priority=0,则此节点永远不能成为主节点primay。
副本集的最小推荐配置是三个节点:
- 一个主节点和两个从节点
- 一个主节点、一个从节点和仲裁节点
如果可能,尽可能在副本集中使用奇数个数据成员,而不要使用仲裁者。所以推荐使用的最低配置为:一个主节点和两个从节点。副本集在部署时如果当节点数目为偶数个时,需要部署一个仲裁节点,否则偶数个节点,当主节点挂了后,其他节点会变为只读。不会去选举其他主节点。
关于仲裁者说明:
仲裁者可随意部署在网络通的任何地方,不会占用什么系统资源,它只提供投票选举的功能,不存储数据。
3、拉取mongodb镜像
docker pull mongo:5.0
4、创建mongodb文件夹
首先在宿主机里面创建mongodb的存储数据文件夹
mkdir mongo01 && cd mongo01
进入mongo01创建conf、data、logs、tmp文件夹
mkdir conf data logs tmp
进入conf文件夹编写mongod.conf文件
# 数据库文件存储位置
dbpath = /data/db
# log文件存储位置
logpath = /data/log/mongod.log
# 使用追加的方式写日志
logappend = true
# 是否以守护进程方式运行
# fork = true
# 全部ip可以访问
bind_ip = 0.0.0.0
# 端口号
port = 27017
# 是否启用认证
auth = true
# 设置oplog的大小(MB)
oplogSize=2048
#指定秘钥文件
keyFile = /data/key/mongo.key
#指定副本集名称
replSet = rs
MongoDB 的 mongod.conf
文件从版本 3.2 开始支持 YAML 格式。可以使用更加简洁和结构化的语法来配置 MongoDB
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: /data/db
journal:
enabled: true
# engine:
wiredTiger:
engineConfig:
cacheSizeGB: 1
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /tmp/mongod.log
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
bindIp: 0.0.0.0
# how the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
#开启认证
security:
keyFile: /data/key/mongo.key
authorization: enabled
#operationProfiling:
#replication: 配副本集名
replication:
replSetName: rs
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
后面使用YAML格式进行配置说明。由于搭建副本集服务器,开启认证的同时,必须指定keyFile参数,节点之间的通讯基于该keyFile进行的。否则会启动失败。我们通过 docker logs 容器ID
查看docker日志可以发现启动的时候会报错:
BadValue: security.keyFile is required when authorization is enabled with replica sets
所以开始之前我们先把开启认证给注释掉,集群搭建成功后在开启认证。配置如下:
#开启认证
#security:
# keyFile: /data/key/mongo.key
# authorization: enabled
然后把配置好的mongo01文件夹拷贝两份
cp -r mongo01 mongo02
cp -r mongo01 mongo03
5、启动mongodb容器实例
Linux路径:
docker run -d --name mongo01 -p 27017:27017 --privileged=true -v ~/config/mongodb/mongo01/data:/data/db -v ~/config/mongodb/mongo01/conf:/data/configdb -v ~/config/mongodb/mongo01/logs:/data/log/ -v ~/config/mongodb/mongo01/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo02 -p 27018:27017 --privileged=true -v ~/config/mongodb/mongo02/data:/data/db -v ~/config/mongodb/mongo02/conf:/data/configdb -v ~/config/mongodb/mongo02/logs:/data/log/ -v ~/config/mongodb/mongo02/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
docker run -d --name mongo03 -p 27019:27017 --privileged=true -v ~/config/mongodb/mongo03/data:/data/db -v ~/config/mongodb/mongo03/conf:/data/configdb -v ~/config/mongodb/mongo03/logs:/data/log/ -v ~/config/mongodb/mongo03/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
如果为Windows系统把容器卷路径改为磁盘地址即可:
docker run -d --name mongo01 -p 27017:27017 --privileged=true -v D:/mongo/mongo01/data:/data/db -v D:/mongo/mongo01/conf:/data/configdb -v D:/mongo/mongo01/logs:/data/log/ -v D:/mongo/mongo01/tmp:/tmp mongo:5.0 -f /data/configdb/mongod.conf
启动成功后通过 docker ps
查看容器是否运行成功。
6、配置集群
随便进入一个容器节点进行集群配置。
docker exec -it mongo01 bash
进入容器后,登录mongodb命令行
mongo
执行配置副本集命令配置集群:
rs.initiate({_id: "rs",members: [{ _id: 0, host: "192.168.1.9:27017" },{ _id: 1, host: "192.168.1.9:27018" },{ _id: 2, host: "192.168.1.9:27019" }]})
_id: "rs" 副本集名要和配置文件中的一致。如果配置仲裁节点需要在改节点里面加上 arbiterOnly: true属性 如:
{ _id: 2, host: "192.168.1.9:27019", arbiterOnly: true}
也可以指定其 priority
( 优先级)。如果不指定,默认优先级为1。如指定第一个节点优先级为90:
{"_id":0,"host":"192.168.1.9:27017",priority:90}
执行上面rs.initiate(config)命令后,集群就搭建成功了。系统会选择一个节点当主节点。
配置成功后,目前不需要账号密码就能够登录。下面我们需要开启安全认证以保证数据库的安全。
7、集群后开启安全认证
7.1 创建root权限用户
由于我们的副本集已经搭建成功了。我们可以看到有一个PRIMAY节点和两个SECONDARY节点,进入主节点容器创建用户信息。
切到admin库
use admin
创建用户,用户名root,密码1234qwer,权限root,所属库admin
db.createUser({user:"root",pwd:"1234qwer",roles:[{role:'root',db:'admin'}]})
执行上面命令后用户就创建成功了,我们先退出容器。
7.2 创建密钥文件
使用openssl生成key文件,由于上面已经提到了想要在副本集中开启认证,必须指定keyFile参数,所有节点使用相同的key。所以我们需要使用openssl生成一个mongo.key文件,并把文件拷贝到容器内部。
首先确保Linux系统安装了openssl,查看是否安装命令:
openssl version
如果没有输出软件包信息,执行下面命令安装openssl
yum install openssl
安装成功后执行命令生成mongo.key文件。
openssl rand -base64 753 > mongo.key
执行成功后,会生成一个mongo.key文件。我们使用docker cp命令把文件拷贝到容器中。
docker cp ./mongo.key mongo01:/data/key/mongo.key
拷贝成功后,进入容器内部给文件授权。
docker exec -it mongo01 bash
进入/data/key命令给文件授权。
chown 999 mongo.key #设置文件归属权
chmod 400 mongo.key #设置文件为只读
上面的授权命令必须要执行,不然容器会启动失败。一定要注意!!!
7.3 开启认证
上面的步骤操作成功后,接下来我们就可以把配置文件中注释掉的开启认证参数给打开了。
#开启认证
security:
keyFile: /data/key/mongo.key
authorization: enabled
keyFile指定的路径为拷贝到docker容器内部文件存放的路径。
7.4 重启容器
把mongo.key文件也按照相同的方式拷贝到另外两个节点容器内。以上操作都成功后,就可以重新启动容器了。首先退出容器关闭所有容器副本集节点
docker stop mongo01
docker stop mongo02
docker stop mongo03
在启动容器
docker start mongo01 mongo02 mongo03
查看容器是否启动成功
docker ps
8、副本集相关命令
初始化副本集
rs.initiate(config)
查看状态
rs.status()
查看配置信息
rs.conf()
查看是否为主节点
rs.isMaster()
添加从节点
rs.add("192.168.1.9:27020" )
添加仲裁节点
rs.addArb("ip:27017")
删除节点
rs.remove("192.168.1.9:27020")
降级节点,主节点降级为从节点,并重新选举新的主节点
rs.stepDown(stepDownSecs, secondaryCatchUpPeriodSecs)
查看备份节点的复制信息
db.printSlaveReplicationInfo()
开启从节点为只读权限
rs.secondaryOk()
如果是4.0以下的版本,则是
rs.slaveOk()
每次宕机重连之后都需要执行方法,不然在从节点数据库中无法读取数据。
测试服务宕机
use admin;
db.shutdownServer();
9、可视化工具连接
我们可以使用mongodb可视化工具连接副本集,这里使用Studio 3T进行连接。
选择新建连接:
配置连接信息
指定连接类型、节点地址、副本集名称。输入账号密码:
点击连接
使用Docker搭建MongoDB 5.0版本副本集集群的更多相关文章
- Docker搭建MongoDB
1. Docker搭建Mongodb 1.1 获取docker镜像 docker pull mongo 1.2 创建mongodb容器 docker run --name my-mongo -p 27 ...
- ubuntu docker 搭建 mongodb,开启授权访问 redis,mysql mssql 备份还原
命令安装docker 如果您想从Ubuntu存储库安装docker版本,则可以运行下面的apt命令. sudo apt install docker.io等到安装完成后,您可以启动Docker并使用s ...
- mongodb 3.0 版本分片部署步骤
# linux 网络优化 1. 文件中/etc/sysctl.conf, 加入 net.core.somaxconn = 2048 fs.file-max = 2000000 fs.nr_open = ...
- dubbo-admin监控搭建2.6.0版本
首先介绍一下dubbo的一个比较大的改变,那就是在2.6.1及2.6.1以后的版本当中,dubbo将一分为二,分为Dubbo-RPC和Dubbo-Admin,而在2.6.1以前的版本中Dubbo-Ad ...
- Docker搭建mysql:5.7版本数据库
搭建MySQL: 1.启动测试mysql,拷贝容器内配置文件到宿主机 mkdr -P /server/docker/mysql/{data,conf} docker run -e MYSQL_ROOT ...
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
1. 安装 MongoDB 三台机器 关闭防火墙 systemctl stop firewalld.service 192.168.252.121 192.168.252.122 192.168.25 ...
- 二进制搭建Kubernetes集群(最新v1.16.0版本)
目录 1.生产环境k8s平台架构 2.官方提供三种部署方式 3.服务器规划 4.系统初始化 5.Etcd集群部署 5.1.安装cfssl工具 5.2.生成etcd证书 5.2.1 创建用来生成 CA ...
- MongoDB 4.0 事务实现解析
MongoDB 4.0 引入的事务功能,支持多文档ACID特性,例如使用 mongo shell 进行事务操作 > s = db.getMongo().startSession() sessio ...
- MongoDB 3.0 新特性【转】
本文来自:http://www.open-open.com/lib/view/open1427078982824.html#_label3 更多信息见官网: http://docs.mongodb.o ...
- MongoDB 3.0新增特性一览
转自:http://blog.sina.com.cn/s/blog_48c95a190102vedr.html 引言 在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoD ...
随机推荐
- Windows逆向之配置虚拟机环境
安装虚拟机环境 首先下载吾爱破解论坛专用版虚拟机软件VMWare Workstation 12,注册成功:再通过虚拟机启动论坛提供的WinXP系统镜像,在我的win11上完美运行. 实现文件互传 为了 ...
- 基于ads1299生物电信号采集研发总结之参考信号的接法
一 概念 ads1299的电极端有两种采集方式,单端和差分.两种的使用方式又有很大的区别,怎么高质量的采集信号,这个是一个比较难的问题. 二 解析 参考信号SRB1的接法,决定了采集到数据的精确度和信 ...
- 三种方式使用纯 CSS 实现星级评分
本文介绍三种使用纯 CSS 实现星级评分的方式.每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns="http://www.w3.org ...
- 2023年VR虚拟现实的10个应用行业
1.医疗保健 现代医疗保健的培训方式离不开VR虚拟现实..由于医疗行业的特殊性,不允许拿大量的病人来练手,但医疗又非常注重实践,一些新手医生就缺乏锻炼的机会,而VR虚拟现实技术很好的解决了这一问题.医 ...
- CloudXR如何推动XR的未来发展
CloudXR的发展 XR(Extended Reality)是指借助计算机图形技术和可穿戴设备所生成的一个真实与虚拟组合的.可人机交互的环境.XR中的"X"只是一个变量,可以代表 ...
- KingbaseES V8R6 中unlogged表
前言 KingbaseESV8R6有一种表称为unlogged,在该表新建的索引也属于unlogged.和普通表的区别是,对该表进行DML操作时候不将该表的变更记录变更写入到wal文件中.在数据库异常 ...
- apue 文章集锦
与 apue 相关的一系列文章比较庞杂,按原书目录整理了一下,形成目录,方便系统性阅读. 另外这些文章是在我快读完的时候开始写的,之前的一些章节还多有遗漏,后面慢慢补上. chapter 1: UNI ...
- 谈谈 OI 中的查重
鉴于最近洛谷的公开赛出现的重题引起的纠纷,我打算整理一下此类问题的危害和做法. 也许有时候无意的重题不会被处罚,但我想也应该尽量避免来换取选手的更好体验. Part 0 什么是重题 原题大致可分为完全 ...
- C++设计模式 - 建造者模式(Builder)
对象创建模式 通过"对象创建" 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定.它是接口抽象之后的第一步工作. 典型模式 Fac ...
- 网络设备性能指标之pps
基本概念: Bps:Byte per second 每秒传输多少字节 bps: bits per second 每秒传输多少位 ,这个也叫做端口速率 pps:Packet Per Second(包每秒 ...