1、MongoDB集群之复制集
1.1、简介
- Mongogdb至少需要两个节点,其中一个是主节点,负责处理客户端请求,其余的都从节点,负责复制主节点上的数据
- 建议提供仲裁节点,此节点不存储数据,作用是当主节点出现故障时,选举出某个备用节点作为主节点,保证Mongodb的
- 正常服务。客户端只需要访问主节点或从节点,不需要访问仲裁节点。
- Mongodb各个节点觉的搭配方式:一主一从一仲裁,一主多从一仲裁, 一主多从多仲裁
- 主节点记录要在其上的所有操作oplog(操作日志), 从节点定期轮询主节点获取这些操作,然后对自己的副本执行这些操作
- 从而保证从节点的数据和主节点保持一致
1.2 复制3份mongodb安装文件(我使用的是编译好的,直接复制就能使用使用版本3.6.8)
配置文件
# fork=true # 启动子进程(也就是后台启动)
dbpath=D:\mongodb\mongodb-3.6.8\data # 数据存放的路径
logpath=D:\mongodb\mongodb-3.6.8\log\mongod.log # 日志存放的路径
logappend=true # 日志以追加的方式记录
bind_ip_all=true # 允许任何人或ip访问
bind_ip=0.0.0.0
port=27117 # 端口
replSet=rs # 集群名(所有在这个集群里面的都得是一个名称(自己随意取))
# pidfilepath=/usr/local/mongodb/pids/rs/primary.pid # 进程id存放的路径文件(文件名自动生成)
# oplogSize=1000 # 日志的大小(M)
# directoryperdb=true # 为true时表示每个数据库中的数据都分另放在对应的目录中,而不是一股脑的全放在一个目录中
启动节点
自己做的bat文件
D:\mongodb\mongodb-3.6.8\bin\mongod.exe -f D:\mongodb\mongodb-3.6.8\conf\mongod.conf
使用mongo命令进入主节点
> use admin
>rs.initiate(
{
_id: "rs",
members: [
{ _id : 0, host : "192.168.1.55:27017","priority": 3 }, # priority表示优先级 谁优先级高仲裁就选谁为主节点,如果优先级一样,仲裁随机选举,如果有多个仲裁就投票选举
{ _id : 1, host : "192.168.2.210:27017","priority": 2 },
{ _id : 2, host : "192.168.2.210:27018","arbiterOnly": true } # 仅仅是仲裁
]
}
)
出现以下内容表示集群配置成功
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1607434424, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1607434424, 1)
}
> rs.isMaster() # 查看集群节点的信息
rs.isMaster()输入后节点名称也变了
其他节点不需要配置命令,直接isMaster()就可以看到配置信息
当我们关闭主节点后,查询从节点可以看到标识已经改变:
集群搭建好后的注意事项:
默认情况下直接连接从节点是无法查询数据的(db.集合名称.find()报错)。因为从节点是不可读的。如果需要在从节点上读取数据,
则需要在从节点控制台输入命令rs.slaveOk(true|false)来设置。rs.slaveOk()或rs.slaveOk(true)代表可以在从节点上做读操作,
rs.slaveOk(false)代表不可以在从节点上做读操作。
slaveOk()函数已经过时,推荐使用的是db.getMongo().setReadPref("nearest")来设置读操作。此函数在secondary节点中执行。参数
可选值包括:primary(主节点读)、primaryPreferred(优先主节点中读)、secondary(从节点读)、 secondaryPreferred(优先从节点中读)、nearest(在最近的节点中读)。
参考:https://www.cnblogs.com/xiongfanyong/articles/14100171.html