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还在. 为了让大家都轻松些,我轻松写 ...
随机推荐
- vue 页面嵌入pdf文件
1.pdf分页显示 2.没有分页
- 在项目中配置proxy 解决调试过程中的跨域问题
- Unity 纯C# 完成 APK从下载到 自安装
最简单的就是用androidStudio 进行编辑,打个aar 包,在Unity中调用方法,很便捷以下内容均转载Unity论坛,Android API24版本下可用,android API 24以上版 ...
- 【SQL Server】列名首字母大写
使用UPPER 和 LOWWER函数组合首字母大写.例如: 1 SELECT user_id,(UPPER(LEFT(name,1) ) + RIGHT(name , LEN(name) -1) )A ...
- jquery的网络引用地址
http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min ...
- 第九章 MySQL 高可用(MHA)
MySQL 高可用(MHA) 一 MHA高可用部署 需要使用的前提: 当普通主从复制不能满足我们的需求, 主节点宕机 影响业务的不间断运行.这里就需要用到MHA 高可用 1. MHA高可用的介绍 ...
- 【Java】时间类型
Date 转 timeStamp long time = System.currentTimeMillis(); // 秒级 long time = System.currentTimeMillis( ...
- mysql-8.0.28-winx64数据库win10系统安装步骤
一.官网下载安装包 下载地址:https://dev.mysql.com/downloads/mysql/ ↓↓↓选择如下图版本↓↓↓ 二.解压安装包到本地 三.新建记事本创建my.ini配置文件 四 ...
- 简单的WPF客户端应用开发
1.使用vs创建一个新项目,选择wpf应用 2.创建好项目,在视图=>工具箱,选择要使用的部件 3.单击部件可以改变部件的显示信息,即content的内容就是显示的信息,name为部件的名称,在 ...
- 命令提示符怎么打开和Dos命令的基本使用
Dos命令 Dos命令窗口我们可以通过win+R输入cmd来打开 如果要用管理员身份打开直接在开始里搜索命令提示符,以管理员身份打开! 一些简单的Dos命令 //切换盘符 盘符名: //进入 cd / ...