下载
- https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.21-rc0.tgz
- 说明:因为mongodb6.0以后调整了mongo命令行的方式,所以为了看到教程,暂时采用mongo的5.0版本
- 通过rz 上传到linux服务器上
- 完整的mongo下载链接:https://www.mongodb.com/download-center/community/releases
配置
- 解压tgz文件
- tar zxvf mongodb-linux-x86_64-rhel70-3.6.3.tgz
启动
-
方法1:
- 启动三个实例出来
- /home/mongodb/mongodb/bin/mongod --replSet rs --dbpath /data/mongodb/rs1 --port 27017 --fork --logpath ./rs1/mongod.log --bind_ip_all
- /home/mongodb/mongodb/bin/mongod --replSet rs --dbpath /data/mongodb/rs2 --port 27018 --fork --logpath ./rs2/mongod.log --bind_ip_all
- /home/mongodb/mongodb/bin/mongod --replSet rs --dbpath /data/mongodb/rs3 --port 27019 --fork --logpath ./rs3/mongod.log --bind_ip_all
- 查看端口情况:netstat -anop | grep 2701
- 方案不可行,不考虑
-
方法2(本次采用的是方法2):
- 创建三个目录 mkdir rs{1,2,3}
- 分别创建三个conf文件,如下:
systemLog: destination: file path: c:\data1\mongod.log # 日志文件路径 logAppend: true storage: dbPath: c:\data1 # 数据目录 net: bindIp: 0.0.0.0 port: 28017 # 端口 replication: replSetName: rs0
- 分别执行:mongod -f c:\data1\mongod.conf
- 使用netstat -nalp|grep 2801 查看端口的监听情况
-
遇到的问题
- 1.在执行mongod 指令的时候报错:“code”:9001,“codeName”:“SocketException”,“errmsg”:“setup bind :: caused by :: Address already in use” 和问题.{“code”:26,“codeName”:“NamespaceNotFound” 执行一个实例的时候有这样的报错
- 原因是:用错了指令,应该用mongo来启动,而不是使用mongod来启动
- 参考:https://developer.aliyun.com/article/851136
- 2.按照1的方式设置了mongo启动,并且创建了主从节点的设置,实际是没有生效的,错误信息是:mongo “codeName” : “NotYetInitialized”
- 使用下面的方法设置就是成功的
> use admin > config={ _id:'abcops_repl', members:[ {_id: 0, host: '10.211.55.12:27017',priority:2}, {_id: 1, host: '10.211.55.12:27018',priority:1}, {_id: 2, host: '10.211.55.12:27019',arbiterOnly:true}, ] } > rs.initiate(config)
- 1.在执行mongod 指令的时候报错:“code”:9001,“codeName”:“SocketException”,“errmsg”:“setup bind :: caused by :: Address already in use” 和问题.{“code”:26,“codeName”:“NamespaceNotFound” 执行一个实例的时候有这样的报错
-
说明:
- 从mongo6.0开始取消了对mongo的命令行支持,而改用了一个新的方式 MongoDB Shell
- 具体的mongodb shell下载路径是:https://www.mongodb.com/try/download/shell
- 从mongo6.0开始取消了对mongo的命令行支持,而改用了一个新的方式 MongoDB Shell
设置
- 使用命令mongo --port 28017 进入mongo的命令控制台
- 注意,在mongo6.0版本之后,不是使用mongo进入,而是另外一个工具来处理了
- 执行如下的指令:
> use admin > config={ _id:'abcops_repl', members:[ {_id: 0, host: '10.211.55.12:27017',priority:2}, {_id: 1, host: '10.211.55.12:27018',priority:1}, {_id: 2, host: '10.211.55.12:27019',arbiterOnly:true}, ] } > rs.initiate(config)
- 命令执行后
- db.isMaster() 判断是否是主节点
- rs.conf() 查看集群中的成员配置
- rs.status() 查看集群成员的状态
- rs.add(“10.211.55.12:27020”) 增阿一个新节点
- rs.addArb(“10.211.55.12:27020”) 增阿一个新的仲裁节点
- rs.remove(“10.211.55.12:27020”) 删除一个节点
- rs.slaveOk() 允许在副本节点上进行查询,设置之后才能查看主节点复制过来的数据
- db.createUser 增加一个用户
- 命令执行后
测试
- 登录主测试节点
use test
db.test.insert({age:34, name:"admin"})
- 登录从测试节点
rs.slaveOk()
use test
db.test.find()
- 即可看到具体的数据已经在从库中有展示了
- 验证数据的正确性
- 在构建分布式的集群的时候,发现添加一个集群是失败了,原因是没有关闭防火墙导致,需要开放防火墙的端口
- 具体的参考网站:Centos7关闭防火墙步骤:
关闭mongod
- 通过mongo 进入命名行
- 使用命令如下:
- use admin
- db.shutdownServer()
- 主从复制集的关闭时,如果关闭了主节点,则其他节点就会重新选举一个新的从节点为主节点
- 复制集节点的关闭流程
- 在关闭第二个主节点的时候,报错No electable secondaries caught up,说明已经没有再关闭这个副本集了
- 暂时还没有发现有什么特别好的方式关闭整个的副本集,后续发现了再补充
- 我的关闭副本集的操作是:
- 1.关闭第一个主节点
- 2.关闭一个arbitra 仲裁节点
- 3.此时最后一个节点就从主节点退化成了从节点,使用上面的命令关掉即可
参考链接
- MongoDB高可用部署架构——复制集篇
- MongoDB复制集集群原理详解及部署
- 介绍了一下关于mongo的一些指令,如如何创建副本集,如何验证副本集是有效的,如何进行权限设置
- rs.stepDown()