当前位置: 首页 > article >正文

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


http://www.kler.cn/a/372215.html

相关文章:

  • 【K8S系列】Kubernetes 中 Service IP 分配 问题及解决方案【已解决】
  • LeetCode算法(链表)
  • 【vue】14.插槽:构建可复用组件的关键
  • ssm基于ssm框架的滁艺咖啡在线销售系统+vue
  • TIFS-2024 FIRe2:细粒度表示和重组在换衣行人重识别中的应用
  • 网络编程_day6
  • 【MySQL】C语言连接MySQL数据库3——事务操作和错误处理API
  • 电子电气架构 --- 电气系统工程
  • 【MySQL】 运维篇—备份与恢复:备份策略与方法
  • 商场应急响应:SpringBoot技术优化
  • 排序算法在最坏情况下的性能差异:深入分析
  • 音视频如何轻松转换?来看看这四款工具:
  • Android Html.fromHtml和buildSpannedString用途和实现方式
  • 探索C嘎嘎:初步接触STL
  • 【SQL】SQL函数
  • 鸿蒙生态崛起:开发者的机遇与挑战
  • 多IP访问网站
  • openjdk17 C++源码是怎么给java字段赋值的
  • 每天10个vue面试题(四)
  • 钉钉与金蝶云星空数据集成:提高企业付款申请单处理效率
  • 轻松完成大量视频制作任务,视频剪辑高手软件的顺时针和逆时针90度功能大揭秘,一键实现大量视频的批量剪辑
  • Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
  • 如何使用python来分析消费者行为?
  • 3D点云与2D图像的相互转换:2D图像对应像素的坐标 转为3D空间的对应坐标
  • 【大模型之Graph RAG系列之一】由谷歌搜索的演进看知识图谱如何改进RAG技术
  • MySQL数据类型——针对实习面试