MongoDB4.0搭建分布式集群

搭建之前先了解一下MongoDB分片群集主要有如下三个组件:

Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障。
Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息。
Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用。
 

系统环境

Centos7.5、MongoDB4.0.9、关闭防火墙。

IP  路由服务端口配置服务端口分片1端口 分片2端口分片3端口
10.211.55.327017  27018  27001  2700227003
10.211.55.427017  27018 27001  2700227003
10.211.55.527017  27018 27001  2700227003


三台机器的配置服务(27018)形成复制集,分片1、2、3也在各机器都部署一个实例,它们之间形成复制集,客户端直接连接3个路由服务与之交互,配置服务和分片服务对客户端是透明的。

服务器的安装及配置(3台服务器执行相同操作)

1、下载解压MongoDB

到MongoDB官网下载:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz

解压到/home/mongodb,设置环境变量:

export PATH=$PATH:/home/mongodb/bin


保存后执行:

srouce /etc/profile


2、创建路由、配置、分片等的相关目录与文件

启动配置文件存放的文件夹:mkdir -p /home/mongodb/conf
配置服务数据存放目录:mkdir -p /home/mongodb/data/config
分片1服务数据存放目录:mkdir -p /home/mongodb/data/shard1
分片2服务数据存放目录:mkdir -p /home/mongodb/data/shard2
分片3服务数据存放目录:mkdir -p /home/mongodb/data/shard3
配置服务日志存放文件:touch  /home/mongodb/log/config.log
路由服务日志存放文件:touch  /home/mongodb/log/mongos.log
分片1服务日志存放文件:touch -p /home/mongodb/log/shard1.log
分片2服务日志存放文件:touch -p /home/mongodb/log/shard2.log
分片3服务日志存放文件:touch -p /home/mongodb/log/shard3.log

配置服务器部署(3台服务器执行相同操作)

1、在/home/mongodb/conf目录创建config.conf:

dbpath=/home/mongodb/data/config
logpath=/home/mongodb/log/config.log
port=27018
logappend=true
fork=true
maxConns=5000
#复制集名称
replSet=configs
#置参数为true
configsvr=true
#允许任意机器连接
bind_ip=0.0.0.0


2、配置复制集

分别启动三台服务器的配置服务: 

mongod -f /home/mongodb/conf/config.con


连接mongo,只需在任意一台机器执行即可:

mongod -f /home/mongodb/conf/config.con


切换数据库:

use admin


初始化复制集:

rs.initiate({_id:"configs",members:[{_id:0,host:"10.211.55.3:27018"},{_id:1,host:"10.211.55.4:27018"}, {_id:2,host:"10.211.55.5:27018"}]})


其中_id:"configs"的configs是上面config.conf配置文件里的复制集名称,把三台服务器的配置服务组成复制集。

查看状态:

rs.status()


等几十秒左右,执行上面的命令查看状态,三台机器的配置服务就已形成复制集,其中1台为PRIMARY,其他2台为SECONDARY。

分片服务部署(3台服务器执行相同操作)

1、在/home/mongodb/conf目录创建shard1.conf、shard2.conf、shard3.conf,内容如下:        

dbpath=/home/mongodb/data/shard1 #其他2个分片对应修改为shard2、shard3文件夹
logpath=/home/mongodb/log/shard1.log #其他2个分片对应修改为shard2.log、shard3.log
port=27001 #其他2个分片对应修改为27002、27003
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
replSet=shard1 #其他2个分片对应修改为shard2、shard3
bind_ip=0.0.0.0


端口分别是27001、27002、27003,分别对应shard1.conf、shard2.conf、shard3.conf。

还有数据存放目录、日志文件这几个地方都需要对应修改。

在3台机器的相同端口形成一个分片的复制集,由于3台机器都需要这3个文件,所以根据这9个配置文件分别启动分片服务:

mongod -f /home/mongodb/conf/shard{1/2/3}.conf


2、将分片配置为复制集

连接mongo,只需在任意一台机器执行即可:

mongo --host 10.211.55.3 --port 27001 //这里以shard1为例,其他两个分片则再需对应连接到27002、27003的端口进行操作即可


切换数据库:

use admin


初始化复制集:

rs.initiate({_id:"shard1",members:[{_id:0,host:"10.211.55.3:27001"},{_id:1,host:"10.211.55.4:27001"},{_id:2,host:"10.211.55.5:27001"}]})


以上是基于分片1来操作,同理,其他2个分片也要连到各自的端口来执行一遍上述的操作,让3个分片各自形成1主2从的复制集,注意端口及仲裁节点的问题即可,操作完成后3个分片都启动完成,并完成复制集模式。

路由服务部署(3台服务器执行相同操作)

1、在/home/mongodb/conf目录创建mongos.conf,内容如下:        

logpath=/home/mongodb/log/mongos.log
logappend = true
port = 27017
fork = true
configdb = configs/10.211.55.3:27018,10.211.55.4:27018,10.211.55.5:27018
maxConns=20000
bind_ip=0.0.0.0

2、启动mongos

分别在三台服务器启动:

mongos -f /home/mongodb/conf/mongos.conf

3、启动分片功能

连接mongo:

mongo --host 10.211.55.3 --port 27017


切换数据库:

use admin


添加分片,只需在一台机器执行即可:        

sh.addShard("shard1/10.211.55.3:27001,10.211.55.4:27001,10.211.55.5:27001")
sh.addShard("shard2/10.211.55.3:27002,10.211.55.4:27002,10.211.55.5:27002")
sh.addShard("shard3/10.211.55.3:27003,10.211.55.4:27003,10.211.55.5:27003")


查看集群状态:

sh.status()

4、实现分片功能

设置分片chunk大小        

use config
db.settings.save({"_id":"chunksize","value":1}) # 设置块大小为1M是方便实验,不然需要插入海量数据

5、模拟写入数据        

use calon
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})} #模拟往calon数据库的user表写入5万数据

7、启用数据库分片

sh.enableSharding("calon")

8、创建索引,对表进行分片        

db.user.createIndex({"id":1}) # 以"id"作为索引
sh.shardCollection("calon.user",{"id":1})  # 根据"id"对user表进行分片
sh.status() # 查看分片情况

到此,MongoDB分布式集群就搭建完毕。

本博客仅当笔记摘录留存

原博主地址:https://blog.csdn.net/kevinmcy/article/details/82712074

------------------------------------------------------------  分割线  ------------------------------------------------------------------------------

提出疑问:以上部署的方法,默认的架构如下图所示:

                     fenpian5

整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.0.138相当空闲。让机器3 192.168.0.138多分担点责任吧!架构可以这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了

架构调整如下图:

                      fenpian6

则分片规则调整如下:

调成为上面之后。

3.3.3.6 上的分片 shard1.conf 、 shard2.conf 、 shard3.conf  则监听端口改变

shard1.conf  监听: 27001 

shard2.conf  监听: 27003 

shard3.conf  监听: 27002

3.3.3.7上的分片

shard1.conf  监听: 27003 

shard2.conf  监听: 27002 

shard3.conf  监听: 27001

3.3.3.8上的分片

shard1.conf  监听: 27002 

shard2.conf  监听: 27001 

shard3.conf  监听: 27003

将分片配置为复制集则改为以下方式:

rs.initiate({_id:"shard1",members:[{_id:0,host:"3.3.3.6:27001"},{_id:1,host:"3.3.3.7:27003"},{_id:2,host:"3.3.3.8:27002"}]})


rs.initiate({_id:"shard2",members:[{_id:0,host:"3.3.3.7:27002"},{_id:1,host:"3.3.3.8:27001"},{_id:2,host:"3.3.3.6:27003"}]})


rs.initiate({_id:"shard3",members:[{_id:0,host:"3.3.3.8:27003"},{_id:1,host:"3.3.3.7:27001"},{_id:2,host:"3.3.3.6:27002"}]})

--------------------------------------------------------分割线------------------------------------------------------------------

关于 chunksize:

查看当前分片 chunksize大小

一、登录:

##  mongo --host 172.16.13.16 --port 27017

mongos>  use config
switched to db config

mongos>    db.settings.find()   或   db.settings.find({"_id":"chunksize"})

{ "_id" : "chunksize", "value" : 64 }

设置分片chunk大小       

####为了展示出效果,修改一下默认的chunksize大小,这里修改为1M
#默认的chunksize大小为64M,示例修改命令如下:

#use config
#db.settings.save( { _id:"chunksize", value: } )


实际修改:

use config
db.settings.save({"_id":"chunksize","value":46})

默认是64MB,取值范围是1 MB 到 1024 MB.

那修改会造成什么?下表简单总结:

chunk size 调节    splitting次数(碎片数)    数据跨shard数目    数据均匀    网络传输次数    migration次数    单次migration 传输量    查询速度

在数据量很大的情况下,考虑网络带宽,如果发现带宽占满,可以考虑调小chunk size,这样migration造成的传输量会降低

在服务器硬件很好的情况下,比如我的服务器cpu 24 core, memory 128 GB, disk 96 TB. 考虑调大chunk size,减少不必要的分片
 

官方配置参考链接:http://docs.mongodb.org/manual/tutorial/modify-chunk-size-in-sharded-cluster/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是搭建MongoDB分布式集群的步骤: 1.下载MongoDB二进制文件并解压缩到三台服务器上。 2.在三台服务器上创建数据目录和日志目录,并分别启动三个配置服务器。 ```shell # 创建数据目录和日志目录 mkdir -p /data/mongodb/configdb /data/mongodb/shard1/rs0 /data/mongodb/shard2/rs0 /data/mongodb/shard3/rs0 mkdir -p /var/log/mongodb/configdb /var/log/mongodb/shard1/rs0 /var/log/mongodb/shard2/rs0 /var/log/mongodb/shard3/rs0 # 启动三个配置服务器 mongod -f /home/mongodb/conf/config.conf ``` 3.在三台服务器上启动三个路由器。 ```shell mongos --configdb configserver1:27019,configserver2:27019,configserver3:27019 ``` 4.在三台服务器上启动三个分片服务器。 ```shell # 启动分片服务器1 mongod --shardsvr --replSet rs0 --dbpath /data/mongodb/shard1/rs0 --logpath /var/log/mongodb/shard1/rs0.log --port 27017 # 启动分片服务器2 mongod --shardsvr --replSet rs0 --dbpath /data/mongodb/shard2/rs0 --logpath /var/log/mongodb/shard2/rs0.log --port 27018 # 启动分片服务器3 mongod --shardsvr --replSet rs0 --dbpath /data/mongodb/shard3/rs0 --logpath /var/log/mongodb/shard3/rs0.log --port 27019 ``` 5.在其中一个分片服务器上初始化副本集。 ```shell mongo --port 27017 rs.initiate() ``` 6.将其他两个分片服务器加入到副本集中。 ```shell rs.add("shard2:27018") rs.add("shard3:27019") ``` 7.将三个分片服务器添加到路由器中。 ```shell mongos> sh.addShard("rs0/shard1:27017,shard2:27018,shard3:27019") ``` 至此,MongoDB分布式集群搭建完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值