MongoDB副本集部署完整教程

一般而言,副本集主要成员有三个:主节点,副本节点,仲裁节点


        按照官方推荐方案,我们搭建一个三成员的副本集,这个副本集由一个主结点和两个副本结点组成。

这里采用三台虚拟机进行部署:node1(主节点),node2(副本节点),node3(副本节点)

一、环境准备

按照跳转文章介绍的方式,分别在三台服务器上创建user-mongo用户,并将目录/opt/module/,mongodb_dcmo/更改为用户user_mongo的权限,使用该用户进行MongoDB副本集安装与启动
        在三台服务器目录/opt/module/mongodb_demo/下创建目录/replicaset/data/和目录/replicaset/logs/,用于存放MongoDB副本集的数据和MongoDB副本集的日志文件,具体操作命令如下:

mkdir replicaset
cd replicaset/
mkdir data
mkdir logs
cd logs
touch mongodb.log

二、副本集的安装与启动

1.安装副本集

        首先在node1上安装好mongodb,通过解压MongoDB安装包的方式安装MongoDB,将MongoDB安装包解压目录/opt/module/mongo_demo/replicaset/下,重命名为mongodb后

        replicaset目录下包含data(数据)、logs(日志)和mongodb(MongoDB安装目录)文件夹,并且这些文件夹的用户权限都是user_mongo.
        再将服务器node1中/opt/module/mongodb_demo/replicaset/目录下的所有内容通过scp命令分发到服务器node2和服务器node3上

2.启动副本集

分别在三台服务器node1、node2和node3的/opt/module/mongodb_demo/replicaset/mongodb/bin目录下以副本集模式启动MongoDB,这里以服务器node1为例进行操作

node1:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin

副本集模式启动mongodb: 

./mongod --replSet xxx --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27017 --bind_ip node1 --logappend --fork

        上述启动MongoDB命令中,参数replSet指定MongoDB副本集名称【xxx-自己命名】,同一副本集须指定相同名称;

参数dbpath指定MongoDB副本集数据存放目录(不能与其他MongoDB服务冲突);

参数logpath指定MongoDB服务副本集日志目录;

参数port指定MongoDB副本集启动占用的端口号(不能与其他MongoDB冲突);

参数bind_ip开启远程连接,使用当前服务器主机名;

参数logappend指定以追加的方式写入日志;

参数fork指定MongoDB后台启动。 

node2:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node2 --logappend --fork

node3:

cd /opt/module/mongodb_demo/replicaset/mongodb/bin
./mongod --replSet itcast --dbpath=/opt/module/mongodb_demo/replicaset/data/ --logpath=/opt/module/mongodb_demo/replicaset/logs/mongodb.log --port 27018 --bind_ip node3 --logappend --fork

3.副本集的初始化

 登录mongodb客户端:

./mongosh --host node1 --port 27017

这里新版本用的mongosh 老版本用mongo即可

当出现命令输入提示符>,证明在服务器node1中成功登录MongoDB客户端!
接着在MongoDB客户端中执行副本集初始化操作:

rs.initiate()

接着查看副本集成员状态:

rs.status()

当前副本集只有一个成员角色,即主结点。接下来,我们将其他两台服务器node2和node3中的MongoDB以副本结点的角色添加到副本集中(添加结点的操作必须在主结点
进行),具体命令如下:

rs.add("node2:27017")
rs.add("node3:27017")

       

         执行完添加副本结点命令后,客户端会返回添加的副本结点的相关信息,如信息中字段“OK”的值为1,则证明副本结点添加成功!

        此时,在服务器node2和node3上登录MongoDB客户端,查看当前服务器在副本集中的角色分配情况:

./mongosh --host node2 --port 27017

 

./mongosh --host node3 --port 27017

4.同步副本文档

通过向MongoDB副本集主结点写入文档,验证其他副本结点是否成功同步主结点写入的文档内容,具体操作步骤如下。
(1)在服务器node1(副本集主结点)的MongoDB客户端写入一条文档,具体命令如下: 

      

  通过上述操作,成功在副本集主结点的数据库test中创建集合user并插入一条文档。
(2)在服务器node2(副本结点)中登录MongoDB客户端,查看数据库test下的集合user中是否存在与主结点一致的文档内容,具体命令如下:

        执行查看集合中的文档命令时,客户端会返回Error的错误信息,这是因为默认情况下
副本结点不能读取副本集中的内容,因此我们需要设置开启副本结点的读取权限,然后才可
以查看副本集中的内容,具体命令如下:       

        注:MongoDB 旧版本中,rs.secondaryOk() 用于允许从 secondary 副本集成员读取数据。但在较新版本(MongoDB 4.2 及以上),官方改进了 读偏好(Read Preference) 机制,推荐使用 setReadPref() 来设置读取策略。

db.getMongo().setReadPref("primaryPreferred")

或在 MongoDB shell 连接时直接指定:

mongo --host xxx --readPreference=primaryPreferred

  • "primary":默认值,只从 primary 读取。
  • "secondary":只从 secondary 读取(适用于查询压力大的情况)。
  • "primaryPreferred"优先从 primary 读取,但如果 primary 不可用,则从 secondary 读取(推荐)。
  • "secondaryPreferred":优先从 secondary 读取,primary 不可用时才会使用 primary。
  • "nearest":从最近的节点读取(不考虑 primary/secondary

5.配置副本集成员

1.查看当前副本集配置

首先,您已经使用了 rs.conf() 命令查看了当前的副本集配置,以下是您已经提供的配置内容:cfg = rs.conf();

2.将服务器nosql02由仲裁结点更改为副本结点

修改配置

将 node2 修改为 仲裁节点arbiterOnly: true,并且将 priority 设置为 0)。

将 node3 修改为 延迟节点secondaryDelaySecs: Long("0"),并且将 priority 设置为 0,hidden 设置为 true)。

cfg.members[1].arbiterOnly = true;               // 将 node2 改为仲裁节点
cfg.members[1].priority = 0;                     // 设置优先级为 0,避免 node2 成为主节点

提交配置更改

rs.reconfig(cfg);


 
但由于不允许直接修改节点的 arbiterOnly 字段,需要先删除该节点,然后再重新添加它作为仲裁节点。

1.从副本集中删除 node2: 使用 rs.remove() 命令从副本集配置中删除 node2

rs.remove("node2:27017");

2.重新添加 node2 作为仲裁节点: 通过 rs.add() 命令将 node2 以仲裁节点的身份重新添加到副本集中。这里将 arbiterOnly 设置为 true,并将其优先级设置为 0。 

rs.add({ _id: 1, host: "node2:27017", arbiterOnly: true, priority: 0 });

成功成为仲裁节点!

也有别的方法,我没试过,应该莫问题,自己尝试

3.将服务器nosql03中延迟结点修改为正常的副本结点

修改配置:

cfg.members[2].priority = 0;                     // 设置优先级为 0,避免 node3 成为主节点
cfg.members[2].hidden = true;                    // 将 node3 设置为隐藏节点,确保不会被选为主节点

【注】出现问题解决方法【新版】 

        错误提示 BSON field 'MemberConfig.slaveDelay' is an unknown field 表示 slaveDelay 这个字段在 MongoDB 配置中是不被识别的,导致 rs.reconfig(cfg) 执行失败。事实上,MongoDB 中并没有 slaveDelay 字段用于副本集成员的配置。

正确的字段名:

在 MongoDB 中,应该使用 secondaryDelaySecs 来设置副本集成员的延迟时间,而不是 slaveDelaysecondaryDelaySecs 字段用于设置副本节点相对于主节点的延迟时间,单位是秒。

解决方法:

将 slaveDelay 更改为 secondaryDelaySecs,并重新配置副本集:

cfg.members[2].secondaryDelaySecs = 3600;  // 设置延迟时间为3600秒

cfg.members[3].priority = 1;  // 设置优先级为 1
cfg.members[3].hidden = false;  // 取消隐藏节点
cfg.members[3].secondaryDelaySecs = 0;  // 设置延迟为 0 秒


成功了,将服务器nosql03中延迟结点修改为正常的副本结点,即优先级为1,非隐藏和延迟为0秒。

6.安全认证

1.在服务器node3创建新的数据目录和日志文件,以副本集模式启动新的 MongoDB ,此 MongoDB 使用27016端口,并指定 keyFile 文件。

(1)创建存放keyfile文件的目录,文件写入密钥并修改权限

mkdir -p /opt/module/mongodb_demo/replicaset/key
touch /opt/module/mongodb_demo/replicaset/key/keyfile
openssl rand -base64 756 -out /opt/module/mongodb_demo/replicaset/key/keyfile
chmod 600 /opt/module/mongodb_demo/replicaset/key/keyfile

 (2)同步文件

scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node1:/opt/module/mongodb_demo/replicaset/
scp -r /opt/module/mongodb_demo/replicaset/key user_mongo@node2:/opt/module/mongodb_demo/replicaset/

(3)创建全局管理用户

登录客户端后,切换到数据库admin,添加全局用户

use admin;
db.createUser({user:"wurui",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},{role:"readWriteAnyDatabase",db:"admin"},{role:"dbAdminAnyDatabase",db:"admin"}]});

验证用户是否创建成功:

 执行完上述命令后客户端返回信息“1”,则证明用户创建成功。

创建新data和新log --我这里命名data103文件和log103文件,log3文件中添加空文件mongo.log

赋予权限:

sudo chown -R user_mongo:user_mongo /opt/module/mongodb_demo/replicaset/data103/
sudo chown -R user_mongo:user_mongob /opt/module/mongodb_demo/replicaset/logs103/

启动安全认证:

./mongod --replSet wurui --keyFile /opt/module/mongodb_demo/replicaset/key/keyfile --dbpath=/opt/module/mongodb_demo/replicaset/data103/ --logpath=/opt/module/mongodb_demo/replicaset/logs103/mongo.log --port 27016 --bind_ip node3 --logappend -fork

node1查看状态:

2. 在副本集主结点将服务器node3上新启动的 MongoDB 以副本结点的形式添加到副本集

主节点中:

rs.add("node3:27016")

 

出现ok1-->成功成功! 

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

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

相关文章

springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置,可以实现灵活的路由管理。以下是详细实现步骤: 1. 数据库表设计 创建路由配置表 gateway_route: CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之,藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言:STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

Git 的基本概念和使用方式(附有思维导图)

一、Git 简介 Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 在 2005 年为帮助管理 Linux 内核开发版本而开发 。与集中式版本控制系统(如 SVN)不同,在分布式系统中,每个开发者的本地机器都拥有一个完整的 G…

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…

mac 被禁用docker ui后,如何使用lima虚拟机启动docker

本机macos 安装lima brew install lima创建配置 echo "\\ndynamic:\n big-sur:\n image: docker://docker:git\n linux:\n image: docker.io/limasoftware/ubuntu:20.04 \\n" > ~/.lima/default.yaml启动名叫default的虚拟机 limactl start default进…

WIFI无ip分配之解决方法(Solution to WiFi without IP allocation)

WIFI无ip分配之解决方法 在信息化无比发达的当下社会&#xff0c;电脑在日常生活中也发挥着巨大的作用&#xff0c;不管是电脑还是手机只有在网络环境中才能得到更好的运用。然而很多朋友在使用网络的时候都会遇到一些问题&#xff0c;最常见的就是无线网络连接上但是WiFi无IP…

bootloader相关部分

简单说明 程序烧录的方式主要有ICP,ISP,IAP 其中ICP就是常用的jlink等工具 ISP就是利用MCU自带的一些特殊引脚烧录&#xff0c;比如uart IAP就是利用用户写的bootloader代码烧录 bootloader主要分为三层&#xff0c;厂家出厂的bootrom ,用户自己写的bootloader&#xff0c;…

同盾v2 2025版 blackbox , wasm加解密,逆向协议算法生成,小盾安全

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; # 欢迎交流 wjxch1004

云平台一键部署【SGLang】适用于大型语言模型和视觉语言模型的快速服务框架

SGLang 是一个适用于大型语言模型和视觉语言模型的快速服务框架。它通过共同设计后端运行时和前端语言&#xff0c;使您与模型的交互更快、更可控。 优点&#xff1a; 1.吞吐量碾压级优势 2.结构化输出快如闪电 3.多 GPU 优化 SGLang模型已经在趋动云『社区项目』上线&am…

Matlab深度学习ResNet、迁移学习多标签图像分类及超分辨率处理Grad CAM可视化分析COCO、手写数字数据集...

全文链接&#xff1a;https://tecdat.cn/?p40982 在当今数字化时代&#xff0c;图像分类和图像超分辨率处理是计算机视觉领域的重要研究方向。深度学习技术的发展为解决这些问题提供了强大的工具。本文将详细介绍如何使用Matlab构建多标签图像分类模型和图像到图像的回归网络&…

驾培市场与低空经济无人机融合技术详解

随着科技的飞速发展和社会的不断进步&#xff0c;驾培市场正面临着前所未有的变革。传统汽车驾驶培训已不再是唯一的选择&#xff0c;无人机驾驶等新兴领域正逐渐成为驾培市场的重要组成部分。本报告旨在探讨驾培市场与低空经济的融合发展&#xff0c;特别是应用型人才培养与驾…

OpenHarmony-SELinux配置

前言&#xff1a; OpenHarmony 上某个进程向samgr注册SA服务&#xff0c;其他进程在与该进程进行IPC通信之前&#xff0c;需要获取该SA服务&#xff0c;SA提供方需要为该SA配置SELinux标签&#xff0c;否则该SA会被SELinux配置为u:object_r:default_service:s0标签&#xff0c…

信息安全访问控制、抗攻击技术、安全体系和评估(高软42)

系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…

使用Nodejs基于DeepSeek加chromadb实现RAG检索增强生成 本地知识库

定义 检索增强生成&#xff08;RAG&#xff09;的基本定义 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种结合了信息检索技术与语言生成模型的人工智能技术。RAG通过从外部知识库中检索相关信息&#xff0c;并将其作为提示&…

LeeCode题库第五十二题

52.N皇后 项目场景&#xff1a; n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2…

48. 旋转图像(C++)

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]…

Ragflow技术栈分析及二次开发指南

Ragflow是目前团队化部署大模型+RAG的优质方案,不过其仍不适合直接部署使用,本文将从实际使用的角度,对其进行二次开发。 1. Ragflow 存在问题 Ragflow 开源仓库地址:https://github.com/infiniflow/ragflow Ragflow 当前版本: v0.17.0 Ragflow 目前主要存在以下问题: …

【医院成本核算专题】8.大数据与医院成本核算的关联点:开启医疗成本管理新时代

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今数字化飞速发展的时代,大数据已成为各行业变革与发展的关键驱动力。自 2011 年麦肯锡公司提出 “大数据时代” 以来,数据量呈爆发式增长。据 IDC 统计,2011 年全世界创建和复制的数据总量达…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

C# Enumerable类 之 集合操作

总目录 前言 在 C# 中&#xff0c;System.Linq.Enumerable 类是 LINQ&#xff08;Language Integrated Query&#xff09;的核心组成部分&#xff0c;它提供了一系列静态方法&#xff0c;用于操作实现了 IEnumerable 接口的集合。通过这些方法&#xff0c;我们可以轻松地对集合…