民工兄MongoDB教程:MD集群安装配置实践
MongoDB副本集介绍
MongoDB的副本集是主从复制。由于3.0版本之前就有主从复制,所以后来进行了更新、复制,命名为副本集。
一个副本集必须至少有3台机器,一台主节点和一两个从节点。如果机器数量为偶数,则必须安装决策节点,否则会导致集群选择异常。
副本集是由一个主(主)服务器和多个备份(辅助)服务器组成的 MongoDB 实例集群。复制将数据更新从主实例移动到其他实例。经过一定的延迟后,每个 MongoDB 实例都会维护数据集的相同副本。通过维护冗余数据库副本,可以实现外部数据备份、读/写分离和自动故障转移。
从节点登录数据后,无法查看数据。要查看集群信息,必须执行rs.slaveOK()。
副本集角色:
- 主节点
- 负责读写
- 副本节点
- 默认同步主节点 ♶不可读 位 不可读 不需要且不存储数据参加选举,投票即可
副本池架构图:
集群只有2个,必须使用仲裁节点准备
由于服务器有限,每台机器安装多个实例即可实现副本池。部署三个mongodb节点,IP地址相同,只需更改端口号即可。
设计库
[mongo@mongodb-1 ~]$ mkdir /data/mongodb_cluster/mongodb_2{6,8,9}017/{conf,data,pid,logs}
[mongo@mongodb-1 ~]$ tree -d /data/mongodb_cluster/ -L 1
/data/mongodb_cluster/
├── mongodb -> mongodb-linux-x86_64-4.0.14/
├── mongodb_26017
├── mongodb_27017
├── mongodb_28017
├── mongodb_29017
└── mongodb-linux-x86_64-4.0.14
6 directories

创建节点配置文件
创建配置文件后复制到两个节点并用sed命令替换
#1.创建26017节点配置文件
[mongo@mongodb-1 ~]$ vim /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml
systemLog:
destination: file
logAppend: true
path: /data/mongodb_cluster/mongodb_26017/logs/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongodb_cluster/mongodb_26017/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /data/mongodb_cluster/mongodb_26017/pid/mongod.pid
net:
port: 26017
bindIp: 127.0.0.1,192.168.81.210
replication:
oplogSizeMB: 1024
replSetName: mongo-rs
#2.将配置文件复制到其他两个节点
[mongo@mongodb-1 ~]$ cp /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml /data/mongodb_cluster/mongodb_28017/conf/
[mongo@mongodb-1 ~]$ cp /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml /data/mongodb_cluster/mongodb_29017/conf/
#3.替换端口号
[mongo@mongodb-1 ~]$ sed -ri 's#26017#28017#g' /data/mongodb_cluster/mongodb_28017/conf/mongodb.yml
[mongo@mongodb-1 ~]$ sed -ri 's#26017#29017#g' /data/mongodb_cluster/mongodb_29017/conf/mongodb.yml
重启所有节点❓初始化成功然后反复回车即可看到集群中每个节点的名称更改

检查集群状态
mongo-rs:PRIMARY> rs.status()
mongo-rs:PRIMARY> rs.status()
集群名称 插入集群节点数据检查集群可用性
1.将数据插入主数据库
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"json","age":27,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bobo","age":27,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"lei","age":28,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bug","age":28,"ad":"北京市朝阳区"})
mongo-rs:PRIMARY> db.user_info.insertOne({"name":"bobo","age":28,"ad":"北京市朝阳区","sex":"null"})
2。查看从库数据
#1.直接查数据会报错
mongo-rs:SECONDARY> show dbs
2021-02-17T13:25:50.425+0800 E QUERY [js] Error: listDatabases failed:{
"operationTime" : Timestamp(1613539548, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1613539548, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
} :
#2.执行rs.slaveOK命令
mongo-rs:SECONDARY> rs.slaveOk()
#3.执行完即可查询
mongo-rs:SECONDARY> db.user_info.find()

永久解决从库每次检查数据时报错的问题
rs.slaveOk 命令只能在当前会话中使用,注销重新登录时需要使用。再次运行它。
可以在admin用户主目录下的mongodb.js文件中输入rs.slaveOk即可永久生效。
MongoDB副本集故障转移模拟
故障转移模拟
只要关闭主库,观察从库状态即可
mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_26017/conf/mongodb.yml --shutdown
killing process with pid: 19938
主库下线后,其中一个从库成为从库。立即主数据库
主目录重置并再次成为主目录目录再次成为主目录或让现有的主目录再次成为主目录。程序自动降级库,因此恢复的主库又成为主库。 2. 从目录改变优先级,主目录成为主目录 如果优先级设置成功,则设置的从节点成为主目录 
当主目录上线时,优先级设置为默认
当主数据库重新上线后,必须将优先级设置回原来的默认值,否则下次选举将会失败。
在主数据库上工作 删除集群节点
#1.删除一个节点
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.remove("192.168.81.210:25017")
{
"ok" : 1,
"operationTime" : Timestamp(1613544442, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1613544442, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#2.查看是否删除
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B2 '25017' -A12

删除后查看节点状态
如果节点从集群中删除,则默认为其他状态
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:25017
mongo-rs:OTHER> exit
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml --shutdown

添加/删除仲裁节点 角色quorum是master来选择数据库的。如果集群节点数为偶数,则添加仲裁节点 安装节点
添加仲裁节点需要安装 mongodb 节点。这里直接使用节点25017。删除数据文件并重新启动以创建新节点
#1.删除25017节点数据文件
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml --shutdown
[mongo@mongodb-1 ~]$ rm -rf /data/mongodb_cluster/mongodb_25017/data/*
#2.启动节点
[mongo@mongodb-1 ~]$ mongod -f /data/mongodb_cluster/mongodb_25017/conf/mongodb.yml
添加新的仲裁节点
#1.添加仲裁节点
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.addArb("192.168.81.210:25017")
{
"ok" : 1,
"operationTime" : Timestamp(1613544974, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1613544974, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
#2.查看仲裁节点是否添加成功
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017 --eval "rs.status()" | grep -B2 '25017' -A12
#3.登陆仲裁节点查看状态
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:25017
mongo-rs:ARBITER>

删除仲裁节点
仲裁节点与副本节点相同。当集群被删除时,它会进入另一种状态。
[mongo@mongodb-1 ~]$ mongo 192.168.81.210:26017
mongo-rs:PRIMARY> rs.remove("192.168.81.210:25017")
{
"ok" : 1,
"operationTime" : Timestamp(1613545186, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1613545186, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}

版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。