搭建 mongodb 副本集,很详细

news2024/11/26 11:08:03

搭建 mongodb 副本集,很详细

  • 一、前言
  • 二、创建用户
    • 1、创建 root 用户
    • 2、创建测试用户
    • 3、修改用户密码
  • 三、修改配置文件(主节点)
    • 1、开启登录认证
    • 2、加上副本集
    • 3、最终配置文件
  • 四、副本节点
    • 1、创建副本节点目录
    • 2、编辑配置文件
    • 3、启动副本节点
  • 五、仲裁节点
    • 1、创建仲裁节点目录
    • 2、修改配置文件
    • 3、启动仲裁节点
  • 六、配置副本集
    • 1、配置主节点
    • 2、添加副本节点
    • 3、配置仲裁节点
  • 七、测试事务

一、前言

在项目中使用事务报错,折腾了好久发现单体的 mongodb 不支持事务,需要副本集,在搭建的过程也踩了很多坑,这里做个记录。

二、创建用户

1、创建 root 用户

切换到 admin 库中

use admin

创建 root 用户

db.createUser(
  {
    user: "root",
    pwd: "123456", // or cleartext password
    roles: [
      { role: "root", db: "admin" }
    ]
  }
)

这里是为了演示,实际密码不能设置那么简单

在这里插入图片描述

2、创建测试用户

创建测试数据库 test ,命令如下:

use test

创建测试用户 test ,命令如下:

db.createUser(
  {
    user: "test",
    pwd: "123456", // or cleartext password
    roles: [
      { role: "readWrite", db: "test" }
    ]
  }
)

这里是为了演示,实际密码不能设置那么简单

在这里插入图片描述

3、修改用户密码

假如要修改用户 root 的密码,从原来的 123456 改为 112233 ,可以使用如下命令:

db.changeUserPassword('root','112233');

操作如下图所示

在这里插入图片描述

如果要修改数据库 test 中的用户 test ,将密码从原来的 123456 修改为 334455 ,可以使用如下命令:

db.changeUserPassword('test','334455');

操作如下图所示
在这里插入图片描述

三、修改配置文件(主节点)

1、开启登录认证

添加如下配置:

在这里插入图片描述

security:
  # 开启登录认证
  authorization: enabled

重启 mongodb ,先关闭,命令如下:

mongod --config /usr/local/mongodb/mongodb-8.0.1/mongodb.conf --shutdown

再启动,命令如下:

mongod --config /usr/local/mongodb/mongodb-8.0.1/mongodb.conf

在这里插入图片描述

再次进入 mongosh 操作

在这里插入图片描述

可以看到报了一个权限的错,使用前面创建的 test 用户进行登录

db.auth("test", "123456")

再次查询

db.getCollection("thread_pool_test").find()

在这里插入图片描述

2、加上副本集

编辑根目录下的配置文件 mongodb.conf ,加上如下配置

在这里插入图片描述

replication:
  # 副本集名称
  replSetName: rs0

副本集名称可以自定义,这里为 rs0 。

重启 mongodb ,先关闭,命令如下:

mongod --config /usr/local/mongodb/mongodb-8.0.1/mongodb.conf --shutdown

再启动,命令如下:

mongod --config /usr/local/mongodb/mongodb-8.0.1/mongodb.conf

会报如下错:
在这里插入图片描述
这是说同时开启了 验证(用户名密码)和 副本集(replica sets),则需要 security.keyFile 文件。

security.keyFile 文件需要使用 OpenSSL 来生成,可以到这里下载

在这里插入图片描述

在这里插入图片描述

我这里安装在了 D:\software\OpenSSL 目录,安装好了之后进入文件根目录,点击如下文件

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

然后进入根目录,点击 start.bat 文件

在这里插入图片描述

会出现一个黑窗口,输入如下命令:

openssl rand -base64 756 > "security.keyFile文件生成目录"

这是我的:

openssl rand -base64 756 > D:\software\OpenSSL\security.keyFile

在这里插入图片描述

然后在对应目录下可以看到

在这里插入图片描述

如何再将这个文件上传到服务器的某个目录,我这里是

/usr/local/mongodb

在这里插入图片描述

再编辑 mongodb.conf 配置文件,加上如下配置:

在这里插入图片描述

security:
  # 开启登录认证
  authorization: enabled
  # 同时开启了 验证(用户名密码)和 副本集(replica sets),需要添加 security.keyFile
  keyFile: /usr/local/mongodb/security.keyFile

再次重启

mongod --config /usr/local/mongodb/mongodb-8.0.1/mongodb.conf

在这里插入图片描述

启动失败了,但是看不到什么有用的信息,看一下日志,日志目录在

在这里插入图片描述

日志如下:

在这里插入图片描述

permissions on /usr/local/mongodb/security.keyFile are too open

这是因为 security.keyFile 这个文件的权限太大了,那就缩小一点,执行如下命令:

chmod -R 600 /usr/local/mongodb/security.keyFile

在这里插入图片描述

再次重启

在这里插入图片描述

3、最终配置文件

# mongod.conf

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

# Where and how to store data.
storage:
  #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
  dbPath: /usr/local/mongodb/mongodb-8.0.1/data/db
  #journal:
    #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
    #enabled: true

# where to write logging data.
systemLog:
  #MongoDB发送所有日志输出的目标指定为文件
  destination: file
  #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
  logAppend: true
  #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
  path: /usr/local/mongodb/mongodb-8.0.1/data/log/mongod.log

# network interfaces
net:
  port: 27017
  # 远程连接要指定ip,否则无法连接;0.0.0.0代表不限制ip访问
  bindIp: 0.0.0.0

processManagement:
  #启用在后台运行mongos或mongod进程的守护进程模式。
  fork: true

security:
  # 开启登录认证
  authorization: enabled
  # 同时开启了 验证(用户名密码)和 副本集(replica sets),需要添加 security.keyFile
  keyFile: /usr/local/mongodb/security.keyFile

#operationProfiling:

replication:
  # 副本集名称
  replSetName: rs0

#sharding:

## Enterprise-Only Options:

#auditLog:

四、副本节点

1、创建副本节点目录

根据自己的情况修改

创建存储数据目录,命令如下:

mkdir -p /usr/local/mongodb/rs27018/data/db

创建存储日志目录,命令如下:

mkdir -p /usr/local/mongodb/rs27018/data/log

在这里插入图片描述

进入副本节点 rs27018 目录,修改一下 data 文件的权限,命令如下

chmod -R 666 data

在这里插入图片描述

2、编辑配置文件

就是拿主节点的配置文件进行修改,ip地址是 localhost 和服务器内网地址

在这里插入图片描述

# mongod.conf

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

# Where and how to store data.
storage:
  #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
  dbPath: /usr/local/mongodb/rs_27018/data/db
  #journal:
    #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
    #enabled: true

# where to write logging data.
systemLog:
  #MongoDB发送所有日志输出的目标指定为文件
  destination: file
  #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
  logAppend: true
  #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
  path: /usr/local/mongodb/rs_27018/data/log/mongod.log

# network interfaces
net:
  port: 27018
  # 远程连接要指定ip,否则无法连接;0.0.0.0代表不限制ip访问
  bindIp: localhost, 172.25.94.151

processManagement:
  #启用在后台运行mongos或mongod进程的守护进程模式。
  fork: true

replication:
  replSetName: rs0

#sharding:

## Enterprise-Only Options:

#auditLog:

3、启动副本节点

启动命令如下:

mongod -dbpath /usr/local/mongodb/rs27018/data/db -logpath /usr/local/mongodb/rs27018/data/log/mongod.log --config /usr/local/mongodb/rs27018/mongodb.conf

似乎一定指定存储目录和日志目录,不然启动不了。

在这里插入图片描述

五、仲裁节点

1、创建仲裁节点目录

根据自己的情况修改

创建存储数据目录,命令如下:

mkdir -p /usr/local/mongodb/rs27019/data/db

创建存储日志目录,命令如下:

mkdir -p /usr/local/mongodb/rs27019/data/log

在这里插入图片描述

进入副本节点 rs27019 目录,修改一下 data 文件的权限,命令如下

chmod -R 666 data

在这里插入图片描述

2、修改配置文件

在这里插入图片描述

# mongod.conf

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

# Where and how to store data.
storage:
  #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
  dbPath: /usr/local/mongodb/rs_27019/data/db
  #journal:
    #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
    #enabled: true

# where to write logging data.
systemLog:
  #MongoDB发送所有日志输出的目标指定为文件
  destination: file
  #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
  logAppend: true
  #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
  path: /usr/local/mongodb/rs_27019/data/log/mongod.log

# network interfaces
net:
  port: 27019
  # 远程连接要指定ip,否则无法连接;0.0.0.0代表不限制ip访问
  bindIp: localhost, 172.25.94.151

processManagement:
  #启用在后台运行mongos或mongod进程的守护进程模式。
  fork: true

replication:
  replSetName: rs0

#sharding:

## Enterprise-Only Options:

#auditLog:

3、启动仲裁节点

同样,只能加上存储和日志目录才能启动成功,命令如下

mongod -dbpath /usr/local/mongodb/rs27019/data/db -logpath /usr/local/mongodb/rs27019/data/log/mongod.log --config /usr/local/mongodb/rs27019/mongodb.conf

在这里插入图片描述

六、配置副本集

1、配置主节点

先进入 mongosh

mongosh

在这里插入图片描述

可以看到使用命令报错了,需要初始化副本集,命令如下:

rs.initiate()

在这里插入图片描述

可以看到现在是 secondary ,也就是从节点,再次回车

在这里插入图片描述

就变成了 primary ,即主节点。

接着查看副本集的配置内容,命令如下:

rs.config()

在这里插入图片描述

再查看副本集状态,命令如下:

rs.status()

在这里插入图片描述

2、添加副本节点

先查看内网地址,命令如下:

ifconfig

在这里插入图片描述

可以看到内网地址为:

172.25.94.151

这里将端口为 27018 的节点作为副本节点,所以添加副本节点的命令如下:

rs.add("172.25.94.151:27018")

在这里插入图片描述

看起来是没有问题,再次使用

rs.status()

查看状态

在这里插入图片描述

可以看到是 (not reachable/healthy) ,说明添加的副本节点是有问题的,正常的应该是 SECONDARY ,查看日志

在这里插入图片描述

AuthenticationFailed: It is not possible to authenticate as the __system user on servers started without a --keyFile parameter

看起来应该是要配置 keyFile 文件,那就将主节点的这部分配置拿过来

在这里插入图片描述

security:
  # 开启登录认证
  authorization: enabled
  # 同时开启了 验证(用户名密码)和 副本集(replica sets),需要添加 security.keyFile
  keyFile: /usr/local/mongodb/security.keyFile

先将添加的副本节点删除,命令如下:

rs.remove("172.25.94.151:27018")

在这里插入图片描述

然后再次重启,先关闭

mongod -dbpath /usr/local/mongodb/rs27018/data/db -logpath /usr/local/mongodb/rs27018/data/log/mongod.log --config /usr/local/mongodb/rs27018/mongodb.conf --shutdown

再启动

mongod -dbpath /usr/local/mongodb/rs27018/data/db -logpath /usr/local/mongodb/rs27018/data/log/mongod.log --config /usr/local/mongodb/rs27018/mongodb.conf

在这里插入图片描述

重新添加节点,命令如下:

rs.add("172.25.94.151:27018")

在这里插入图片描述

再次查看状态

rs.status()

在这里插入图片描述

可以看到添加副本节点正常了。

在上面的过程中,我发现添加副本节点用主节点这个来添加也可以

在这里插入图片描述

这个其实是服务器中主机名称

在这里插入图片描述

所以添加副本节点的命令如下:

rs.add("iZf8z8qpzl0oqs4a6mc897Z:27018")

在这里插入图片描述

也能添加成功

在这里插入图片描述

3、配置仲裁节点

从配置副本节点中可以知道内网地址为:

172.25.94.151

添加副本节点命令如下:

rs.addArb("172.25.94.151:27019")

添加时报错

在这里插入图片描述

Reconfig attempted to install a config that would change the implicit default write concern. Use the setDefaultRWConcern command to set a cluster-wide write concern and try the reconfig again.

需要在主节点设置一下,命令如下:

db.adminCommand({
  "setDefaultRWConcern" : 1,
  "defaultWriteConcern" : {
    "w" : 2
  }
})

在这里插入图片描述

再次添加

rs.addArb("172.25.94.151:27019")

在这里插入图片描述

查看状态:

rs.status()

在这里插入图片描述

可以看到节点状态也是不正常的,查看日志

在这里插入图片描述

AuthenticationFailed: It is not possible to authenticate as the __system user on servers started without a --keyFile parameter

看来仲裁节点和副本节点一样,也需要加上 keyFile 文件

在这里插入图片描述

security:
  # 开启登录认证
  authorization: enabled
  # 同时开启了 验证(用户名密码)和 副本集(replica sets),需要添加 security.keyFile
  keyFile: /usr/local/mongodb/security.keyFile

接着删除仲裁节点,命令如下:

rs.remove("172.25.94.151:27019")

在这里插入图片描述

然后再次重启,先关闭

mongod -dbpath /usr/local/mongodb/rs27019/data/db -logpath /usr/local/mongodb/rs27019/data/log/mongod.log --config /usr/local/mongodb/rs27019/mongodb.conf --shutdown

再启动

mongod -dbpath /usr/local/mongodb/rs27019/data/db -logpath /usr/local/mongodb/rs27019/data/log/mongod.log --config /usr/local/mongodb/rs27019/mongodb.conf

在这里插入图片描述

重新添加仲裁节点

rs.addArb("172.25.94.151:27019")

在这里插入图片描述

再查看状态

rs.status()

在这里插入图片描述

可以看到仲裁节点添加成功了。

后面经过测试,发现仲裁节点也可以用主节点这个来添加

在这里插入图片描述

这个其实是服务器中主机名称

在这里插入图片描述

添加仲裁节点命令如下:

rs.addArb("iZf8z8qpzl0oqs4a6mc897Z:27019")

查看状态也能添加成功

在这里插入图片描述

七、测试事务

业务代码是这样的

在这里插入图片描述

正常调用

在这里插入图片描述

再看看集合(数据表)

在这里插入图片描述

看起来是没问题了,再加上错误,再重新调用接口,看看会不会插入

在这里插入图片描述

再查看集合

在这里插入图片描述

还是那10条数据,成功回滚。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python实操】python小程序之参数化以及Assert(断言)

引言 python小程序之参数化以及Assert(断言) 文章目录 引言一、参数化2.1 题目2.2 代码2.3 代码解释 二、Assert(断言)2.1 概念2.1.1 Assert语句的基本语法:2.1.2 基本断言2.1.3 断言函数参数2.1.4 断言前后状态一致 2…

网页HTML编写练习:华语榜中榜

网页效果 HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…

NLP--一起学习Word Vector【实践】

纸上得来终觉浅&#xff0c;绝知此事要躬行。 《冬夜读书示子聿》 值此1024的程序员节&#xff0c;我们一起学习 Word Vector。 本章一起学习文本向量化&#xff0c;掌握文本向量的相关概念&#xff0c;了解各个文本向量&#xff0c;实现文本向量的算法 我开启了一个NLP共学坊…

arm ubuntu22.04 安装es7.16.2

1、更新软件包 sudo apt update && sudo apt upgrade -y 2、安装jdk11 sudo apt install openjdk-11-jdk -y 安装查看版本 java -version 输出应该是这样的 openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment (build 11.0.119-Ub…

【主机漏洞扫描常见修复方案】:Tomcat安全(机房对外Web服务扫描)

文章目录 引言I SSL/TLS Not ImplementedTomcat 服务器 SSL 证书安装部署(JKS 格式)Tomcat 服务器 SSL 证书安装部署(PFX 格式)HTTP 自动跳转 HTTPS 的安全配置(可选)修复SSL证书版本低II 主机漏洞扫描常见修复方案Apache JServ protocol serviceSlow HTTP DEnial of Ser…

Ubuntu 上安装 Redmine 5.1 指南

文章目录 官网安装文档&#xff1a;命令步骤相关介绍GemRubyRailsBundler 安装 Redmine更新系统包列表和软件包&#xff1a;安装必要的依赖&#xff1a;安装 Ruby&#xff1a;安装 bundler下载 Redmine 源代码&#xff1a;安装 MySQL配置 Redmine 的数据库配置文件&#xff1a;…

54万字WORD电力数字化转型智慧电力一体化监管云平台整体解决方案

▲关注智慧方案文库&#xff0c;学习9000多份最新解决方案&#xff0c;其中 PPT、WORD超过7000多份 &#xff0c;覆盖智慧城市多数领域的深度知识社区&#xff0c;稳定更新4年&#xff0c;日积月累&#xff0c;更懂行业需求。 1459页54万字WORD丨电力行业数字化转型 智慧电力…

【ArcGIS Pro实操第4期】绘制三维地图

【ArcGIS Pro实操第4期】绘制三维地图 ArcGIS Pro绘制三维地图-以DEM高程为例参考 如何使用ArcGIS Pro将栅格数据用三维的形式进行表达&#xff1f;在ArcGIS里可以使用ArcScene来实现&#xff0c;ArcGIS Pro实现原理跟ArcScene一致。由于Esri未来将不再对ArcGIS更新&#xff0c…

53页 PPT煤炭行业数字化转型规划方案

▲关注智慧方案文库&#xff0c;学习9000多份最新解决方案&#xff0c;其中 PPT、WORD超过7000多份 &#xff0c;覆盖智慧城市多数领域的深度知识社区&#xff0c;稳定更新4年&#xff0c;日积月累&#xff0c;更懂行业需求。 53页 PPT煤炭行业数字化转型规划方案 通过对煤企高…

手机玩使命召唤21:黑色行动6?GameViewer远程玩使命召唤教程

使命召唤21&#xff1a;黑色行动 6这个第一人称射击游戏&#xff0c;将于10月25号上线&#xff01;如果你是使命召唤的老玩家&#xff0c;是不是也在期待这部新作&#xff1f;其实这个游戏不仅可以用电脑玩&#xff0c;还可以用手机玩&#xff0c;使用网易GameViewer远程就能让…

【Qt6聊天室项目】 主界面功能实现

1. 获取当前用户的个人信息 1.1 前后端逻辑分析&#xff08;主界面功能&#xff09; 主界面上所有的前后端交互逻辑相同&#xff0c;分析到加载会话列表后其余功能仅实现。 核心逻辑总结 异步请求-响应模型 客户端发起请求&#xff0c;向服务器发送包含会话ID的请求服务端处…

python画图|曲线动态输出

【1】引言 前序教程中的曲线动态输出&#xff0c;其实是把曲线按照左右移动的形式输出&#xff08;波的传递形式&#xff09;。 python画图|曲线动态输出基础教程_python 动态曲线-CSDN博客 但有些时候我们更期待的是曲线不移动&#xff0c;随着自变量的增加而输出因变量&am…

信号与系统学习:傅里叶级数

一、基本概念 1. 什么是傅里叶级数&#xff1f; 傅里叶级数是一种数学工具&#xff0c;可以将一个周期函数分解为一系列正弦和余弦函数&#xff08;即三角函数&#xff09;的和。这些正弦和余弦函数的频率是原函数的整数倍。 2. 为什么要使用傅里叶级数&#xff1f; 信号分…

【STM32+HAL】OV2640捕获图像显示

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 通过OV2640捕获图像…

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程&#xff0c;并创建美观、一致的用户界面&#xff1f;您的搜索到此为止&#xff01;我们的Flutter UI组件库&#xff08;JUI&#xff09;提供了广泛的预构建、可自定义组件&#xff0c;帮助您快速构建…

为什么会配置足够打LOL等网游很卡?12代大小核处理器最典型

卡顿原因及优化建议 大小核调度问题&#xff1a; 调度不当&#xff1a;某些游戏未针对大小核进行优化&#xff0c;可能导致系统将负载分配到效率核&#xff08;小核&#xff09;&#xff0c;而性能核&#xff08;大核&#xff09;未被充分利用。操作系统调度策略&#xff1a;尽…

15.6 JDBC数据库编程6——可滚动和可更新的ResultSet

目录 15.6 引言 15.6.1 可滚动的ResultSet 15.6.1 可更新的ResultSet 15.6 引言 可滚动的ResultSet是指在结果集对象上不但可以向前访问结果集中的记录&#xff0c;还可以向后访问结果集中记录。可更新的ResultSet是指不但可以访问结果集中的记录&#xff0c;还可以更新…

文件操作(1) —— 文件基础知识

目录 1. 为什么使用文件&#xff1f; 2. 文件种类【按功能分】 3. 文件名 4. 数据文件种类【按存储方式细分】 5. 文件的打开和关闭 5.1 流和标准流 5.2 文件指针 5.3 文件的打开和关闭函数 6. 文件缓冲区 1. 为什么使用文件&#xff1f; 如果没有⽂件&#xff0c;我…

Vue笔记-浏览器窗口改变时,重新计算表格高度并设置

当窗口大小改变时&#xff0c;你监听 window 对象的 resize 事件&#xff0c;然后在事件处理程序中重新计算表格的高度。在 Vue 中&#xff0c;可以在组件中通过 created 生命周期钩子来添加事件监听器&#xff0c;然后在组件销毁时移除事件监听器。 如下vue代码&#xff1a; …

Android GPU Inspector分析帧数据快速入门

使用 谷歌官方工具Android GPU Inspector (AGI) 可以对Android 应用进行深入和全面的系统性能分析和帧性能分析 。AGI 是一个非常强大的分析工具&#xff0c;尤其是在需要诊断 GPU 性能问题和优化应用时&#xff0c;可以帮助你精准找到性能瓶颈。本文介绍如何使用该工具对帧数据…