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)代表不可在从节点上做读数据。