MongoDB集群搭建(三节点副本集)

软件包安装

0、主机规划

IP地址访问端口
10.0.0.20127017
10.0.0.20227018
10.0.0.20327019

1、MongoDB安装包下载

下载地址:https://www.mongodb.com/try/download/community

版本根据需求选择,Mongodb6.0及以上的版本没有mongo命令

在这里插入图片描述

2、上传至服务器,并添加环境变量

  1. 将下载的安装包mongodb-linux-x86_64-rhel70-6.0.5.tgz分别上传到三台服务器/root目录下

在这里插入图片描述

  1. 解压安装包到指定目录,在三台服务器分别执行该命令
tar xvf mongodb-linux-x86_64-rhel70-6.0.5.tgz -C /usr/local

在这里插入图片描述

  1. 修改文件夹名称,在三台服务器分别执行该命令
mv /usr/local/mongodb-linux-x86_64-rhel70-6.0.5 /usr/local/mongodb-6.0.5

在这里插入图片描述

  1. 添加环境变量,在三台服务器分别执行该命令
echo "export PATH=$PATH:/usr/local/mongodb-6.0.5/bin" >> /etc/profile
  1. 使环境变量生效,在三台服务器分别执行该命令
source /etc/profile

3、安装MongoDB依赖包

在三台服务器分别执行该命令

yum install -y libcurl openssl xz-libs

在这里插入图片描述

4、创建目录,创建各节点配置文件

  1. 创建目录,根据需求分别在三台服务器上创建目录

节点服务器1

mkdir -p /data/mongodb/node1/{data,log,config}

节点服务器2

mkdir -p /data/mongodb/node2/{data,log,config}

节点服务器3

mkdir -p /data/mongodb/node3/{data,log,config}

在这里插入图片描述

  1. 修改配置文件

节点服务器1

vi /data/mongodb/node1/config/node1.conf
dbpath=/data/mongodb/node1/data  #数据存放目录 
logpath=/data/mongodb/node1/log/mongodb_node1.log #日志存放目录 pidfilepath=/data/mongodb/node1/data/node1.pid #指定文件保存mongod进程的进程ID 
fork=true #后台运行 
logappend=true #以追加的方式记录日志 
bind_ip=10.0.0.201 #绑定本机
ip port=27017 #mongodb端口 
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

在这里插入图片描述

节点服务器2

vi /data/mongodb/node2/config/node2.conf
dbpath=/data/mongodb/node2/data #数据存放目录 
logpath=/data/mongodb/node2/log/mongodb_node2.log #日志存放目录 pidfilepath=/data/mongodb/node2/data/node2.pid #指定文件保存mongod进程的进程ID 
fork=**true** #后台运行 
logappend=**true** #以追加的方式记录日志 
bind_ip=10.0.0.202 #绑定本机
ip port=27018 #mongodb端口 
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

在这里插入图片描述

节点服务器3

vi /data/mongodb/node3/config/node3.conf
dbpath=/data/mongodb/node3/data #数据存放目录
logpath=/data/mongodb/node3/log/mongodb_node3.log #日志存放目录pidfilepath=/data/mongodb/node3/data/node3.pid#指定文件保存mongod进程的进程ID
fork=true #后台运行
logappend=true #以追加的方式记录日志
bind_ip=10.0.0.203 #设置绑定本机ipport=27019 #mongodb端口
replSet=rs0 #副本集名称,同一个副本集,名称必须一致 

在这里插入图片描述

5、启动节点

  1. 启动节点

节点服务器1

mongod -f /data/mongodb/node1/config/node1.conf

节点服务器2

mongod -f /data/mongodb/node2/config/node2.conf

节点服务器3

mongod -f /data/mongodb/node3/config/node3.conf
  1. 查看节点是否启动
ps aux | grep mongo

在这里插入图片描述

6、安装 MongoDB Shell

因为Mongodb6.0及以上的版本没有mongo命令,所有无法使用mongo命令连接数据库

想在命令行连接数据库,需要给三台服务器安装MongoDB shell

  1. 下载安装包
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz

在这里插入图片描述

  1. 解压
tar -xvf /root/mongosh-1.6.0-linux-x64.tgz -C /usr/local/

在这里插入图片描述

  1. 重命名
mv /usr/local/mongosh-1.6.0-linux-x64 /usr/local/mongosh

在这里插入图片描述

  1. 添加环境变量
echo "export PATH=$PATH:/usr/local/mongosh/bin" >> /etc/profile
  1. 使环境变量生效
source /etc/profile

7、连接节点

  1. 连接第一个节点
mongosh 10.0.0.201:27017

在这里插入图片描述

  1. 副本集初始化
rs0:PRIMARY> rs.initiate()
  1. 添加副本节点
rs0:PRIMARY> rs.add("10.0.0.202:27018") rs0:PRIMARY> rs.add("10.0.0.203:27019")
  1. 查看副本节点状态
rs0:PRIMARY> rs.status()

在这里插入图片描述

  1. 查看同步进度oplog信息

返回一个汇总的各 Secondary 同步延迟信息

rs0:PRIMARY> rs.printSecondaryReplicationInfo()

返回oplog 大小、保留时长、 起始时间等信息

rs0:PRIMARY> rs.printReplicationInfo()

8、创建用户

创建超级管理员用户

rs0:PRIMARY> use admin 
rs0:PRIMARY> db.createUser({user:"root",pwd:"root",roles:[{role:"root",db:"admin"}]}) 
rs0:PRIMARY> db.auth("root","root")

创建库管理员

rs0:PRIMARY> use admin 
rs0:PRIMARY> db.createUser({user:"admin",pwd:"admin",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}) rs0:PRIMARY> db.auth("admin","123456")

9、创建KeyFile文件

keyfile是mongodb副本集的实例之间的权限认证,如果keyfile文件内容不同,那么该实例添加到副本集的时候,会出现不可达的状态

将主节点中的keyfile文件拷贝到复制集其他从节点服务器中,路径地址对应mongo.conf配置文件中的kevFile字段地址,并设置kevfile权限为600

注意: 创建keyFile前,需要先停掉复制集中所有主从节点的mongod服务,然后再创建,否则有可能出现服务启动不了的情况。

  1. 停止Mongodb服务

节点服务器2

mongod --shutdown --config /data/mongodb/node2/config/node2.conf

节点服务器3

mongod --shutdown --config /data/mongodb/node3/config/node3.conf

节点服务器1

mongod --shutdown --config /data/mongodb/node1/config/node1.conf
  1. 在主节点创建keyfile文件,拷贝到另外两个节点(注意拷贝后也要改权限)
openssl rand -base64 666 > /usr/local/mongodb-6.0.5/keyfile
  1. 设置kevfile权限为600
chmod 600 /usr/local/mongodb-6.0.5/keyfile

10.更新节点配置文件并重启服务

  1. 主节点添加
vi /data/mongodb/node1/config/node1.conf

添加以下内容:

auth=true oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile

2. 另外两个节点添加

vi /data/mongodb/node2/config/node2.conf  vi /data/mongodb/node3/config/node3.conf

添加以下内容:

oplogSize=100 keyFile=/usr/local/mongodb-6.0.5/keyfile

3. 重启服务

先停两个SECONDARY节点,再停PRIMARY节点

SECONDARY节点1

mongod --shutdown --config /data/mongodb/node3/config/node3.conf

SECONDARY节点2

mongod --shutdown --config /data/mongodb/node3/config/node3.conf

PRIMARY节点

mongod --shutdown --config /data/mongodb/node3/config/node3.conf

先启动PRIMARY节点,再启动两个SECONDARY节点

PRIMARY节点

mongod -f /data/mongodb/node1/config/node1.conf

SECONDARY节点1

mongod -f /data/mongodb/node2/config/node2.conf

SECONDARY节点2

mongod -f /data/mongodb/node3/config/node3.conf

11、设置开机自启服务

添加mongodb服务配置文件

vi /lib/systemd/system/mongodb.service

添加以下字段

[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target[Service]
Type=forking
ExecStart=/usr/local/mongodb-6.0.5/bin/mongod --config /data/mongodb/node2/config/node2.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb-6.0.5/bin/mongod --shutdown --config /data/mongodb/node2/config/node2.conf
PrivateTmp=true[Install]
WantedBy=multi-user.target

重载配置文件

systemctl daemon-reload

设置mongodb.service权限

chmod 754 /lib/systemd/system/mongodb.service

系统mongodb.service操作命令

#启动服务
systemctl start mongodb.service
#关闭服务
systemctl stop mongodb.service
#开机启动
systemctl enable mongodb.service
#重启服务
systemctl restart mongodb.service

12、MongoDB副本集测试

在从节点的mongodb查看是否完成复制

  1. 在主节点的Mongodb上创建test并插入集合aaa
rs0 [direct: primary] test> db.aaa.insert({AccountID:1,UserName:"123",password:"123456"})

在这里插入图片描述

  1. 查看是否创建
rs0 [direct: primary] test> show tables 
rs0 [direct: primary] test> db.aaa.find()

在这里插入图片描述

  1. 查看副节点是否同步
mongosh 10.0.0.202:27018
rs0 [direct: secondary] test> use test 
rs0 [direct: secondary] test> show tables
rs0 [direct: secondary] test> db.aaa.find()

在这里插入图片描述

mongosh 10.0.0.203:27019
rs0 [direct: secondary] test> use test 
rs0 [direct: secondary] test> show tables
rs0 [direct: secondary] test> db.aaa.find()

在这里插入图片描述

主从替换

通过模拟主节点宕机来检验主从替换,以通过杀死指令杀死主进程来达到宕机效果

当主节点宕机后访问27018(从节点)端口,可以看到该端口对应的mongodb变成了主节点,以及当执行rs.status()命令时,显示27017端口的mongodb的状态为不可达/健康

  1. 主节点状态

在这里插入图片描述

  1. 从节点状态

在这里插入图片描述

  1. 宕掉主节点
[root@localhost ~]# systemctl stop mongodb.service
  1. 登录从节点查看状态
rs0 [direct: secondary] test> rs.status()
  1. 主节点宕机后的状态

在这里插入图片描述

  1. 从节点的状态

在这里插入图片描述

13、报错解决

1、报错:命令列表数据库需要身份验证

MongoServerError: command listDatabases requires authentication

解决方案:认证用户

rs0 [direct: primary] test> use admin switched to db admin
rs0 [direct: primary] admin> db.auth("root","123456")

2、报错:

MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string

mongodb默认是从主节点读写数据的,副本节点上不允许读

rs0 [direct: secondary] test> show dbs;
2023-04-028T22:50:43.712+0800 E QUERY    [thread1] Error: listDatabases failed:{"ok" : 0,"errmsg" : "not master and slaveOk=false","code" : 13435,"codeName" : "NotMasterNoSlaveOk"
} :

解决方案:

rs0 [direct: secondary] test> rs.slaveOk()
#当执行这条命令时会有一个警告,意思是这条参数可能在以后的版本弃用了,将会用 secondaryOk()代替
rs0 [direct: secondary] test> rs.secondaryOk()

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

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

相关文章

el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来 需求 我们使用element-ui或者element-plus的时候会遇到树形控件的使用,我们使用树形控件会限制有的节点不让选中和高亮出来,这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus…

什么工具能将视频转成gif?分享一个在线制作gif网站

Gif动图看起来效果非常的炫酷,也很复杂。这种gif动图制作起来是不是也很麻烦呢?其实制作gif动画的方法非常的简单,不用下载软件,小白也能操作。只需要使用在线制作gif(https://www.gif.cn/)工具-GIF中文网&…

大数据学习之Flink算子、了解(Source)源算子(基础篇二)

Source源算子(基础篇二) 目录 Source源算子(基础篇二) 二、源算子(source) 1. 准备工作 2.从集合中读取数据 可以使用代码中的fromCollection()方法直接读取列表 也可以使用代码中的fromElements()方…

手机视频压缩怎么压缩?一键瘦身~

现在手机已经成为我们日常生活中必不可少的工具,而在手机的应用领域中,文件的传输和存储是一个非常重要的问题。很多用户都会遇到这样一个问题,那就是在手机上存储的文件太多太大,导致手机存储空间不足,那么怎么在手机…

Flink实现数据写入MySQL

先准备一个文件里面数据有: a, 1547718199, 1000000 b, 1547718200, 1000000 c, 1547718201, 1000000 d, 1547718202, 1000000 e, 1547718203, 1000000 f, 1547718204, 1000000 g, 1547718205, 1000000 h, 1547718210, 1000000 i, 1547718210, 1000000 j, 154771821…

ubuntu1604安装及问题解决

虚拟机安装vmbox7 虚拟机操作: 安装增强功能 sudo mkdir /mnt/share sudo mount -t vboxsf sharefolder /mnt/share第一次使用sudo提示is not in the sudoers file. This incident will be reported 你的root需要设置好密码 sudo passwd root 输入如下指令&#x…

华为ensp--NAT实验

实验拓扑图及实验要求 实验相关配置 为保证可以登录防火墙web界面,需要对FW1、FW2以及Cloud1进行相关配置 Cloud1配置 需绑定网卡(建议新建虚拟网卡),并且与防火墙管理口(默认g0/0/0)属于同一网段 FW1 F…

缓存问题 | 缓存穿透,缓存击穿,缓存雪崩

缓存穿透 关键字:强调缓存和数据库都没有数据并发访问 缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存去访问数据库,大量的请求有可能导致DB宕机。 应对策略: 使用布隆过滤器(Bloom Filter)&am…

C++力扣题目62--不同路径 63--不同路径II 343--整数拆分 96--不同的二叉搜索树

62.不同路径 力扣题目链接(opens new window) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。…

Vite+Electron快速构建一个VUE3桌面应用(一)

一. 简介 首先,介绍下vite和Electron。 Vite是一种新型前端构建工具,能够显著提升前端开发体验。Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入Chromium和Node.js到二进制的 Electron 允许您保持一个 JavaScript 代码代码…

剧本杀小程序开发:打造沉浸式推理体验

随着社交娱乐形式的多样化,剧本杀逐渐成为年轻人喜爱的聚会活动。而随着技术的发展,剧本杀小程序的开发也成为了可能。本文将探讨剧本杀小程序开发的必要性、功能特点、开发流程以及市场前景。 一、剧本杀小程序开发的必要性 剧本杀是一种角色扮演的推…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力?NPDP认证正是你需要的!🔥 NPDP认证,即产品经理国际资格认证,由美国产品开发与管理协会(PDMA)所发起,是全球公认的新产品开发专业认…