MongoDB - 分布式集群搭建部署详解1(副本集 Replica Set 模式)
我之前写过一篇介绍了如何在单机环境下安装部署 MongoDB 数据库(点击查看)。但在实际的生产环境中,MongoDB 基本是以集群的方式工作的,这样才能够保证在生产遇到故障时及时恢复,保障应用程序正常地运行和数据的安全。

(3)执行如下命令将安装包解压:
(4)将解压出来的文件夹拷贝到指定目录:
(5)进入 mongodb 文件夹:
(6)分别执行如下命令创建数据库目录、日志目录、配置文件目录:
(10)编辑完毕后按下 esc 退出编辑模式。 接着组合按下 shift + : 开启命令,然后输入 wq 回车,保存退出。
(2)连接成功后执行如下命令:
(3)接着执行如下命令开始配置副本集:
(4)最后执行如下命令使配置生效:
(5)稍等一会执行如下命令查看副本集状态:
(6)可以看到 myset 副本集中已经有一个 Primary 节点(26.47.136.14)和两个 Secondary 节点(26.47.136.15、26.47.136.16),说明副本集的启动配置已完成。



(2)再次查看副本集状态,由于主节点(26.47.136.14)发生了故障,副本节点会触发一次新的选举操作,最后 26.47.136.15(在剩余节点中权重最高)这个节点自动变为主节点:
(3)由于 26.47.136.15 目前成为了主节点,我们再次尝试插入一条数据,可以看到这次插入成功了:
(5)查看副本集状态,可以发现 26.47.136.14(权重最高)又变回了主节点:
(6)查看 26.47.136.14 上数据库数据,可以发现之前在 26.47.136.15 上插入的数据也同步过来了:
MongoDB 有三种集群部署模式:
由于主从复制模式目前已不推荐使用,所以本文首先介绍副本集模式。
- 主从复制模式(Master-Slaver):是一种主从副本的模式,目前已经不推荐使用。
- 副本集模式(Replica Set):该模式取代了 Master-Slaver 模式,是一种互为主从的关系。Replica Set 将数据复制多份保存,不同服务器保存同一份数据,在出现故障时自动切换,实现故障转移,在实际生产中非常实用。
- 分片模式(Sharding):该模式适合处理大量数据,它将数据分开存储,不同服务器保存不同的数据,所有服务器数据的总和即为整个数据集。
一、搭建副本集(Replica Set)集群模式
副本集(Replica Set)方式主要有两个目的:
- 一个是数据冗余做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
- 另一个是做读写分离,读的请求分流到副本上,减轻主(Primary)的读压力。
1,环境准备
(1)这里我们准备三台 CentOS 服务器作为副本集的三个成员,即一个主节点(Primary)和两个副本节点(Secondary),这三台服务器 IP 分别如下:
- 26.47.136.14
- 26.47.136.15
- 26.47.136.16
(2)注意副本集里的节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。
2,安装 MongoDB
(1)首先访问官网(点击跳转),寻找适合 CentOS 系统的下载地址:

(2)分别登录三台服务器,使用 wget 命令下载安装包(后续步骤在三台服务器上都是同样操作):
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.4.10.tgz
(3)执行如下命令将安装包解压:
tar -zxvf mongodb-linux-x86_64-rhel62-4.4.10.tgz
(4)将解压出来的文件夹拷贝到指定目录:
mv mongodb-linux-x86_64-rhel62-4.4.10 /usr/local/mongodb
(5)进入 mongodb 文件夹:
cd /usr/local/mongodb
(6)分别执行如下命令创建数据库目录、日志目录、配置文件目录:
mkdir -p data/db mkdir -p data/log mkdir conf
(7)进入刚创建的 conf 目录:
(8)执行如下命令添加编辑配置文件:
(9)按下 i 键进入编辑模式,添加如下内容:
cd conf
(8)执行如下命令添加编辑配置文件:
vi mongodb.conf
(9)按下 i 键进入编辑模式,添加如下内容:
dbpath=/usr/local/mongodb/data/db #数据文件存放目录 logpath=/usr/local/mongodb/data/log/mongodb.log #日志文件存放目录 pidfilepath=/usr/local/mongodb/mongo.pid #进程文件,方便停止mongodb logappend=true #开启日志追加添加日志 port=24017 #端口,默认27017,可以自定义 bind_ip=0.0.0.0 #本地监听IP,0.0.0.0表示允许所有IP连接 fork=true #以守护程序的方式启用,即在后台运行 directoryperdb=true #为每一个数据库按照数据库名建立文件夹存放 replSet=myset #replica set的名字
(11)最后分别执行下面两条命令配置 firewall 防火墙策略:
firewall-cmd --permanent --add-port=24017/tcp firewall-cmd --reload
3,启动 MongoDB 服务
(1)分别进入三台服务器 mongodb 的 bin 目录:
cd /usr/local/mongodb/bin
(2)执行如下命令启动 MongoDB:
./mongod --config /usr/local/mongodb/conf/mongodb.conf
4,配置主、副节点
(1)执行如下命令连接任意一个节点的数据库:
/usr/local/mongodb/bin/mongo 26.47.136.14:24017
(2)连接成功后执行如下命令:
use adminrs
(3)接着执行如下命令开始配置副本集:
各参数说明:
- cfg 可以是任意的名字。当然最好不要是 mongodb 的关键字,conf,config 都可以。
- 最外层的 _id 表示 replica set 的名字
- members 里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点,即这里的 26.47.136.14:24017。
cfg = {_id: "myset",members:[{_id: 0,host: '26.47.136.14:24017',priority: 3},{_id: 1,host: '26.47.136.15:24017',priority: 2},{_id: 2,host: '26.47.136.16:24017',priority: 1}]};
(4)最后执行如下命令使配置生效:
rs.initiate(cfg)
(5)稍等一会执行如下命令查看副本集状态:
rs.status()
(6)可以看到 myset 副本集中已经有一个 Primary 节点(26.47.136.14)和两个 Secondary 节点(26.47.136.15、26.47.136.16),说明副本集的启动配置已完成。

附:测试集群
1,测试副本集复制功能
(1)首先我们在主节点上创建 hangge 数据库,在此数据库中创建集合 test,并插入 3 个文档:

(2)接着到副本节点上查看数据,可以发现所有数据都已同步过来了:

(3)注意副本节点只能读取数据,所有数据的写入和更新都由主节点负责。比如我们在副本节点上尝试插入一条数据,会报如下错误:

2,测试高可用性测试
(1)MongoDB 副本集使用的是 N 个 mongod 节点构建的具备自动容错功能、自动恢复功能的高可用方案。首先我们登录主节点,执行如下命令关闭主节点数据库,模拟主节点发生故障:
./mongod --shutdown --dbpath /usr/local/mongodb/data/db
(2)再次查看副本集状态,由于主节点(26.47.136.14)发生了故障,副本节点会触发一次新的选举操作,最后 26.47.136.15(在剩余节点中权重最高)这个节点自动变为主节点:


(4)接着再测试下自动恢复功能,我们将 26.47.136.14 上的数据库再次启动起来:
./mongod --config /usr/local/mongodb/conf/mongodb.conf
(5)查看副本集状态,可以发现 26.47.136.14(权重最高)又变回了主节点:

(6)查看 26.47.136.14 上数据库数据,可以发现之前在 26.47.136.15 上插入的数据也同步过来了:
