centOS7 + MongoDB 3.6.22 集群搭建 - 切片+副本集 - 个人学习
因为我是学习这个,所以是安装成功之后自己再记录一下过程,mongodb是重新安装的,参考博客:MongoDB 3.6.9 集群搭建 - 切片+副本集
1. 服务结构介绍
结构图:

结构图解:
1. Shard服务器:使用Replica Sets确保每个数据节点都具有备份、自动容错转移、自动恢复的能力。
- 配置服务器:使用3个配置服务器确保元数据完整性。
- 路由进程:使用3个路由进程实现平衡,提高客户端接入性能
- 副本集1:Shard11,Shard12,Shard13组成一个副本集,提供Sharding中shard1的功能;
- 副本集2:Shard21,Shard22,Shard23组成一个副本集,提供Sharding中shard2的功能;
- 副本集3:Shard31,Shard32,Shard33组成一个副本集,提供Sharding中shard3的功能;
- 3个配置服务器进程和3个路由器进程。
- Arbiter仲裁者,是副本集中的一个MongoDB实例, 它并不保存数据。仲裁节点使用最小的资源并且不要求硬件设备。为了确保复制集中有奇数的投票成员(包括primary),需要添加仲裁节点作为投票,否则primary不能运行时不会自动切换primary。
构建一个mongoDB Sharding Cluster需要三种角色:shard服务器(ShardServer)、配置服务器(config Server)、路由进程(Route Process)
2. Shard 服务器
Shard服务器即存储实际数据的分片,每个shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Sets。为了实现每个Shard内部的故障自动转换,MongoDB官方建议每个shard为一组Replica Sets。
3. 配置服务器
为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,决定该条记录属于哪个chunk,配置服务器可以存储以下信息,每个shard节点的配置信息,每个chunk的shard key范围,chunk在各shard的分布情况,集群中所有DB和collection的sharding配置信息。
4. 路由进程
它是一个前段路由,客户端由此接入,首先询问配置服务器需要到哪个shard上查询或保存记录,然后连接相应的shard执行操作,最后将结果返回给客户端,客户端只需要将原本发给mongod的查询或更新请求原封不动地发给路由进程,而不必关心所操作的记录存储在哪个shard上。
按照架构图,理论上是需要15台机器的,由于资源有限,我们只用三台服务器,用目录来替代物理机,下面给出配置表格(服务器IP/端口可根实际自行设置,保证服务器之间网络互通即可):
| 10.88.88.6 | 10.88.88.60 | 10.88.88.61 |
|---|---|---|
| Shard11:10011 主节点 | Shard12:10012 副节点 | Shard13:10013 仲裁点 |
| Shard21:10021 仲裁点 | Shard22:10022 主节点 | Shard32:10023 副节点 |
| Shard31:10031 副节点 | Shard32:10032 仲裁点 | Shard33:10033 主节点 |
| ConfigSvr:10041 | ConfigSvr:10042 | ConfigSvr:10043 |
| Mongos:10051 | Mongos:10052 | Mongos:10053 |
5. 官方文档
https://www.mongodb.com/docs/v3.6/replication/
2. 环境准备
我们有三台服务器,可以先配置一台然后复制文件到另外两台,再改配置即可
2.1 mongodb安装以及搭建目录结构
下载mongodb 3.6.22安装包(可以自己选择安装的版本),以及搭建目录结构
# 下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.22.tgz
# 解压
tar -zxvf mongodb-linux-x86_64-3.6.22.tgz
# 复制文件到指定安装目录,并改名为mongodb,我安装在 /usr/local/mongodb
mv mongodb-linux-x86_64-3.6.22 /usr/local/mongodb
# 在该台机器上mongodbCluster369目录中建立conf(配置文件)、mongos(路由)、config(配置)、shard1、shard2、shard3(三个切片)六个目录,因为mongos不存储数据,只需要建立日志文件即可。
mkdir -p /usr/local/mongodbCluster3622
mkdir -p /usr/local/mongodbCluster3622/conf
mkdir -p /usr/local/mongodbCluster3622/mongos/log
mkdir -p /usr/local/mongodbCluster3622/mongos/pid
mkdir -p /usr/local/mongodbCluster3622/config/data
mkdir -p /usr/local/mongodbCluster3622/config/log
mkdir -p /usr/local/mongodbCluster3622/config/pid
mkdir -p /usr/local/mongodbCluster3622/shard1/data
mkdir -p /usr/local/mongodbCluster3622/shard1/log
mkdir -p /usr/local/mongodbCluster3622/shard1/pid
mkdir -p /usr/local/mongodbCluster3622/shard2/data
mkdir -p /usr/local/mongodbCluster3622/shard2/log
mkdir -p /usr/local/mongodbCluster3622/shard2/pid
mkdir -p /usr/local/mongodbCluster3622/shard3/data
mkdir -p /usr/local/mongodbCluster3622/shard3/log
mkdir -p /usr/local/mongodbCluster3622/shard3/pid
接下来是设置系统环境变量
环境变量:
vi /etc/profile
内容底部增加:
# mongodb setting
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:MONGODB_HOME/bin
使立即生效:
source /etc/profile
这里要注意一点,/etc/profile设置的是系统环境变量,要注意不能随意改动内容,还有不能写错了,否则应用之后会导致所有命令全部失效(我就写错了变量踩坑了),如果出现了跟我一样的问题,解决方案:
利用以下命令 ,临时使用命令,去把配置改回来,或者排错修改
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
2.2. 配置分片副本集
设置第1个分片副本集,配置文件(注意路径、ip、端口):
vi /usr/local/mongodbCluster3622/conf/shard1.conf
配置内容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard1/log/shard1.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard1/pid/shard1.pid
net:
bindIp: 10.88.88.6
port: 10011
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard1/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard1
sharding:
clusterRole: shardsvr
设置第2个分片副本集,配置文件(注意路径、ip、端口):
vi /usr/local/mongodbCluster3622/conf/shard2.conf
配置内容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard2/log/shard2.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard2/pid/shard2.pid
net:
bindIp: 10.88.88.6
port: 10021
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard2/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard2
sharding:
clusterRole: shardsvr
设置第3个分片副本集,配置文件(注意路径、ip、端口):
vi /usr/local/mongodbCluster3622/conf/shard3.conf
配置内容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/shard3/log/shard3.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/shard3/pid/shard3.pid
net:
bindIp: 10.88.88.6
port: 10031
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/shard3/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 103
statisticsLogDelaySecs: 0
journalCompressor: snappy
directoryForIndexes: false
collectionConfig:
blockCompressor: snappy
indexConfig:
prefixCompression: true
replication:
oplogSizeMB: 10000
replSetName: shard3
sharding:
clusterRole: shardsvr
2.3. config server配置服务器
设置config server,配置文件(注意路径、ip、端口):
vi /usr/local/mongodbCluster3622/conf/config.conf
配置内容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/config/log/config.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/config/pid/config.pid
net:
bindIp: 10.88.88.6
port: 10041
maxIncomingConnections: 20000
storage:
dbPath: /usr/local/mongodbCluster3622/config/data
journal:
enabled: true
commitIntervalMs: 500
directoryPerDB: true
syncPeriodSecs: 300
engine: wiredTiger
replication:
oplogSizeMB: 10000
replSetName: configs
sharding:
clusterRole: configsvr
2.3. 配置路由服务器mongos
设置config server,配置文件(注意路径、ip、端口):
vi /usr/local/mongodbCluster3622/conf/mongos.conf
配置内容:
systemLog:
destination: file
path: /usr/local/mongodbCluster3622/mongos/log/mongos.log
logAppend: true
processManagement:
fork: true
pidFilePath: /usr/local/mongodbCluster3622/mongos/pid/mongos.pid
net:
bindIp: 10.88.88.6
port: 10051
maxIncomingConnections: 20000
sharding:
configDB: configs/10.88.88.6:10041,10.88.88.60:10042,10.88.88.61:10043
2.4. 参数说明:
dbpath:数据存放目录
logpath:日志存放路径
pidfilepath:进程文件,方便停止mongodb
logappend:以追加的方式记录日志
directoryperdb:为每一个数据库按照数据库名建立文件夹
replSet:replica set的名字
bindIp:mongodb所绑定的ip地址
port:mongodb进程所使用的端口号,默认为27017
fork:以后台方式运行进程
oplogSize:mongodb操作日志文件的最大大小。单位为Mb,默认为硬盘剩余空间的5%
shardsvr:分片节点
configsvr:配置服务节点
configdb:配置config节点到route节点
journal:写日志
smallfiles:当提示空间不够时添加此参数
noprealloc:预分配方式,使用预分配方式来保证写入性能的稳定,预分配在后台运行,并且每个预分配的文件都用0进行填充。这会让MongoDB始终保持额外的空间和空余的数据文件,从而避免了数据增长过快而带来的分配磁盘空间引起的阻塞。设置noprealloc=true来禁用预分配的数据文件,会缩短启动时间,但在正常操作过程中,可能会导致性能显著下降。
2.5. 配置另外两台服务器:
分别把/usr/local/mongodb安装包和/usr/local/mongodbCluster369配置集群信息复制到其他两台机器上
# mongodb
scp -r /usr/local/mongodb root@10.88.88.60:/usr/local
scp -r /usr/local/mongodb root@10.88.88.61:/usr/local
# config
scp -r /usr/local/mongodbCluster3622 root@10.88.88.60:/usr/local复制mongodbCluster369
scp -r /usr/local/mongodbCluster3622 root@10.88.88.61:/usr/local复制mongodbCluster369
两台机器修改 mongodb安装的环境变量
vi /etc/profile
内容底部增加:
# mongodb setting
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:MONGODB_HOME/bin
使立即生效:
source /etc/profile
两台机器修改复制过去的配置信息,按照上面配置表格进行修改:
例如:

-->

五个配置文件都要修改
vi /usr/local/mongodbCluster3622/conf/shard1.conf
vi /usr/local/mongodbCluster3622/conf/shard2.conf
vi /usr/local/mongodbCluster3622/conf/shard3.conf
vi /usr/local/mongodbCluster3622/conf/config.conf
vi /usr/local/mongodbCluster3622/conf/mongos.conf
2.6.启动mongodb集群
先启动配置服务器和分片服务器,后启动路由实例(三台服务器)。
2.6.1 启动配置服务
启动三台服务器的config server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/config.conf
登录任意一台服务器,初始化配置副本集
登录连接命令:/usr/local/mongodb/bin/mongod 10.88.88.6:10041/admin
config = {
_id : "configs",
members : [
{_id : 0, host : "10.88.88.6:10041"},
{_id : 1, host : "10.88.88.60:10042"},
{_id : 2, host : "10.88.88.61:10043"}
]}
// 初始化
rs.initiate(config)
2.6.2 启动分片服务器
启动三台服务器的shard1 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard1.conf
登录10.88.88.6服务器(10.88.88.61设置为仲裁节点,不能使用该节点登录),初始化分片副本集
登录连接命令:
/usr/local/mongodb/bin/mongo 10.88.88.6:10011/admin
config = {
_id : "shard1",
members : [
{_id : 0, host : "10.88.88.6:10011",priority:2},
{_id : 1, host : "10.88.88.60:10012",priority:1},
{_id : 2, host : "10.88.88.61:10013", arbiterOnly : true}
]}
初始化副本集
rs.initiate(config)
第三个个节点的“arbiterOnly”:true代表其为仲裁节点。
使用exit命令退出mongo的shell操作界面
启动三台服务器的shard2 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard2.conf
登录10.88.88.60一台服务器(因为10.88.88.6设置为仲裁节点,不能使用该节点登录),初始化分片副本集
登录连接命令:
/usr/local/mongodb/bin/mongo 10.88.88.60:10022/admin
config = {
_id : "shard2",
members : [
{_id : 0, host : "10.88.88.6:10021", arbiterOnly : true },
{_id : 1, host : "10.88.88.60:10022",priority:2},
{_id : 2, host : "10.88.88.61:10023",priority:1}
]}
初始化副本集
rs.initiate(config)
第一个节点的“arbiterOnly”:true代表其为仲裁节点。
使用exit命令退出mongo的shell操作界面
启动三台服务器的shard3 server
/usr/local/mongodb/bin/mongod -f /usr/local/mongodbCluster3622/conf/shard3.conf
登录10.88.88.60一台服务器(因为10.88.88.6设置为仲裁节点,不能使用该节点登录),初始化分片副本集
登录连接命令:
/usr/local/mongodb/bin/mongo 10.88.88.60:10022/admin
config = {
_id : "shard3",
members : [
{_id : 0, host : "10.88.88.6:10031",priority:1},
{_id : 1, host : "10.88.88.60:10032", arbiterOnly : true },
{_id : 2, host : "10.88.88.61:10033",priority:2}
]}
初始化副本集
rs.initiate(config)
第一个节点的“arbiterOnly”:true代表其为仲裁节点。
使用exit命令退出mongo的shell操作界面
2.6.3. 启动路由实例
启动三台服务器的mongos server
/usr/local/mongodb/bin/mongos -f /usr/local/mongodbCluster3622/conf/mongos.conf
2.7 启用分片
登录任意一台mongos,这里以10.88.88.6:10051为例:
/usr/local/mongodb/bin/mongo 10.88.88.6:10051/admin
配置如下内容,串联路由服务器与切片副本集:
sh.addShard("shard1/10.88.88.6:10011,10.88.88.60:10012,10.88.88.61:10013")
sh.addShard("shard2/10.88.88.6:10021,10.88.88.60:10022,10.88.88.61:10023")
sh.addShard("shard3/10.88.88.6:10031,10.88.88.60:10032,10.88.88.61:10033")
查看集群状态:
sh.status()
2.8 指定数据库与集合分片生效
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但是我们的目的是希望插入数据、数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
接着上面2.7的步骤,不用退出mongos的操作界面
指定数据库"testdb"分片生效:
db.runCommand({enablesharding : "testdb"})
指定数据库里需要分片的集合collection和片键,一般是_id:
db.runCommand({shardcollection : "testdb.table1", key : {id : "hashed"}})
2.8 测试分片配置结果
登录任意一台mongos,这里以10.88.88.6:10051为例:
登录连接命令:
/usr/local/mongodb/bin/mongo 10.88.88.6:10051/admin
切换数据库:
use testdb
输入如下命令:
for (var i = 1; i <= 5000; i++){ db.table1.insert({id:i,text:"hello world"}) }

查看分配状态:
db.table1.stats()
如下图所示:
shard1总数:1664条

Shard2总数:1684条

Shard3总数:1652条

可以看到数据分到3个分片。已经成功了。
3. 后期运维
mongodbd的启动顺序是,先启动配置服务器,再启动分片,最后启动mongos。
mongod -f /usr/local/mongodbCluster3622/conf/config.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard1.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard2.conf
mongod -f /usr/local/mongodbCluster3622/conf/shard3.conf
mongos -f /usr/local/mongodbCluster3622/conf/mongos.conf
关闭时,直接killall杀掉所有进程
killall mongod
killall mongos
centOS7 + MongoDB 3.6.22 集群搭建 - 切片+副本集 - 个人学习的更多相关文章
- MongoDB 3.6.9 集群搭建 - 切片+副本集
1. 环境准备 在Mongo的官网下载Linux版本安装包,然后解压到对应的目录下:由于资源有限,我们采用Replica Sets + Sharding方式来配置高可用.结构图如下所示: 这里我说明下 ...
- mongodb3.6集群搭建:分片+副本集
mongodb是最常用的noSql数据库,在数据库排名中已经上升到了前五.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...
- MongoDB集群搭建之副本集模仿主从模式的行为
#模拟主节点异常中断 [root@ba3b27d855f6 bin]# kill -9 199 [root@ba3b27d855f6 bin]# #连接到其中一台备份节点 [root@ba3b27 ...
- mongodb 搭建集群(分片+副本集)
mongodb 搭建集群(分片+副本集) 一.搭建结构图: 二.搭建步骤:
- mongodb 3.4 集群搭建升级版 五台集群
最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...
- 分布式实时日志系统(一)环境搭建之 Jstorm 集群搭建过程/Jstorm集群一键安装部署
最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...
- 基于Dokcer搭建Redis集群搭建(主从集群)
最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...
- Kubernetes集群搭建之Etcd集群配置篇
介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点. 简单 : 相比于晦涩难懂的paxos算法,etcd基于相对简单且易实现的raft算法实现一致性,并通过g ...
- mongodb分片集群(无副本集)搭建
数据分片节点#192.168.114.26#mongo.cnfport=2001dbpath=/data/mongodb/datalogpath=/data/mongodb/log/mongodb.l ...
- 【7.1.1】ELK集群搭建 之 ES集群
写在前边 昨天晚上就已经完成这篇博客了,就是在测试这块是否正常跑起来,晚上没搞完,上班前把电脑关机带着,结果没保存!基本上昨天写的东西都丢了,好在博客园的图片url还在. 为了让大家都轻松些,我轻松写 ...
随机推荐
- windows下git bash不显示中文问题解决
问题: 在git bash下输入git log,查看log记录的时候中文显示不出来 解决方案: 网上查了很多解决方法,逐个尝试 1.尝试 git config --global core.quotep ...
- 用cmd的方式执行exe程序
在asp.net中调用process.start执行程序,需要设置运行iis进程用户的权限,比较麻烦, MS的站点上有一篇说明:http://support.microsoft.com/default ...
- 2022-04-25内部群每日三题-清辉PMP
1.项目章程批准之后,项目经理开始使用储备分析进行预算工作.哪些文件支持这项工作? A.项目资金需求.成本基准和项目储备计划 B.范围基准.风险登记册和项目进度计划 C.质量管理计划.项目资金需求和风 ...
- 51定时器:0xee的由来
定时时间=(65536-初值)×(12/晶振频率) 因为51实验板的晶振为11.0592,所以 定时时间=(65536-初值)×(12/11.0592) 定时1ms:1000=(65536-初值)×( ...
- 牛客小白月赛65——D-牛牛取石子
链接:https://ac.nowcoder.com/acm/contest/49888/D来源:牛客网 牛牛和牛妹在玩游戏,他们的游戏规则是这样的: 一共有两堆石子,第一堆有 aaa 个,第二堆有 ...
- 简单a+b
1 # include <stdio.h> 2 3 /*输入两个整数a和b,计算a+b的和 4 注意此题是多组测试数据 */ 5 6 // 我的解法 7 void main(){ 8 in ...
- Linux 使用Apache服务部署静态网站
网站服务程序 我们平时访问的网站服务就是Web网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务.如图所示,Web网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求 ...
- 简单的IP网络
企业网络架构:小型.扁平化设计,特点:设备少,网络复杂度低,用路由器加交换或路由器就可以实现. 大中型,分层设计,接入层汇聚层核心层,特点:设备众多,网络组建复杂度高.终端设备较多,偏平化设计不适合. ...
- 20220712 第一小组 张明旭 JS学习记录
心情 今天是正式学习的第四天,感觉上午任务不是特别重,身心放松,知识点都掌握的不错:一到下午刚上课就画风突变,内容突然就男了,后来依旧是男上加男... 重点: 四大循环(理解) 内置函数(了解) 在s ...
- vue项目浏览器ioc小图标
1 先有一个需要图片,png .jpg ...格式都可以 2 把图片转换成 .con 格式的图标 ,http://www.bitbug.net/使用比特虫转换 ,目标尺寸:16*16 或者 32*3 ...