背景

1)主要为了解决SpringBoot集成MongoDB的事务问题

2)实际使用还是要搭配分片以及副本集使用,不要仅使用副本集。

副本集的特点

1)主节点唯一

主节点唯一,但是不固定(不确定的原因是:主节点挂了的话,会重新选举出一个主节点)。

2)大多数原则

大多数原则,即1/2原则,一个复制集集群中,如果有大于等于1/2的节点不可用的话,那么整个进群将不可写,只可读(注:实际上应该是投票权重的1/2。

3)从库无法写入

从库无法写入,使用root权限也不行,这一点与MySQL不同,MySQL从库不能写入,原因是设置了readOnly。

4)副本集可以自动进行容灾

主节点服务不可用,会自动选举出新的主节点。

副本集节点介绍

1)数据节点-------主节点

主节点负责数据的读写操作,并把写的操作记录到OpLog中(mongo隐藏的库local的oplog集合)

2)数据节点-------从节点

复制主节点的数据,备份容灾用,主节点挂掉,会重新选举出新的主节点,从节点无法进行写操作,即使拥有root权限也不行(不同于MySQL)

3)投票节点

不负责数据的存储和复制,只负责投票。(注:理论上一个mongo复制集,可以有一个主节点,多个从节点,多个投票节点)

复制集工作方式

1)客户端驱动指向mongo数据库,写的时候只会在主节点上进行,写的信息会记录在oplog中,从节点根据oplog把写入操作复制到从节点上。

2)复制集异步操作,刷盘下效率或者网络问题影响下,从节点会有一定的延迟,所以读操作默认也是指向主节点,如果对实时性要求不高,可以配置指向从节点,实现读写分离。

副本集环境的搭建

1)基础条件

系统:Centos7.x

版本:mongo4.2.5

机器:单机多实例

角色分配: 

Primary

localhost:27000

主节点 负责读写

Secondary

localhost:27001

从节点,负责容灾,主节点挂掉,则从节点成为主节点

Arbiter

localhost:27002

投票节点,不负责数据的存储读写,存在的意义是,遵循下mongo复制集的1/2原则

2)搭建过程

1.下载安装包

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz

2.解压安装包

tar -zxvf  mongodb-linux-x86_64-rhel70-4.2.8.tgz

#修改文件解压后的文件名称
mv mongodb-linux-x86_64-rhel70-4.2.8 mongodb4.2.8

3.创建目录

cd mongodb4.2.8/

#在解压后的mongodb目录新建 data  log  config目录
mkdir data|mkdir log|mkdir config

在data和config目录分别创建rs1  rs2 rs3目录
cd data && mkdir rs1|mkdir rs2|mkdir rs3
cd config && mkdir rs1|mkdir rs2|mkdir rs3

4.创建实例启动配置

在config中的rs1 rs2 rs3分别增加mongod.cfg文件

touch mongod.cfg

#rs1配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs1        			 #mongo数据安装目录
logpath=/data/app/mongodb4.2.8/log/rs1.log    			 #日志打印的目录
journal=true                                             #数据是否故障恢复
port=27000                                               #端口
replSet=rs                                               #复制集名称
logappend=true                                           #复制集日志是以追加的方式进行
fork = true                                              #是否后台启动
bind_ip=0.0.0.0                                          #绑定主机


#rs2配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs2        			
logpath=/data/app/mongodb4.2.8/log/rs2.log    			 
journal=true                                             
port=27001                                               
replSet=rs                                               
logappend=true                                           
fork = true                                              
bind_ip=0.0.0.0


#rs3配置mongod.cfg
dbpath=/data/app/mongodb4.2.8/data/rs3        			 
logpath=/data/app/mongodb4.2.8/log/rs3.log    			 
journal=true                                             
port=27002                                               
replSet=rs                                               
logappend=true                                           
fork = true                                              
bind_ip=0.0.0.0

5.启动实例

#进入到mongodb家目录
cd mongodb4.2.8/

bin/mongod --config /data/app/mongodb4.2.8/config/rs1/mongod.cfg &
bin/mongod --config /data/app/mongodb4.2.8/config/rs2/mongod.cfg &
bin/mongod --config /data/app/mongodb4.2.8/config/rs3/mongod.cfg &

#检查实例启动情况
ps -ef|grep mongo

6.加入副本集集群

#使用命令行,进入到27000实例
bin/mongo -port 27000

#初始化一个副本集
rs.initiate()

#查看副本集状态命令
rs.conf()

#加入secondary节点
rs.add("localhost:27001")

#加入投票节点
rs.addArb("localhost:27002")

#查看副本集状态
rs.status()


#重要且必须, secondary节点允许读取操作在当前节点进行,否则从节点无法复制主节点的数据
#进入secondary实例
bin/mongo -port 27001
rs.slaveOk()

7.验证

1>验证数据复制

#主节点
use test
db.createCollection('user')
db.user.insert({'name':'james'})
 
#从节点
use test
show collections
db.user.find()

2>验证自动切换主节点

#关闭主节点实例
ps -ef|grep 27000
kill -2 进程号
 
#同时打开从节点,按几次回车会发现,从节点名称从secondary变成primary表示进行了自动切换节点

8.思考

主节点服务停掉后,secondary节点成为新的主节点,当主节点恢复后,之前的主节点将会变成secondary节点,有什么办法让他继续成为主节点呢?

#查看权重
rs.conf()

mongodb副本集配置ssl springboot mongodb副本集_mongodb

修改权重后再次查看权重:

cfg = rs.conf();
cfg.members[0].priority = 2;
rs.reconfig(cfg);
 
rs.conf()

mongodb副本集配置ssl springboot mongodb副本集_数据_02

按几次回车键,神奇的发现

这时会发现之前的主节点再次成为主节点,成为主节点的secondary再次变成secondary

mongodb副本集配置ssl springboot mongodb副本集_mongodb_03