副本集节点介绍
1)数据节点-------主节点
主节点负责数据的读写操作,并把写的操作记录到OpLog中(mongo隐藏的库local的oplog集合)
2)数据节点-------从节点
复制主节点的数据,备份容灾用,主节点挂掉,会重新选举出新的主节点,从节点无法进行写操作,即使拥有root权限也不行(不同于MySQL)
3)投票节点
不负责数据的存储和复制,只负责投票。(注:理论上一个mongo复制集,可以有一个主节点,多个从节点,多个投票节点)
工作方式
1)客户端驱动指向mongo数据库,写的时候只会在主节点上进行,写的信息会记录在oplog中,从节点根据oplog把写入操作复制到从节点上。
2)复制集异步操作,刷盘下效率或者网络问题影响下,从节点会有一定的延迟,所以读操作默认也是指向主节点,如果对实时性要求不高,可以配置指向从节点,实现读写分离。
环境的搭建
1.下载安装包:
cd /usr/local
mkdir mongos
cd mongos
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz
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.创建实例启动配置
#由于开启认证所以要创建一个keyfile,并且拷贝到其他从节点
cd /usr/local/mongos/mongodb4.2.8/
openssl rand -base64 756 > config/autokey
chmod 400 config/autokey
cd config
cp autokey rs1
cp autokey rs2
cp autokey rs3
#分别在/usr/local/mongos/mongodb4.2.8/config/ rs1、rs2、rs3下创建配置文件
touch mongod.cfg
#rs1配置mongod.cfg
dbpath=/usr/local/mongos/mongodb4.2.8/data/rs1 #mongo数据安装目录
logpath=/usr/local/mongos/mongodb4.2.8/log/rs1.log #日志打印的目录
journal=true #数据是否故障恢复
port=27017 #端口
replSet=rs #复制集名称
logappend=true #复制集日志是以追加的方式进行
fork = true #是否后台启动
bind_ip=0.0.0.0 #绑定主机
#是否认证
auth = true
#存储引擎,有mmapv1、wiretiger、mongorocks
storageEngine=wiredTiger
keyFile=/usr/local/mongos/mongodb4.2.8/config/rs1/autokey
#rs2配置mongod.cfg
dbpath=/usr/local/mongos/mongodb4.2.8/data/rs2 #mongo数据安装目录
logpath=/usr/local/mongos/mongodb4.2.8/log/rs2.log #日志打印的目录
journal=true #数据是否故障恢复
port=27017 #端口
replSet=rs #复制集名称
logappend=true #复制集日志是以追加的方式进行
fork = true #是否后台启动
bind_ip=0.0.0.0 #绑定主机
#是否认证
auth = true
#存储引擎,有mmapv1、wiretiger、mongorocks
storageEngine=wiredTiger
keyFile=/usr/local/mongos/mongodb4.2.8/config/rs2/autokey
#rs3配置mongod.cfg
dbpath=/usr/local/mongos/mongodb4.2.8/data/rs3 #mongo数据安装目录
logpath=/usr/local/mongos/mongodb4.2.8/log/rs3.log #日志打印的目录
journal=true #数据是否故障恢复
port=27017 #端口
replSet=rs #复制集名称
logappend=true #复制集日志是以追加的方式进行
fork = true #是否后台启动
bind_ip=0.0.0.0 #绑定主机
#是否认证
auth = true
#存储引擎,有mmapv1、wiretiger、mongorocks
storageEngine=wiredTiger
keyFile=/usr/local/mongos/mongodb4.2.8/config/rs3/autokey
5.启动实例
cd /usr/local/mongos/mongodb4.2.8
bin/mongod --config /usr/local/mongos/mongodb4.2.8/config/rs1/mongod.cfg
bin/mongod --config /usr/local/mongos/mongodb4.2.8/config/rs2/mongod.cfg
bin/mongod --config /usr/local/mongos/mongodb4.2.8/config/rs3/mongod.cfg
#检查实例启动情况
ps -ef|grep mongo
6.加入副本集集群
#使用命令行,进入到27017实例
bin/mongo -port 27017
#进入admin
use admin
#初始化一个副本集
rs.initiate()
#创建用户
db.createUser({ user: 'root', pwd: 'Aa123456..', roles: [{ role: "root", db: "admin" }]});
#登录
db.auth("root","Aa123456..")
#查看副本集状态命令
rs.conf()
#加入secondary节点
rs.add("localhost:27001")
#期间可能会报错 Either all host names in a replica set configuration must be localhost references, or none must be; found 1 out of 2" 节点的host的限制导致的修改为localhost
conf=rs.conf()
conf.members[0].host='localhost:27017'
rs.reconfig(conf)
#加入投票节点
rs.addArb("localhost:27002")
#查看副本集状态
rs.status()
#没有问题后退出
#重要且必须, secondary节点允许读取操作在当前节点进行,否则从节点无法复制主节点的数据
#进入secondary实例
bin/mongo -port 27001
rs.slaveOk()
7.验证
#主节点
use test
db.createCollection('user')
db.user.insert({'name':'james'})
#从节点
use test
show collections
db.user.find()