早期的版本使用master-slave,一主一从和mysql类型,但slave在此架构中为只读,如果主库宕机后,从库不能自动切换为主 需要手动才行
后期mongodb开发了个新的架构方案副本集,所以呢,目前已经淘汰master-slave的架构 改为可副本集,这种模式有一个主(primary),和多个从(secondary),只读,给他们设置权重,当主宕掉后,权重最高的从切换为主。其他从会自动识别新的主
在次架构还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据,它清楚的告诉是否有问题,防止脑裂问题
在此架构中读写数据都是在主上,如果想实现负载均衡的目的需要手动指定读库的目标server
副本集搭建:
我有三台机器分别是192.168.191.21 192.168.191.22 192.168.191.23 其中21为主 22 23为从
1,首先三台机器分别安装mongodb
参照我之前安装mongodb的方法
cd /etc/yum.repos.d
vim mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
yum install -y mongodb-org
2,三台机器编辑配置文件
vim /etc/mongod.conf
找到replication 删除# 然后在replication下面 写上如下俩行 记得前面有俩个空格
replication
oplogSizeMB: 20 //类似mysql binlog 20M
replSetName: sonice //副本集的名称
找到bindIp后面的127.0.0.1加上本机的内网ip 21,22,23
3,分别重启三台机器
systemctl restart mongod
4,连接主,在主上运行命令mongo
use admin
config={_id:”sonice”,members:[{_id:0,host:”192.168.191.21:27017″},{_id:1,host:”192.168.191.22:27017″},{id:2,host:”192.168.191.23:27017″}]}
// 其中sonice为副本集的名称 ,id为0的 是 主 其他id为1和2的是从
5,初始化
rs.initiate(config) //返回ok:1为正确
配置完之后 使用rs.status() 查看副本集的状态
如果俩个从上的状态为”stateStr”:”STARTUP”,则重新配置一遍即可
再次使用rs.status() 会发现从的状态变为SECONDARY 主的状态为STARTUP
mongodb的权重设置
使用rs.config 查看三台机器的priority 权重都是 1
更改他们的权重 ,设置一个变量 用索引的方式 来设置权重
首先进入主的mongo里面 执行下面5行操作
cfg = rs.config()
cfg.members[0].priority = 3
cfg.members[0].priority = 3
cfg.members[0].priority = 3
rs.reconfig(cfg)
这样设置下来 用rc.status() 可以看到21的主上机器权重为3 22的权重为2 23的权重为1
这样 当21宕了 会优先跳到22上 , 当21恢复后又跳回21为主了