0、安装前环境准备
① 本篇是基于Linux操作系统中的安装,副本集的演示基于1主2副,故先准备3个已经安装好MongoDB服务的Linux操作系统(MongoDB在Linux系统下的安装可以参考之前我写的这篇教程:【软件安装】MongoDB在Linux系统中的安装_FeenixOne的博客-CSDN博客0、安装前环境准备① 本篇是基于Linux操作系统中的安装,故先准备一个干净的Linux操作系统。本文中所有的操作基于CentOS8进行安装演示;② 确保Linux系统中已经安装[wget],用于下载MongoDB软件。如果没有安装,可以使用[yum install wget -y]进行安装;③ 接下来的演示文本中,红色字体为操作步骤,黑色字体为解释说明。1、进入到本地MongoDB目录,从官网下载MongoDB压缩包到本地cd /usr/local/mkdir sourcecdhttps://blog.csdn.net/FeenixOne/article/details/120527835只要你跟着我教程里的步骤去做,就一定能够安装好MongoDB服务)。本文中所有的操作基于CentOS8进行安装演示;
③ 接下来的演示文本中,红色字体为操作步骤,黑色字体为解释说明。
1、修改MongoDB配置文件
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb
# where and how to store data
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process run
processManagement:
fork: true
# pidFilePath:
# timeZoneInfo:
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
replication:
replSetName: rs0
# security:
# operationProfiling:
# sharding:
# Enterprise-Only Options:
# auditLog:
# snmp:
# mp:
这里有两点事项需要注意:
① replication: replSetName: rs0,这个参数开启MongoBD的副本集,并且同一副本集中的 replSetName 值必须一致;
② bindIp 最好设置成0.0.0.0,一般副本集搭建完以后难免会有非本机的客户端连接过来。
2、启动MongoDB服务
service mongod start
3、启动MongoDB客户端
mongo –port 27017
4、初始化MongoDB副本集
将单机版的MongoDB服务变为集群需要进行初始化,告诉MongoDB服务器不再是单机了,而是以副本集的形式运行:
rs.initiate({_id:”rs0″,
members:[{_id:0, host:”192.168.159.131:27017″},
{_id:1, host:”192.168.159.132:27017″},
{_id:2, host:”192.168.159.133:27017″}]})
显示 { “ok” : 1 } 以后,执行 rs.status() 查看副本集状态
注:在MongoDB4包括以前的版本中,可以直接执行rs.initiate()命令无参初始化副本集,初始化完成之后再通过rs.add()命令逐一添加各成员进副本集。但是从MongoDB5开始,对副本集的命令有了不一样的要求,初始化副本集的时候需要在rs.initiate()命令中以参数形式指定好副本集中的各成员,如果使用无参的命令直接初始化副本集,再使用rs.add() 添加成员,日志会打印【Did not find local replica set configuration document at startup】错误信息,并且查看副本集状态时,会发现add进来的成员stateStr值是startup,并一直不会改变。这个坑极其隐蔽,而且一旦踩了很难发现陷进去了,因为命令上并不会给你报任何的错误。
5、验证MongoBD副本集是否搭建成功
在 PRIMARY 中插入几条数据:
启动另外两台 SECONDARY 客户端:
mongo –port 27017
可以看到命令行直接就提示本机是副本集中的 SECONDARY,同意副本集中的数据是同步一致的,查询一下刚刚 PRIMARY 中插入的数据
副本集都已经搭建成功了,为什么查询不到数据呢?难道副本集搭建失败?别慌张,这是MongoDB副本集的默认设置,默认副本集的 SECONDARY 不可以读取数据,执行命令:
rs.secondaryOk()
就可以在 SECONDARY 中查询副本集中的数据
注:MongoDB4及以前使用的命令是 rs.slaveOk(),MongoDB5以后改成了 rs.secondaryOk(),不过这个命令的改动问题不大,因为执行 rs.slaveOk() 之后会自动提示已被废弃。
读可以读,那么可以写入数据吗?
依然是不可以的,其实MongoDB官方建议副本集中的 SECONDARY 不要用来写入数据,只用来查询数据即可。PRIMARY 负责写入,SECONDARY 负责查询,这样才能最大化分摊整个副本集的流量压力。
关闭 PRIMARY MongoDB服务,模拟 PRIMARY 宕机:
其中一台 SECONDARY 立马切换到 PRIMARY 接替主机的位置。
而值得注意的是,当原来的 PRIMARY 再次启动后,就会由 PRIMARY 降级为 SECONDARY,并且此时的 SECONDARY 是无法查询数据的,必须再次手动执行 rs.secondaryOk() ,从新的 PRIMARY 那边同步最新的数据过来后,方可执行副本集数据的查询
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/111939.html