目录
一、介绍
1.1、节点类型
主节点
:负责处理客户端请求
从节点
:负责复制主节点上的数据
仲裁节点
:选举出某个备用节点成为主节点(不存储数据)
MongoDB实现复制集群至少需要两个节点(主从),仲裁节点为可选,但一般会一起使用。
1.2、复制集群模式
1)一主一从一仲裁
2)一主多从一仲裁
1.3、从节点复制方式
从节点
定期轮询从主节点oplog操作日志中获取操作记录,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
1.4、架构图
Primary
为主节点,Secondary
为从节点,客户端只需要访问主节点或从节点,不需要访问仲裁节点。
二、环境搭建
在一台机器上模拟4个节点(1主2从1仲裁)
2.1、安装mongoDB
1)上传安装包:mongodb-linux-x86_64-rhel80-4.2.8.tgz
2)解压:tar -zxf mongodb-linux-x86_64-rhel80-4.2.8.tgz
3)拷贝到/usr/local/目录中:mv mongodb-linux-x86_64-rhel80-4.2.8 /usr/local/mongo
2.2、创建目录
2.2.1、数据库目录(分别对应4个节点)
[root@localhost local]# cd mongo/
[root@localhost mongo]# mkdir -p data/db0
[root@localhost mongo]# mkdir -p data/db1
[root@localhost mongo]# mkdir -p data/db2
[root@localhost mongo]# mkdir -p data/db3
2.2.2、配置目录
[root@localhost mongo]# mkdir etc
2.2.3、日志目录
[root@localhost mongo]# mkdir log
2.2.4、进程文件目录
[root@localhost mongo]# mkdir pids
2.3、应用配置
2.3.1、配置主节点
vi etc/mongo0.conf
dbpath=/usr/local/mongo/data/db0
logpath=/usr/local/mongo/log/mdb0.log
pidfilepath=/usr/local/mongo/pids/mdb0.pid
logappend=true # 日志追加写入
replSet=rs0 # 复制集名称
port=37010
oplogSize=10000 # 操作日志容量
fork=true # 后台启动
2.3.2、配置从节点
vi etc/mongo1.conf
dbpath=/usr/local/mongo/data/db1
logpath=/usr/local/mongo/log/mdb1.log
pidfilepath=/usr/local/mongo/pids/mdb1.pid
logappend=true
replSet=rs0 port=37011
oplogSize=10000
fork=true
vi etc/mongo2.conf
dbpath=/usr/local/mongo/data/db2
logpath=/usr/local/mongo/log/mdb2.log
pidfilepath=/usr/local/mongo/pids/mdb2.pid
logappend=true
replSet=rs0
port=37012
oplogSize=10000
fork=true
2.3.2、配置仲裁节点
vi etc/mongo3.conf
dbpath=/usr/local/mongo/data/db3
logpath=/usr/local/mongo/log/mdb3.log
pidfilepath=/usr/local/mongo/pids/mdb3.pid
logappend=true
replSet=rs0
port=37013
oplogSize=10000
fork=true
3、启动服务
启动4个节点
[root@localhost etc]# /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo0.conf
[root@localhost etc]# /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo1.conf
[root@localhost etc]# /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo2.conf
[root@localhost etc]# /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo3.conf
查看进程,启动成功
[root@localhost ~]# ps -ef|grep mongo
root 2839 1 1 06:06 ? 00:00:15 /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo0.conf
root 2882 1 1 06:07 ? 00:00:13 /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo1.conf
root 2922 1 1 06:08 ? 00:00:13 /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo2.conf
root 2961 1 1 06:09 ? 00:00:12 /usr/local/mongo/bin/mongod -config /usr/local/mongo/etc/mongo3.conf
root 3073 3046 0 06:29 pts/2 00:00:00 grep --color=auto mongo
3、初始化复制集
3.1、登录客户端
连接方式:./mongo --port 37010 --host 地址
[root@localhost bin]# ./mongo --port 37010
MongoDB shell version v4.2.8
connecting to: mongodb://127.0.0.1:37010/?compressors=disabled&gssapiServiceName=mongodb
...
3.2、初始化命令
rs.initiate({ _id:"rs0", members:[ {_id:0,host:"127.0.0.1:37010",priority:3}, {_id:1,host:"127.0.0.1:37011",priority:2}, {_id:2,host:"127.0.0.1:37012",priority:1}, {_id:3,host:"127.0.0.1:37013",arbiterOnly:true} ] });
priority:权重(数字越大优先级越高)
arbiterOnly:是否是仲裁节点
返回如下表示执行成功
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1595140789, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1595140789, 1)
}
3.3、其它命令
查看复制集状态:rs.status();
令查看当前节点是否是主节点:rs.isMaster();
三、说明
1)当主节点宕机时,仲裁节点会根据配置信息中的权重值优先选举权重高的节点作为主节点继续提供服务。当宕机的主节点恢复后,复制集会恢复原主节点状态,临时主节点重新成 为从节点。
2)默认情况下直接连接从节点是无法查询数据的(db.集合.find()报错)。因为从节点 是不可读的。如果需要在从节点上读取数据,则可以使用命令 rs.slaveOk([true|false])来设置。 rs.slaveOk()或 rs.slaveOk(true)代表可以在从节点上做读操作;rs.slaveOk(false)代表不可在从 节点上做读操作。