基本概念
副本集(Replic Set),主要是实现高可用。确保数据的完整性。对于
思路
一个主服务器(Master)负责写入和更新,一个从服务器(Slaver)负责从主服务器同步数据,裁决服务器(Arbiter)用来投票,不存储数据。在主服务器挂掉的时候负责启动一个主服务器,如图:
MongoDB数据库做群集需要创建 Data文件夹和Log文件夹,用来存放数据和日志。数据就是我们存放的数据,日志用来同步数据。
这里我用Bat脚本创建
文件夹创建和日志文件
@echo off
d /d d:
rem 创建Master数据库文件夹
mkdir MongoDBCluster\Master\Data
mkdir MongoDBCluster\Master\Log
echo ''>D:\MongoDBCluster\Master\Log\Master.log
rem 创建Slaver数据库文件夹
mkdir MongoDBCluster\Slaver\Data
mkdir MongoDBCluster\Slaver\Log
echo ''>D:\MongoDBCluster\Slaver\Log\Slaver.log
rem 创建Arbiter数据库文件夹
mkdir MongoDBCluster\Arbiter\Data
mkdir MongoDBCluster\Arbiter\Log
echo ''>D:\MongoDBCluster\Arbiter\Log\Arbiter.log
说明:目前使用的MongoDB版本是 MongoDB 5.0.5 Community
创建启动配置文件
Master.conf
#Master.conf
dbpath=/MongoDBCluster/Master/Data
logpath=/MongoDBCluster/Master/Log/Master.log
pidfilepath=/MongoDBCluster/Master/Master.pid
directoryperdb=true
logappend=true
replSet=testrs
port=27017
bind_ip=0.0.0.0
注意这里的bind_ip 我用的是 0.0.0.0 因为我的是个数据库实例都是本机,换成局域网ip会报错
Slaver.conf
#Slaver.conf
dbpath=/MongoDBCluster/Slaver/Data
logpath=/MongoDBCluster/Slaver/Log/Slaver.log
pidfilepath=/MongoDBCluster/Slaver/Slaver.pid
directoryperdb=true
logappend=true
#replSet=testrs
port=27018
bind_ip=0.0.0.0
Arbiter.conf
#Arbiter.conf
dbpath=/MongoDBCluster/Arbiter/Data
logpath=/MongoDBCluster/Arbiter/Log/Arbiter.log
pidfilepath=/MongoDBCluster/Arbiter/Arbiter.pid
directoryperdb=true
logappend=true
#replSet=testrs
port=27019
bind_ip=0.0.0.0
dbpath:数据存放目录
logpath:日志存放路径
pidfilepath:进程文件,方便停止mongodb
directoryperdb:为每一个数据库按照数据库名建立文件夹存放
logappend:以追加的方式记录日志
replSet:replica set的名字
bind_ip:mongodb所绑定的ip地址
port:mongodb进程所使用的端口号,默认为27017
oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
fork:以后台方式运行进程
noprealloc:不预先分配存储
根据配置启动MongoDB实例
'启动Master库
mongod -f D:\MongoDBCluster\Master\Master.conf
'启动Slaver库
mongod -f D:\MongoDBCluster\Slaver\Slaver.conf
'启动Arbiter库
mongod -f D:\MongoDBCluster\Arbiter\Arbiter.conf
这里的启动是阻塞式启动,可以安装成服务去启动。
启动Master
启动Slaver
启动Arbiter
配置配置服务器
进入mongoshell,输入如下命令:
cfg = {
_id: "testrs",
members: [{
_id: 0,
host: '192.168.200.131:27017',
priority: 1
}, {
_id: 1,
host: '192.168.200.131:27018',
priority: 1
}, {
_id: 2,
host: '192.168.200.131:27019',
arbiterOnly: true
}]
};
rs.initiate(cfg)
通过status方法查看
rs.status()
配置应用成功
验证
- 分别打开主库Master(端口号是27017) 和 从库 Slaver(端口号是27018)
- 在主库上创建了一个test 数据库,又创建了testinfo 集合,并导入了数据。如图:
现在演示停掉主库进程,用来模拟宕机。
再次查看客户端,如图:
至此。
参考资料: