搭建 mongodb 副本集,很详细

搭建 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条数据,成功回滚。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣283-- 移动零

开始做梦的地方 力扣283 : 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。 何解? 1,暴力枚举&#xff1a…

JS面试八股文(一)

😊JS面试八股文(一) 1.JS由哪三部分组成?2.JS有哪些内置对象?3.操作数组的方法有哪些?4.JS对数据类型的检测方式有哪些?5.说一下闭包,闭包有什么特点?6.前端的内存泄漏怎…

adb常见指令以及问题解决

1.屏幕截图 问题: /system/bin/sh: pull: not found 最后是一个美元符号$,则表示不是以root身份运行; 最后是一个井号#,则表示是以root身份运行。 解决方案: 直接退出,在PC端使用adb pull,而…

Spring Boot实现的动态化酒店住宿管理系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…

软件设计师考试大纲整理

为了防止出题者不按常理出牌,此文档为根据上午题大纲自行整理的扩展知识,并非考试常考题 此文档为根据上午题大纲自行整理的扩展知识,并非考试常考题 此文档为根据上午题大纲自行整理的扩展知识,并非考试常考题 闲暇时间了解知…

Web高级开发实验:EL基本运算符与数据访问

一、实验目的 掌握EL的定义,即Expression Language,用于提高编程效率。学习和掌握在开发环境中创建Java文件,并在jsp文件中使用EL表达式去调用其中的方法与属性等。 二、实验所用方法 上机实操 三、实验步骤及截图 1、创建javaweb项目&a…

力扣刷题(sql)--零散知识点(1)

通过一段时间的刷题,感觉自己的sql能力逐渐上去,所以不会像前三道题一样讲那么详细了,这里主要会讲到一些特殊的知识点和方法。另外,我的建议是做完一个题有好的想法赶紧记录下来,不要想着最后汇总,不然会懒…

基于SSM平面设计课程在线学习系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,教师管理,课程类型管理,课程学习管理,试题讲解管理,作业信息管理 前台账号功能包括:系统首页,个人中心&…

Vue3实现获取验证码按钮倒计时效果

Vue3实现获取验证码按钮倒计时效果 效果描述:用户点击获取验证码按钮,发送请求给后端,按钮失效,并且开始倒计时60秒;在此期间,用户无法再次点击按钮,即使用户刷新页面,倒计时依然存在…

Java项目实战II基于微信小程序的马拉松报名系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 马拉松运动…

XQT_UI 组件|01|颜色

介绍 XColor 是一个用于处理颜色的类,提供了获取颜色和样式的方法。它可以与 Qt 的 UI 组件结合使用,以便在应用程序中实现丰富的颜色效果。 安装 确保你已经在项目中包含了 xqt_color_palette.hpp 和相关的头文件。 #include "xqt_color_palet…

【Go语言】Gin框架的简单基本文档

思维导图 一、go 原生的http服务 在go中写一个web服务非常方便和快速: package mainimport ("encoding/json""fmt""io""net/http" )type Response struct {Code int json:"code"Data any json:"dat…

Spring中配置文件方式来配置实现数据源

我的后端学习大纲 我Spring学习大纲 1.1.数据源(连接池)的作用: 1.数据源(连接池)是提高程序性能而出现的2.数据源的使用步骤 : 创建数据源对象,在对象创建的时候会初始化部分连接资源使用连接…

【jvm】堆的内部结构

目录 1. 说明2. 年轻代(Young Generation)2.1 说明2.2 Eden区2.3 Survivor区 3. 老年代(Old Generation)3.1 说明3.2 对象存放3.3 垃圾回收 4. jdk7及之前5. jdk8及之后 1. 说明 1.JVM堆的内部结构主要包括年轻代(You…

录屏软件推荐,4个工具助你高效录屏。

不同的录屏软件具有不同的特点和优势,如果只是偶尔需要录制,Win10 自带的录制功能就很方便;如果需要更加专业的录制和编辑功能,我可以推荐几款功能更加多样也效果较好的第三方软件。 1、福昕高清录屏 直达:www.foxits…

SVM(支持向量机)

SVM(支持向量机) 引言 支持向量机(Support Vector Machine,SVM),可以用来解答二分类问题。支持向量(Support Vector):把划分数据的决策边界叫做超平面,点到超平面的距离叫做间隔。在SVM中,距离超平面最近…

基于neo4j的新冠治疗和新冠患者轨迹的知识图谱问答系统

毕业设计还在苦恼选题?想做一个兼具前沿性和实用性的技术项目?了解下这款基于Neo4j的新冠治疗和患者轨迹的知识图谱问答系统吧! 系统可以实现两大功能模块:新冠医疗信息和患者活动轨迹的展示与问答。通过图谱技术,你可…

VBA技术资料MF219:创建一个新的类型模块

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

【方波转正弦波谐波二阶】2022-6-10

缘由怎么用555时基电路将方波转换为正弦波?-其他-CSDN问答 可参带通滤波器电路图大全(三款带通滤波器电路设计原理图详解) - 全文 - 应用电子电路 - 电子发烧友网

《关于构图问题》

这是一本讲绘画技巧的书,但仔细琢磨体现出不易察觉的东方哲学思想。中国画讲究意境与留白,留白不代表“空”,而是代表对“实”的延伸,留下瞎想空间,实现对“有限(实)”的超越。 总论 文艺是人们…