mongodb集群之分片集群

目录

  • [1. 适用场景](#1. 适用场景)
  • [2. 集群搭建](#2. 集群搭建)

1. 适用场景

  • 数据量大影响性能

数据量大概达到千万级或亿级的时候,数据库相关的操作效率可能会下降,这时候可以考虑分片,减小压力

  • 部分数据迁移
    想要把当前数据库中某几个集合的一部分迁移出去时,可以借助分片的效果实现。这个需求一般优先考虑其他方法,因为搭建分片需要一点时间,而且事后需要恢复到原来的模式。所以建议只当成一种可选或备用方案,或者其他方案效率更低或者不可以用时可以考虑使用这个方法。

说明:上面仅为工作中遇到的场景,还有其他场景。

2. 集群搭建

如何搭建

1.资源规划

1)节点规划

官网介绍中mongodb分片式集群架构包含了router、config、shard三种不同类型的节点,他们之间的联系如下图:

图片源https://www.mongodb.com/zh-cn/docs/manual/sharding/

在官方文档中,给出了不同环境下节点个数的建议。对于正式环境,官方推荐方案如图,也就是说config、shard都要配置成副本集模式,且节点最好为3个以上,即推荐至少10个 节点,其中,config为3个节点以上的副本集群,shard1为3个节点以上的副本集群,shard2为3个节点以上的副本集群,router至少1个。

对于测试的话,至少需要三个节点,即router、config、shards各一个节点。

说明:configs、shards如果只配置一个节点也必须配置成副本集,如果不配置成副本集无法启动对应实例为configs、shards。

关于配置几个分片,官方也给了建议:

2)服务器资源规划

跟副本集一样,考虑服务器、端口、相关文件位置(一般会需要数据、日志、配置、pid等文件,数据和配置是必须的,其他的根据自己的需求),方便后续操作和运维。

  • 服务器:如果是迁移用可以根据实际情况选择,如果是业务用,一般选择多个服务器,而不是同一台服务器
  • 端口:一般使用默认端口27017,但有的时候为了安全或者端口已经被占用的情况,就需要根据实际需求和情况另选
  1. 配置conf文件
  2. 按顺序启动不同角色的mongodb实例
  3. 初始化config、shard集群信息
  4. 通过router进行分片配置

搭建实例

Linux搭建实例(待定)

Windows搭建实例

1.资源规划

1)节点规划:一个router、一个config集群(3个节点)、两个分片集群(每个集群3个节点)

2)服务器资源规划

以单台服务器为例进行测试

对应物理文件结构如下面的图,分别用于对应mongo实例的数据、配置文件、日志文件位置。


因为每个shard和config都使用了3个节点的集群,所以节点数量比较多,配置也相对较多。

2. 配置conf文件

这一步既是区分是否是集群,也是区分是什么集群的关键。在分片模式,router、config、shard的配置稍有差别,具体如下:

shard1配置文件

shell 复制代码
#mongodb端口
port=37027

#绑定ip,只有这个ip才可以访问上mongodb;0.0.0.0表示所有的都可以访问,如果要做安全管控可以限制ip
bind_ip=0.0.0.0

# 日志文件的路径
logpath=D:\mysoftware\MongoDB\zone\ser1\log\mongodb37027.log

# 数据文件的目录
dbpath=D:\mysoftware\MongoDB\zone\ser1\data0-1

#日志以追加的方式存在
logappend=true

# fork=true linux以后台方式启动,在window上没有用

# 此参数较大比较好,单位是 MB,默认是磁盘可用空间的 5%
oplogSize=1024

# 复制集的名称,同一个复制集的名称必须要相同
replSet=myreplace1

shard2只需要把replSet=myreplace1中的myreplace1换成对应副本集名称以及对应实例的端口、文件位置即可。

说明:这里对于充当shard的配置参数可以写在配置文件中,也可以在启动时加在启动命令上。

yml格式的配置:

yaml 复制代码
sharding:
# 指定当前节点在分片集群中的角色(shardsvr代表分片节点)
    clusterRole: shardsvr

启动命令指定:

shell 复制代码
mongod.exe --shardsvr --config "D:\mysoftware\MongoDB\zone\ser1\data0-1\s1config1.conf"

非yml格式如何配置
说明:这个还没试过,不确定对不对,要验证一下。

shell 复制代码
sharding.clusterRole = shardsvr

config集群配置文件:

shell 复制代码
bind_ip=0.0.0.0
port=27027
dbpath=D:\mysoftware\MongoDB\zone\config\c1
logpath=D:\mysoftware\MongoDB\zone\config\log\config1.log
logappend=true
replSet=config

# 这里加入configsvr参数配置,表名用于充当config
configsvr=true

oplogSize=1024

router配置文件:

router的配置中并没有dbpath,因为它只充当一个转发角色,并不实际存储数据,实际数据是来源于分片。

shell 复制代码
bind_ip=0.0.0.0
port=17017

# mongos.log 需要提前在 los 中建好
logpath=D:\mysoftware\MongoDB\zone\router\log\mongos17017.log
logappend=true
#这里使用的是config的ip和端口,所以可以先配置config的,再配router,不容易混乱
configdb=config/localhost:27027,localhost:27028,localhost:27029
3. 按顺序启动不同角色的mongodb实例

启动顺序:config、shard、router

启动config:

shell 复制代码
mongod.exe  --config "D:\mysoftware\MongoDB\zone\config\c1\config1.conf"

启动shard:

shell 复制代码
mongod.exe --shardsvr --config "D:\mysoftware\MongoDB\zone\ser1\data0-1\s1config1.conf"

注意事项:如果配置文件中没有配置是否充当shard,需要加上--shardsvr参数

启动router:

shell 复制代码
mongos.exe  --config "D:\mysoftware\MongoDB\zone\router\17017.conf"

注意事项:启动router的时候使用的是mongos而不是mongod,否则报错:

javascript 复制代码
Error parsing INI config file: unrecognised option 'configdb'
4. 初始化config、shard集群信息

shard1集群

javascript 复制代码
mongosh.exe --port 37027
javascript 复制代码
rs.initiate({
    _id : "myreplace1",
    members : [
    {_id : 0,host : "localhost:37027","priority":10},
    {_id : 1,host : "localhost7:37028"},
    {_id : 2,host : "localhost:37029"}]
});

shard2集群

javascript 复制代码
mongosh.exe --port 47027
javascript 复制代码
rs.initiate({
    _id : "myreplace2",
    members : [
    {_id : 0,host : "localhost:47027","priority":10},
    {_id : 1,host : "localhost:47028"},
    {_id : 2,host : "localhost7:47029"}]
});

config集群

javascript 复制代码
mongosh.exe --port 27027
javascript 复制代码
rs.initiate({
    _id : "config",
    members : [
    {_id : 0,host : "localhost:27027","priority":10},
    {_id : 1,host : "localhost:27028"},
    {_id : 2,host : "localhost:27029"}]
});
5. 通过router进行分片配置

进入router:

shell 复制代码
mongosh.exe --port 17017

添加分片1:

shell 复制代码
sh.addShard("myreplace1/localhost:37027,localhost:37028,localhost:37029")

添加分片2:

shell 复制代码
sh.addShard("myreplace2/localhost:47027,localhost:47028,localhost:47029")

说明:配置到spring boot中的话,直接配置router的信息就行,如果单独想用某个分片的,也可以配置对应分片的信息,都是连接的。

参考教程:

主要参考:https://www.cnblogs.com/niCong/p/17071290.html

这个主要参考通过conf文件配置实例角色:https://new-coder.com/pc/post/c48555c9362b

相关推荐
Watink Cpper2 小时前
[Redis] Redis:高性能内存数据库与分布式架构设计
linux·数据库·redis·分布式·架构
惜.己5 小时前
MySql(十)
数据库·mysql
lichenyang4538 小时前
使用react进行用户管理系统
数据库
木子.李3478 小时前
数据结构-算法学习C++(入门)
数据库·c++·学习·算法
Layux8 小时前
flowable候选人及候选人组(Candidate Users 、Candidate Groups)的应用包含拾取、归还、交接
java·数据库
@Turbo@9 小时前
【QT】在QT6中读取文件的方法
开发语言·数据库·qt
ArabySide9 小时前
【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
数据库·.net·efcore
线条111 小时前
Hive SQL 中 BY 系列关键字全解析:从排序、分发到分组的核心用法
数据库·hive·sql
字节源流11 小时前
【MYSQL】索引篇(一)
数据库·mysql
n33(NK)12 小时前
MySQL中count(1)和count(*)的区别及细节
数据库·mysql