MongoDB的复制集

一、简介

       MongoDB的复制至少需要两个节点,其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。建议提供仲裁节点,此节点不存储数据,作用是当主节点出现故障时,选举出某个备用节点成为主节点,保证MongoDB的正常服务。客户端只需要访问主节点或者从节点,不需要访问仲裁节点。

        MongoDB各个节点常见的搭配方式为:一主一从一仲裁、一主多从一仲裁。

        主节点记录在其上的所有操作oplog(操作日志),从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行操作,从而保证从节点的数据与主节点一致。

        其结构如下:

 

二、搭建步骤

1 环境准备

搭建Replication Set可以使用多主机或单主机多端口的方式搭建。

提供一个初始状态的MongoDB应用。

搭建Replication Set需要多个节点的环境尽可能保证一致,所以提供初始状态鹅Mon个DB应用是最好的。

本环境中只安装一个MongoDB应用,通过多端口来多次启动MongDB服务。

创建数据库目录:

mkdir -p data/db0     主节点
mkdir -p data/db1     从节点
mkdir -p data/db2     从节点
mkdir -p data/db3     仲裁节点

创建配置目录:

mkdir etc

创建日志目录:

mkdir log

创建进程文件目录:

mkdir pids

 

2 配置信息

Primary配置

主节点配置文件如下:

vim etc/mongo0.conf

# 数据库目录
dbpath=/usr/local/mongodb/data/db0
# 日志文件
logpath=/usr/local/mongodb/log/mdb0.log
# 进程描述文件
pidfilepath=/usr/local/mongodb/pids/mdb0.pid
# 为数据库自动提供重定向
directoryperdb=true
# 日志追加写入
logappend=true
# 复制集名称,一个复制集中的多个节点命名一致
replSet=rs0
# 端口
port=37010
# 操作日志容量
oplogSize=10000
# 后台启动
fork=true
noprealloc=true

 

 secondary配置

vim etc/mongo1.conf

内容如下:

dbpath=/usr/local/mongodb/data/db1
logpath=/usr/local/mongodb/log/mdb1.log
pidfilepath=/usr/local/mongodb/pids/mdb1.pid
directoryperdb=true
logappend=true
replSet=rs0
port=37011
oplogSize=10000
fork=true
noprealloc=true

 

vim etc/mongo2.conf

dbpath=/usr/local/mongodb/data/db2
logpath=/usr/local/mongodb/log/mdb2.log
pidfilepath=/usr/local/mongodb/pids/mdb2.pid
directoryperdb=true
logappend=true
replSet=rs0
port=37012
oplogSize=10000
fork=true
noprealloc=true

 

Arbiter配置

vim etc/mongo3.conf

dbpath=/usr/local/mongodb/data/db3
logpath=/usr/local/mongodb/log/mdb3.log
pidfilepath=/usr/local/mongodb/pids/mdb3.pid
directoryperdb=true
logappend=true
replSet=rs0
port=37013
oplogSize=10000
fork=true
noprealloc=true

 

启动各节点

bin/mongod --config etc/mongo0.conf

bin/mongod --config etc/mongo1.conf

bin/mongod --config etc/mongo2.conf

bin/mongod --config etc/mongo3.con

 

连接端口37010节点

此节点作为主节点使用,连接方式为:

bin/mongo --port 37010

 

初始化Replication Set

使用命令初始化复制集:

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}
 ]
});

_id: 唯一标记

host:主机地址

priority: 权重,复制集总工作的优先级,数字越大越高

arbiterOnly: 是否是仲裁节点

 

查看Replication Set状态

使用命令查看复制集状态:

rs.status();

 

查看当前连接节点是否是Primary节点

 rs.isMaster;

 

总结:

     当主节点宕机时,仲裁节点会根据配置信息中的权重优先选举权重高的节点作为主节点继续提供服务。

当宕机的主节点恢复后,复制集会恢复原主节点状态,临时节点重新成为从节点。

    默认情况下直接从节点是无法查询数据的(db.集合名词.find()报错)。

    因为从节点是不可读取的。如果需要在从节点上读取数据,则可以使用命令rs.slaveOk(true|false)来设置;

rs.slaveOk()或rs.slaveOk(true)代表可以在从节点上做读操作:rs.slaveOk(false)代表不可在从节点上做读数据。

 

posted @ 2022-07-10 16:35  喻聪  阅读(380)  评论(0编辑  收藏  举报