副本集
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在指定数据库上加一个用户,勾选userAmin
、readWrite
、dbAdmin
没有问题后关闭两个实例,并生成一份密钥
# 第一步:生成密钥
openssl rand -base64 741 > /usr/mongo/keyfile
# 文件可访问,此步骤不可缺少
cd /usr/mongo/
chmod 400 keyfile
然后将两个实例的配置文件中的认证开启,打开共享密钥注释,再重新启动两个实例