Linux 搭建MongoDB复制集群

Posted 仅此而已-远方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 搭建MongoDB复制集群相关的知识,希望对你有一定的参考价值。

一、介绍

1、节点类型

主节点(Primary):负责处理客户端的请求

从节点(Secondary):负责复制主节点上的数据。可读不可写

仲裁节点(Arbiter):不保留任何数据,只具有投票选举作用。

MongoDB实现复制集群至少需要两个节点(一主一从),仲裁节点为可选,但一般会一起作用

2、主从复制方式

从节点定期轮询从主节点操作日志中获取操作记录,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

 

二、环境准备

虚拟机三台,分别安装好MongoDB。服务网格信息如下:

主机名 操作系统 IP Node 端口
vm-xwj100 Centos7.6 192.168.20.100 Primary 27017
vm-xwj101 Centos7.6 192.168.20.101 Secondary 27017
vm-xwj102 Centos7.6 192.168.20.102 Arbiter 27017

 

 

 

 

 

三、应用配置

修改三个节点下的mongo.conf配置文件

主节点(vm-xwj100):

#数据保存路径
dbpath=/usr/local/mongo/data/db/
#日志保存路径
logpath=/usr/local/mongo/logs/mongodb.log
#进程描述文件
pidfilepath=/usr/local/mongo/pids/mongo.pid
#日志追加写入
logappend=true
#复制集名称
replSet=rs0
bind_ip_all=true
#mongo默认端口
port=27017
#操作日志容量
oplogSize=10000
#开启子进程
fork=true

从节点(vm-xwj101):

#数据保存路径
dbpath=/usr/local/mongo/data/db/
#日志保存路径
logpath=/usr/local/mongo/logs/mongodb.log
#进程描述文件
pidfilepath=/usr/local/mongo/pids/mongo.pid
#日志追加写入
logappend=true
#复制集名称
replSet=rs0
bind_ip_all=true
#mongo默认端口
port=27017
#操作日志容量
oplogSize=10000
#开启子进程
fork=true

仲裁节点(vm-xwj102):

#数据保存路径
dbpath=/usr/local/mongo/data/db/
#日志保存路径
logpath=/usr/local/mongo/logs/mongodb.log
#进程描述文件
pidfilepath=/usr/local/mongo/pids/mongo.pid
#日志追加写入
logappend=true
#复制集名称
replSet=rs0
bind_ip_all=true
#mongo默认端口
port=27017
#操作日志容量
oplogSize=10000
#开启子进程
fork=true

 

四、初始化复制集群

1、在所有节点启动mongo服务端

/usr/local/mongo/bin/mongod -f /usr/local/mongo/conf/mongo.conf

2、登录客户端,访问主节点

/usr/local/mongo/bin/mongo --host 192.168.20.100 --port 27017

3、初始化复制集

rs.initiate({
    _id:"rs0",
    members:[
        {_id:0, host:"192.168.20.100:27017", priority:2},
        {_id:1, host:"192.168.20.101:27017", priority:1},
        {_id:2, host:"192.168.20.102:27017", arbiterOnly:true}
    ]
});

_id: "rs0": 复制集名称,与配置文件对应

priority: 权重(数字越大优先级越高)

arbiterOnly: 是否是仲裁节点

执行成功后,如下所示(命令行符号由 > 变为 rs0:SECONDARY>,然后会进行选举,最终变成rs0:Primary>):

4、查看复制集状态

rs.status()

5、查看当前节点是否为主节点 

rs.isMaster()

 

 

总结:

1、当主节点宕机时,仲裁节点会根据配置信息中的权重值优先选举权重高的节点作为主节点继续提供服务。当宕机的主节点回复后,复制集会恢复原主节点状态,临时主节点重新成为从节点。

 

踩坑:

1、初始化时,报如下错误:

"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: 192.168.20.101:27017 failed 
with Error connecting to 192.168.20.101:27017 :: caused by :: No route to host, 192.168.20.102:27017 failed with Error connecting to
192.168.20.102:27017 :: caused by :: No route to host
", "code" : 74, "codeName" : "NodeNotFound",

问题原因:初始化复制集群时,用的三台机器,主节点想连通其它节点,需要关闭防火墙

解决办法:在从节点和仲裁节点上,关闭防火墙:systemctl stop firewalld

2、在从节点上读取数据失败,报如下错误:

 

 

问题原因:默认情况下直接连从节点是无法查询数据的。因为从节点是不可读的

解决办法:开启从节点读权限。在从节点客户端输入命令 rs.slaveOk(true)

 

以上是关于Linux 搭建MongoDB复制集群的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB集群架构

MongoDB 集群搭建(主从复制副本及)

MongoDB搭建ReplSet复制集群

mongodb3.2复制集和shard集群搭建

MongoDB高可用复制集分片集群搭建

mongodb集群快速搭建