MongoDB副本集与事务
图
MongoDB副本集是MongoDB的一种高可用性部署方案。它通过将数据在多个服务器上进行复制,使得即使其中一个服务器发生故障,其他服务器仍然可以继续提供服务。在MongoDB副本集中,每个副本集都包含一个主节点和多个从节点

副本集

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

# 连接一个实例
./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使用事务的条件

  • MongoDB版本高于等于4.0
  • MongoDB部署使用了副本集或分片

在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

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