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

相关推荐
小高Baby@8 分钟前
解决幻读问题
数据库·mysql
TDengine (老段)11 分钟前
TDengine 转化函数 TO_TIMESTAMP 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
java叶新东老师32 分钟前
CMakelists.txt 实现多级目录编译
java·服务器·数据库
Sean_summer35 分钟前
暑期第二周
前端·数据库·python
whn19771 小时前
达梦有多少个模式
数据库
王柏龙1 小时前
Entity Framework Core (EF Core) 中Database
数据库·microsoft
时序数据说1 小时前
时序数据库IoTDB的优势场景分析
大数据·数据库·物联网·时序数据库·iotdb
是阿建吖!1 小时前
【Redis】初识Redis(定义、特征、使用场景)
数据库·redis·缓存
Leo.yuan1 小时前
数据处理工具是做什么的?常见数据处理方法介绍
大数据·数据库·人工智能·python·信息可视化
旧时光巷2 小时前
SQL基础⑫ | 视图篇
数据库·sql·学习·mysql·oracle·视图