搭建 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 passwordroles: [{ role: "root", db: "admin" }]}
)
这里是为了演示,实际密码不能设置那么简单
2、创建测试用户
创建测试数据库 test ,命令如下:
use test
创建测试用户 test ,命令如下:
db.createUser({user: "test",pwd: "123456", // or cleartext passwordroles: [{ 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.keyFilekeyFile: /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设置仅适用于mongoddbPath: /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.0processManagement:#启用在后台运行mongos或mongod进程的守护进程模式。fork: truesecurity:# 开启登录认证authorization: enabled# 同时开启了 验证(用户名密码)和 副本集(replica sets),需要添加 security.keyFilekeyFile: /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设置仅适用于mongoddbPath: /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.151processManagement:#启用在后台运行mongos或mongod进程的守护进程模式。fork: truereplication: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设置仅适用于mongoddbPath: /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.151processManagement:#启用在后台运行mongos或mongod进程的守护进程模式。fork: truereplication: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.keyFilekeyFile: /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.keyFilekeyFile: /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条数据,成功回滚。