主节点唯一,但是不固定.(不确定因素的原因是,主节点挂了的话,会重新选举出一个新的主节点)
大多数原则,即1/2原则,一个复制集集群中,如果有大于等于1/2的节点不可用的话,那么整个进群将不可写,只可读(注:实际上应该是 投票权重的1/2
从库无法写入,root权限也不行.这一点与mysql不同,mysql从库无法写入的原因是设置了readOnly
主节点服务不可用,会自动选举出新的主节点
主节点,负责数据的读写操作,并把写的信息记录到OpLog中(mongo隐藏的库local 的oplog集合)
复制主节点的数据,备份容灾用,主节点挂掉,会重新成为新的主节点,从节点无法进行写操作 即使,拥有root权限也不行(不同于mysql)
不负责数据的存储和复制,只负责投票
注:理论上一个mongo复制集,可以有一个主节点,多个从节点,多个投票节点
Primary localhost:27000 主节点 负责读写
Secondary localhost:27001 从节点,负责容灾,主节点挂掉,则从节点成为主节点
Arbiter localhost:27002 投票节点,不负责数据的存储读写,存在的意义是,遵循下mongo复制集的1/2原则
三.复制集搭建
1.下载安装包
wget https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.5.tgz
#Linux系统请下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.5.tgz
后续步骤完全相同,无须关心系统的问题
2.解压安装包
tar -zxvf mongodb-osx-ssl-x86_64-4.0.5.tgz
#修改文件解压后的文件名称
mv mongodb-osx-ssl-x86_64-4.0.5 ./mongodb
#linux操作
tar -zxvf mongodb-linux-x86_64-4.0.5.tgz
3.创建目录
#在解压后的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
#分别编辑mongod.cfg,这里目录是本人所在目录,具体目录请根据个人情况配置
#rs1配置mongod.cfg
dbpath=/Users/eastcool/work/soft/mongodb/data/rs1 #mongo数据安装目录
logpath=/Users/eastcool/work/soft/mongodb/log/rs1.log #日志打印的目录
journal=true #数据是否故障恢复
port=27000 #端口
replSet=rs #复制集名称
logappend=true #复制集日志是以追加的方式进行
fork = true #是否后台启动
Rs2配置mongod.cfg
dbpath=/Users/eastcool/work/soft/mongodb/data/rs2
logpath=/Users/eastcool/work/soft/mongodb/log/rs2.log
journal=true
port=27001
replSet=rs
logappend=true
fork = true
Rs3配置mongod.cfg
dbpath=/Users/eastcool/work/soft/mongodb/data/rs3
logpath=/Users/eastcool/work/soft/mongodb/log/rs3.log
journal=true
port=27002
replSet=rs
logappend=true
fork = true
5.启动实例
#进入到mongodb的bin目录
./mongod --config /Users/eastcool/work/soft/mongodb/config/rs1/mongod.cfg
./mongod --config /Users/eastcool/work/soft/mongodb/config/rs2/mongod.cfg
./mongod --config /Users/eastcool/work/soft/mongodb/config/rs3/mongod.cfg
#实例启动说明
./mongod mongodb守护进程命令
--config 启动配置文件标志参数
/Users/eastcool/work/soft/mongodb/config/rs3/mongod.cfg 启动配置的目录
6.加入副本集集群
#进入到27000实例
#入口在mongodb的bin目录
./mongo -port 27000
#初始化一个副本集
rs.initiate()
#查看副本集状态命令
rs.conf()
#加入secondary节点
rs.add("localhost:27001")
#加入投票节点
rs.addArb("localhost:27002")
#查看副本集状态
rs.status()
#重要且必须, secondary节点允许读取操作在当前节点进行,否则从节点无法复制主节点的数据
#进入secondary实例
./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()
修改权重后再次查看权重
cfg = rs.conf();
cfg.members[0].priority = 2;
rs.reconfig(cfg);
rs.conf()
按几次回车键,神奇的发现
这时会发现之前的主节点再次成为主节点,成为主节点的secondary再次变成secondary