错误信息:sessions are not supported by the mongodb cluster to which this client is connected
在springboot2.x集成MongoDB 4.4 版本插入数据时报错,通过百度查找MongoDB 单节点不支持事物导致,通过研究在Linux环境下mongoDB 4搭建(副本集模式)就可以解决问题。
环境
Ubuntu 5.4.0-6ubuntu1~18.04.5
mongodb-linux-x86_64-rhel80-4.4.6.tgz
安装MongoDB:【原文链接】https://www.cnblogs.com/bubbleboom/p/14167409.html
创建主节点
建立存放数据和日志的目录
主节点
mkdir -p /home/admin/mongodb/replica_sets/rs_27017/log
mkdir -p /home/admin/mongodb/replica_sets/rs_27017/data/db
修改配置文件
vim /home/admin/mongodb/replica_sets/rs_27017/mongod.conf
代码如下:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/home/admin/mongodb/replica_sets/rs_27017/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
dbPath: "/home/admin/mongodb/replica_sets/rs_27017/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/home/admin/mongodb/replica_sets/rs_27017/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: localhost,127.0.0.1
port: 27017
replication:
#副本集的名称
replSetName: kwz_rs
启动节点服务:MongoDB安装路径(/usr/local/mongodb/bin/mongod)
/usr/local/mongodb/bin/mongod -f /home/admin/mongodb/replica_sets/rs_27017/mongod.conf
创建副本级节点
mkdir -p /home/admin/mongodb/replica_sets/rs_27018/log
mkdir -p /home/admin/mongodb/replica_sets/rs_27018/data/db
修改配置文件
vim /home/admin/mongodb/replica_sets/rs_27018/mongod.conf
代码如下:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/home/admin/mongodb/replica_sets/rs_27018/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
dbPath: "/home/admin/mongodb/replica_sets/rs_27018/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/home/admin/mongodb/replica_sets/rs_27018/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: localhost,127.0.0.1
port: 27018
replication:
#副本集的名称
replSetName: kwz_rs
启动节点服务:
/usr/local/mongodb/bin/mongod -f /home/admin/mongodb/replica_sets/rs_27018/mongod.conf
创建仲裁节点
mkdir -p /home/admin/mongodb/replica_sets/rs_27019/log
mkdir -p /home/admin/mongodb/replica_sets/rs_27019/data/db
修改配置文件
vim /home/admin/mongodb/replica_sets/rs_27019/mongod.conf
代码如下:
systemLog:
#MongoDB发送所有日志输出的目标指定为文件
destination: file
#mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
path: "/home/admin/mongodb/replica_sets/rs_27019/log/mongod.log"
#当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾
logAppend: true
storage:
#mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
dbPath: "/home/admin/mongodb/replica_sets/rs_27019/data/db"
journal:
#启用或禁用持久性日志以确保数据文件保持有效和可恢复。
enabled: true
processManagement:
#启用在后台运行mongos或mongod进程的守护进程模式。
fork: true
#指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
pidFilePath: "/home/admin/mongodb/replica_sets/rs_27019/log/mongod.pid"
net:
#服务实例绑定的IP
bindIp: localhost,127.0.0.1
port: 27019
replication:
#副本集的名称
replSetName: kwz_rs
启动节点服务:
/usr/local/mongodb/bin/mongod -f /home/admin/mongodb/replica_sets/rs_27019/mongod.conf
初始化配置副本集和主节点
用客户端连接主节点(27017)
/home/admin/usr/local/mongodb/bin/mongo --host=localhost --port=27017
连接成功之后,许多命令不能用,需要初始化副本集才行,使用默认的配置来初始化副本集:
命令:rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "localhost:27017",
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(100601049270, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1006010049270, 1)
}
“ok”的值为1则说明创建成功
添加副本从节点
将27018的副本节点添加到副本集中:
kwz_rs:PRIMARY> rs.add("localhost:27018")
{
# 说明添加成功
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(15852365226, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(15852365226, 1)
}
此时再次查看副本集状态:rs.status()
添加仲裁从节点
将27019作为仲裁节点,添加到副本集中:
kwz_rs:PRIMARY> rs.addArb("localhost:27019")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1242345451541, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1242345451541, 1)
}
查看副本节点状态:rs.status()
登陆27017主节点,进行写入和读取数据操作:
/home/admin/usr/local/mongodb/bin/mongo --host localhost --port 27017
登陆27018从节点,进行写入和读取数据操作
/home/admin/usr/local/mongodb/bin/mongo --host localhost --port 27018
show dbs
发现不能读取集合的数据,有个"errmsg" : “not master and slaveOk=false”,可见当前节点只是数据的一个备份,不是slave节点,无法读取数据
设置读操作权限,允许从成员上进行读的操作:rs.slaveOk()或者rs.slaveOk(true)