logo 范 · 拾光录
网址收集 关于作者 Github Gitee
杂文随笔5
Hexo博客:基础使用Hexo博客:Next主题Hexo博客:Next进阶使用Hexo博客:Next高级配置基于Node的WIKI管理
前端知识16
HTML常用知识CSS常用知识CSS美化checkbox复选框JavaScript常用知识JavaScript格式化时间戳JavaScript窗口宽高处理JavaScript黑夜主题切换实现方案JavaScript数字转大写简易图片查看器TypeScript基础知识Threejs基础三要素Threejs网格辅助和轨道控制器Threejs物体绘制Electron基础使用Nodejs基础知识animate.css页面动画
Vue框架19
Vite的使用及扩展Vue3父子组件Vue3使用Marked解析MarkdownMermaid图表生成库初始化页面加载动画Axios表单提交二维码解决方案NProgress加载进度条Vue3动态菜单实现Vue3使用ECharts图表Vue3处理Excel导入导出keep-alive页面缓存及setup问题Element:文件上传Element:结合Pinia实现动态菜单Element:图片上传组件Element:自定义统一弹窗组件Element:表格自定义指令控制按钮显示(鉴权)可视化大屏使用缩放适配分辨率
UniApp15
UniApp的基础使用封装网络请求工具及文件上传uni-app的开发记录微信小程序分享原生文件上传Pinia取消滚动条(兼容小程序)tabbar消息数量显示scroll-view上滑到底部加载数据状态栏高度动态设配数据共享与传递uview-plus导航栏实现背景融合Wot UIWot UI实现顶部背景图融合uni-app x
Java基础知识10
基础知识面向对象Lambda表达式常用API常用知识积累try-with-resource注解反射多线程经纬度距离计算
SpringBoot31
application配置Maven创建聚合项目全局异常处理锁机制项目启动初始化数据方式邮件功能集成原生定时任务异步集成阿里云OSS阿里OSS预签名上传基于hutool读excelJSR303WebSocketWebSocket版AI接口流式调用Smart-Doc接口文档生成器application配置信息加密雪花算法工具AOP实现请求参数脱敏思路JWT生成Token及工具类SpringBoot默认JSON与对象转换若依框架:安装使用若依框架:优化和调整文件上传若依框架:管理后台页面优化若依框架:后端接口代码优化SpringAISpringBoot实现AI接口流式调用服务启动时创建MySQL连接自建项目工程树形结构处理工具微信支付代码微信手机号登录
SpringMVC14
跨域处理拦截器RESTful风格伪前后端分离Jackson转换器调整Thymeleaf基于拦截器做权限校验AOP打印接口请求响应日志AOP打印接口请求响应耗时文件上传和回显POST请求加解密实现(AES)POST请求加解密实现(RSA+AES)参数动态校验实现方案真实IP和归属地
MyBatis8
MyBatis基本使用与配置Mapper使用相关MaBatis多数据源配置MyBatisPlus数据统计类处理方案MyBatisPlus条件查询正向工程的实现(H2)mybatis-plus-join
SpringCloud15
Netflix:微服务与搭建Netflix:服务的消费与提供Netflix:EurekaNetflix:ActuatorNetflix:RibbonNetflix:FeignNetflix:HystrixNetflix:ZuulAlibaba:简介与搭建Alibaba:Nacos注册中心Alibaba:RibbonAlibaba:OpenFeignAlibaba:Nacos配置中心Alibaba:GetewayAlibaba:Sentinel
MySQL6
MySQL基础知识MySQL多表查询与事务MySQL常用函数及解决方案MySQL视图MySQL索引安装MySQL
Redis7
Redis介绍和安装Redis配置文件Redis持久化Redis集群Redis语法基础Redis相关问题及解决方案SpringBoot集成Redis使用记录
MongoDB10
Linux安装MongoDBMongoDB基础语法MongoTemplate及SpringBoot配置MongoTemplate中Update操作MongoTemplate中聚合查询MongoTemplate日期归档示例项目使用相关知识归纳地理位置存储与距离查询MongoDB副本集与事务获取类名和属性名工具类
其他数据库1
H2数据库
Python编程6
Python基础知识Python语法yolo目标检测OpenCV的使用及树莓派平台condauv
工具集合13
IDEAMavenGradleGitNginx安装Nginx配置VSCodeJMeter压测DockerOllamaRustFSPicGoObs录制
Linux知识11
Linux常用命令Jar启动脚本VirtualBox安装CentOSVirtualBox安装Ubuntu树莓派安装及使用frp内网穿透ArchLinux:基础系统安装ArchLInux:图形化界面安装ArchLinux:常用软件ArchLinux:深度优化ArchLinux:Niri
创意设计2
Blender:入门知识UI设计基础知识
AI相关9
Claude CodeHermes AgentOpenAI基本使用OpenAI工具调用OpenAI记忆管理OpenAI推理执行OpenAI开发框架Langchainllama.cpp

副本集

MongoDB副本集是由一组拥有相同数据集的MongoDB示例所组成的集群

主要解决故障转移和主从复制的问题,但是存在单节点压力问题(硬件限制)

对于写请求都是指向当前数据库的主节点,写请求完毕后会将写操作记录在主节点的oplog中,从节点通过主节点的oplog来进行复制操作

默认情况下读操作也是指向主节点

常用架构

实例角色类型

配置

replSet=costom_name

至少3个实例

# 数据文件存放位置
dbpath = ./data
# 日志文件存放位置
logpath = ./logs/mongodb.log
# 端口
port = 27017
# 以守护程序的方式启用,即在后台运行
fork = true
# 所有IP可连接,也可以指定IP,用英文逗号分隔
bind_ip = 0.0.0.0
# 日志输出方式(写日志的模式:设置为true为追加,默认是覆盖。如果未指定此设置,启动时MongoDB的将覆盖现有的日志文件)
logappend = true
# 是否认证
auth = false
# 副本集
replSet=costom_name

将实例都启动./mongod -f mongo.conf,然后使用mongo工具连接主节点,6.x及以上版本没有mongo工具,可以使用5.x的解压包中的mongo

历史版本也无法适配系统,新方法使用mongodb-mongosh客户端:

// Ubuntu 24.04

导入 MongoDB 官方 GPG 密钥
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-8.0.gpg

添加 APT 仓库(Ubuntu 24.04 代号是 noble)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

更新软件包列表
sudo apt update

安装 mongosh(仅客户端)
sudo apt install -y mongodb-mongosh

验证安装并连接数据库
# 查看版本
mongosh --version

# 连接本地 MongoDB(默认端口 27017)
mongosh
mongosh "mongodb://localhost:27017"

然后操作

# 连接一个实例
./mongo --port 27017
# 配置主节点信息
rsconf = {_id: "costom_name", members: [ { _id: 0, host: "127.0.0.1:27017" } ] }
# 使用rs进行初始化配置
rs.initiate( rsconf )
# 加入从节点
rs.add("127.0.0.1:27018")
# 加入从节点
rs.add("127.0.0.1:27019")
# 查看节点信息
rs.status()
# 从节点可读
rs. secondaryOk()

# 删除从节点
rs.remove("127.0.0.1:27019")

开始事务

Mongo使用事务的条件

在SpringBoot的启动类中配置数据源的事务管理方式

@Bean
public MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) {
    return new MongoTransactionManager(dbFactory);
}

然后就可以使用@Transactional进行事务的管理,如果单纯只是用事务,只搭建两个实例即可

安装方式

下载6.x的安装包,在服务器上解压,然后拷贝一份,不使用账号的情况下搭建副本集,需要注意未成功副本集无法连接

副本集开启授权

# 第一步:生成密钥
openssl rand -base64 741 > keyfile
chmod 400 keyfile
# 第二步:开启授权和配置密钥
# 是否认证
auth = true
# 共享密钥文件
keyFile = /usr/mongo/keyfile

注意授权开启和关闭需要将认证开关和密钥路径同时注释

以下内容为个人安装步骤

版本选择

mongo4.x的版本直接杀进程后启动将出现问题,而mongo5.x没有这个问题 mongO6.x移除了mongo命令,需要手动下载 综合下来使用mongo5.x的最后一个版本5.0.17

副本集搭建步骤

将压缩包上传至/usr/mongo,然后执行以下操作

# 解压
tar -zxvf mongodb-linux-x86_64-rhel80-5.0.17.tgz
# 拷贝一份
cp -r mongodb-linux-x86_64-rhel80-5.0.17 mongo-1
# 重命名一份
mv mongodb-linux-x86_64-rhel80-5.0.17 mongo-2
# 创建相应的文件夹
mkdir -p /usr/mongo/mongo-1/data
mkdir -p /usr/mongo/mongo-1/logs
mkdir -p /usr/mongo/mongo-2/data
mkdir -p /usr/mongo/mongo-2/logs

在两份实例的bin目录下创建mongo.conf文件,先不要开启认证,记得修改对应数据和日志存放位置,还有端口

# 数据文件存放位置
dbpath = /usr/mongo/mongo-1/data
# 日志文件存放位置
logpath = /usr/mongo/mongo-1/logs/mongodb.log
# 端口
port = 27017
# 以守护程序的方式启用,即在后台运行
fork = true
# 所有IP可连接,也可以指定IP,用英文逗号分隔
bind_ip = 0.0.0.0
# 日志输出方式(写日志的模式:设置为true为追加,默认是覆盖。如果未指定此设置,启动时MongoDB的将覆盖现有的日志文件)
logappend = true
# 是否认证
auth = false
# 共享密钥文件
# keyFile = /usr/mongo/keyfile
# 副本集
replSet=name

复制一份配置文件到第二个实例:cp mongo.conf ../../mongo-2/bin/,记得修改端口、数据库、日志位置,然后启动两个实例并配置

# 启动命令
./mongod -f mongo.conf
# 查看端口
netstat -ntulp | grep 2701
# 进入第一个实例文件夹
cd /usr/mongo/mongo-1/bin/
# 连接27017端口
./mongo --port 27017
# 配置主节点信息,name要对应
rsconf = {_id: "name", members: [ { _id: 0, host: "127.0.0.1:27017" } ] }
# 使用rs进行初始化配置
rs.initiate( rsconf )
# 加入从节点
rs.add("127.0.0.1:27018")
# 从节点可读
rs. secondaryOk()
# 查看节点信息
rs.status()

使用Robo3t进行连接两个实例,查看是否正常,然后创建一个数据库一个表,检查两个实例是否同步 使用Robo3t在指定数据库上加一个用户,勾选userAminreadWritedbAdmin

没有问题后关闭两个实例,并生成一份密钥

# 第一步:生成密钥
openssl rand -base64 741 > /usr/mongo/keyfile
# 文件可访问,此步骤不可缺少
cd /usr/mongo/
chmod 400 keyfile

然后将两个实例的配置文件中的认证开启,打开共享密钥注释,再重新启动两个实例

副本集
常用架构
实例角色类型
配置
至少3个实例
开始事务
安装方式
副本集开启授权
以下内容为个人安装步骤
版本选择
副本集搭建步骤