因为我是学习这个,所以是安装成功之后自己再记录一下过程,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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库