MongoDB集群搭建

本文详细介绍了如何在MongoDB中实现数据分片以处理高数据量和吞吐量的应用,包括垂直扩展和水平扩展策略,以及集群的搭建步骤,包括配置服务、路由服务、分片服务和副本集的创建和配置过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分片集群

高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。

  为了解决这些问题,有两个基本的方法: 垂直扩展和水平扩展。

    垂直扩展:增加更多的CPU和存储资源来扩展容量。

    水平扩展:将数据集分布在多个服务器上。水平扩展即分片。

原理介绍

分片(sharding)是MongoDB用来将大型集合分割到不同服务器(或者说一个集群)上所采用的方法。

例如,如果数据库1tb的数据集,并有4个分片,然后每个分片可能仅持有256 GB的数据。如果有40个分片,那么每个切分可能只有25GB的数据。

MongoDB中数据的分片是以集合为基本单位的,集合中的数据通过片键(Shard key)被分成多部分。其实片键就是在集合中选一个键,用该键的值作为数据拆分的依据。

一般片键采用范围或哈希的方式进行分片。

集群搭建

环境准备

先创建一个如下的目录结果:

  • 在root目录下创建mongodb目录。内部依次创建文件夹(node1,node2,node3)。

  • 在node1文件夹下创建:config-server1,mongos1,shard11,shard21文件夹

    • config-server1目录下创建backup,config,db文件夹

    • mongos1,shard11,shard21同上创建

  • 在node2和node3文件夹下创建

配置服务
创建容器

进入node1,node2,node3的config-serverx目录。执行docker命令创建并启动docker容器

配置服务1

#进入目录
cd /root/mongodb/node1/config-server1
#创建并启动容器。
docker run --restart=always --privileged=true -p 10021:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config1 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服务2

#进入目录
cd /root/mongodb/node2/config-server2
#创建并启动容器。
docker run --restart=always --privileged=true -p 10022:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config2 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all

配置服务2

#进入目录
cd /root/mongodb/node3/config-server3
#创建并启动容器。
docker run --restart=always --privileged=true -p 10023:27019 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --name pro-file-server-config3 mongo:4.0.0 -f /etc/mongod/config.conf --configsvr --replSet "rs-file-server-config-server" --bind_ip_all`
配置Mongo

将3个配置服务关联到一起

通过docker进入任意一台config-server配置三台服务器之间的联系

#进入pro-file-server-config1配置服务器
docker exec -it pro-file-server-config1 /bin/bash
#连接mongo 配置服务器暴露的默认端口为27019
mongo -port 27019
#执行配置内容
rs.initiate({
_id: "rs-file-server-config-server",
configsvr: true,
members: [
{ _id : 0,host : "192.168.136.163:10021" },
{ _id : 1,host : "192.168.136.163:10022" },
{ _id : 2, host : "192.168.136.163:10023" }
]
});
#查看状态
rs.status()
路由服务
创建容器

mongos1

#进入目录
cd /root/mongodb/node1/mongos1
#创建并启动容器。
docker run --restart=always --privileged=true -p 10011:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos1 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

mongos2

#进入目录
cd /root/mongodb/node2/mongos2
#创建并启动容器。
docker run --restart=always --privileged=true -p 10012:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos2 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all

mongos3

#进入目录
cd /root/mongodb/node3/mongos3
#创建并启动容器。
docker run --restart=always --privileged=true -p 10013:27017 -v $PWD/config:/etc/mongod -v $PWD/db:/data/db -d --entrypoint mongos --name pro-file-server-mongos3 mongo:4.0.0 -f /etc/mongod/config.conf --configdb rs-file-server-config-server/192.168.50.100:10021,192.168.50.100:10022,192.168.50.100:10023 --bind_ip_all
配置Mongo

通过docker进入任意一台mongos配置三台服务器之间的联系

#进入pro-file-server-mongos1服务器
docker exec -it pro-file-server-mongos1 /bin/bash
#连接mongo
mongo -port 27018
#执行配置内容
sh.addShard("rs-file-server-shard1-server/192.168.136.163:10031,192.168.136.163:10032,192.168.136.163:10033")
sh.addShard("rs-file-server-shard2-server192.168.136.163:10041,192.168.136.163:10042,192.168.136.163:10043")
分片服务
创建容器

分片服务share11

cd /root/mongodb/node1/shard21
docker run --restart=always --privileged=true -p 10041:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard21 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all

分片服务share12

cd /root/mongodb/node2/shard22
docker run --restart=always --privileged=true -p 10042:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard22 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all

分片服务share13

cd /root/mongodb/node3/shard23
docker run --restart=always --privileged=true -p 10043:27018 -v $PWD/config:/etc/mongod -v $PWD/backup:/data/backup -v $PWD/db:/data/db -d --name pro-file-server-shard23 mongo:4.0.0 -f /etc/mongod/config.conf --shardsvr --replSet "rs-file-server-shard2-server" --bind_ip_all
配置Mongo

通过docker进入任意一台share配置三台服务器之间的联系

#进入pro-file-server-shard21服务器
docker exec -it pro-file-server-shard21 /bin/bash
#连接mongo
mongo -port 27018
#执行配置内容
`rs.initiate({
_id: "rs-file-server-shard2-server",
members: [
{ _id : 0, host : "192.168.136.163:10041" },
{ _id : 1, host : "192.168.136.163:10042" },
{ _id : 2, host : "192.168.136.163:10043" }
]
});`
#查看状态
rs.status()
分片配置
#mongodb客户端连接
mongo 192.168.136.163:10011

#创建分片数据库test
sh.enableSharding("test")

#将collection加入分片并设置分片字段
sh.shardCollection("test.user", {"_id": "hashed" })

服务器说明

路由服务

IP端口
192.168.136.16310011
192.168.136.16310012
192.168.136.16310013

配置服务

IP端口
192.168.136.16310021
192.168.136.16310022
192.168.136.16310023

分片服务

分片服务01分片服务02
192.168.136.163:10031192.168.136.163:10041
192.168.136.163:10032192.168.136.163:10042
192.168.136.163:10033192.168.136.163:10043

副本集群

对于中小型项目,使用副本集群就够了。

一个主,两个从库组成,主库宕机时,这两个从库都可以被选为主库。

当主库宕机后,两个从库都会进行竞选,其中一个变为主库,当原主库恢复后,作为从库加入当前的复制集群即可。

原理解释

Master:代表主节点,主节点提供所有数据的CRUD服务

Backup:代表从节点,从节点不提供任何服务

Arbitration:代表仲裁节点,仲裁节点不存储任何数据,其主要作用就是当主节点挂掉以后,把那个备份节点提升为一个主节点。

集群搭建

创建容器

docker run -di --name=master_mongo  -p 27017:27017 mongo:4.0.3  --replSet mongo_clus 
docker run -di --name=backup_mongo1 -p 27018:27017 mongo:4.0.3  --replSet mongo_clus 
docker run -di --name=backup_mongo2 -p 27019:27017 mongo:4.0.3  --replSet mongo_clus

设置副本集名称,也就是设置集群名称,必须要设置,否则没法构建集群

配置

进入master_mongo容器中

docker exec  -it master_mongo /bin/bash

登录Mongo

mongo -port 27017

创建集群

cfg={
  "_id":"mongo_clus",
  members:[{
      _id:0,
      host:"192.168.136.161:27017",
      priority:2
  },{
      _id:1,
      host:"192.168.136.161:27018",
      priority:1
  },{
      _id:2,
      host:"192.168.136.161:27019",
      priority:2
  }]
}
rs.initiate(cfg)

注意修改ip地址

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值