MongoDB的副本集就是主从复制,由于之前3.0版本之前就有主从复制的说法,后来更新迭代,起名叫副本集
副本集建议最少3台机器,一个主及诶单,两个从节点,如果是偶数台机器,需要在部署一个仲裁节点,否则会这导致集群选举异常
副本集(Replica Set)是一组MongoDB实例组成的集群,由一个主(Primary)服务器和多个备份(Secondary)服务器构成。通过复制(Replication),将数据的更新由Primary推送到其他实例上,在一定的延迟之后,每个MongoDB实例维护相同的数据集副本。通过维护冗余的数据库副本,能够实现数据的异地备份,读写分离和自动故障转移
从节点登陆数据后,无法查看数据,需要执行rs.slaveOK()之后才可以查看集群信息
主节点
负责读写
副本节点
同步主节点 shell下连接默认不可读
仲裁节点
不是必须的,不存储数据,也不参与竞选,只投票
以/opt/Mongo+端口号为单机多实例存放目录
[root@localhost mongo_clusetr]# mkdir -p /opt/mongo_clusetr/mongodb_2801{7,8,9}/{conf,logs,pid}
vim /opt/mongo_clusetr/mongodb_28017/conf/mongodb.yml
systemLog:
destination: file
logAppend: true
path: /opt/mongo_clusetr/mongodb_28017/logs/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_clusetr/mongodb_28017/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_clusetr/mongodb_28017/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,192.168.40.4
reclication:
oplogSizeMB: 1024
replSetName: dba1
2.3.创建其他两个配置文件
[root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28018/conf/
[root@localhost mongo_clusetr]# cp mongodb_28017/conf/mongodb.yml mongodb_28019/conf/
修改端口号
[root@localhost mongo_clusetr]# sed -i 's#28017#28108#g' /opt/mongo_clusetr/mongodb_28018/conf/mongodb.yml
[root@localhost mongo_clusetr]# sed -i 's#28017#28109#g' /opt/mongo_clusetr/mongodb_28019/conf/mongodb.yml
[root@localhost mongo_clusetr]# mkdir /data/mongo_clusetr/mongodb_2801{7,8,9}
启动第一个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28017/conf/mongodb.yml
启动第二个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28018/conf/mongodb.yml
启动第三个节点
[root@localhost mongo_clusetr]# mongodb/bin/mongod -f mongodb_28019/conf/mongodb.yml
[root@localhost mongo_clusetr]# netstat -anpt |grep 2801
tcp 0 0 192.168.40.4:28017 0.0.0.0:* LISTEN 12177/mongodb/bin/m
tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN 12177/mongodb/bin/m
tcp 0 0 192.168.40.4:28018 0.0.0.0:* LISTEN 12639/mongodb/bin/m
tcp 0 0 127.0.0.1:28018 0.0.0.0:* LISTEN 12639/mongodb/bin/m
tcp 0 0 192.168.40.4:28019 0.0.0.0:* LISTEN 13021/mongodb/bin/m
tcp 0 0 127.0.0.1:28019 0.0.0.0:* LISTEN 13021/mongodb/bin/m
定义副本集群
config = {
_id : "dba1",
members : [
{_id : 0, host : "db:28017"},
{_id : 1, host : "db:28018"},
{_id : 2, host : "db:28019"},
] }
使副本集群生效
rs.initiate(config)
查看副本集状态
rs.status()
输入之后直接生效,直接变成主库
登录主库
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28017
查看当前所在库和表
dba1:PRIMARY> db
test
dba1:PRIMARY> show tables
在主库写入数据
dba1:PRIMARY> db.te.insert({"name":"zhang","age":10})
WriteResult({ "nInserted" : 1 })
在主库查看数据
dba1:PRIMARY> db.te.find()
{ "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
{ "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11
可以看到主库是可以正常插入数据的,但是从库不能读不能写入数据
副本集默认是只能复制但是不能读写的
dba1:SECONDARY> show tables
2022-11-12T17:18:03.351+0800 E QUERY [thread1] Error: listCollections failed: {
"operationTime" : Timestamp(1668244677, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1668244677, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
这个是MongoDB库的一种保护机制,下面我们来解决这个问题。
但是每次登陆都需要只用这个命令。
解决方法
rs.slaveOK();
执行命令
dba1:SECONDARY> rs.slaveOk();
WARNING: slaveOk() is deprecated and may be removed in the next major release. Please use secondaryOk() instead.
然后我们就可以正常的查看数据了
dba1:SECONDARY> db.te.find()
{ "_id" : ObjectId("636f63745a73f86992679cef"), "name" : "zhang", "age" : 10 }
{ "_id" : ObjectId("636f63be5a73f86992679cf0"), "name" : "gao", "age" : 11 }
如果不想每次登陆都使用这个命令
下面为大家提供方法
我的用户时root可以在数据库用户下找到.mongorc.js的隐藏文件
[root@localhost ~]# ls -la | grep .mongorc.js
-rw-------. 1 root root 0 Jul 25 16:57 .mongorc.js
在文件中写入内容
[root@localhost ~]# vim.mongorc.js
[root@localhost ~]# cat .mongorc.js
rs.slaveOK();
我们再次登陆数据库
可以看到不用再次输入命令可以直接查看
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
dba1:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
cat .mongorc.js
rs.slaveOK();
我们再次登陆数据库
可以看到不用再次输入命令可以直接查看
[root@localhost mongo_clusetr]# mongodb/bin/mongo db:28018
dba1:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB