搭建之前先了解一下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 270022700310.211.55.427017 27018 27001 270022700310.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.02、配置复制集
分别启动三台服务器的配置服务:
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}.conf2、将分片配置为复制集
连接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
------------------------------------------------------------ 分割线 ------------------------------------------------------------------------------
提出疑问:以上部署的方法,默认的架构如下图所示:
整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的192.168.0.138相当空闲。让机器3 192.168.0.138多分担点责任吧!架构可以这样调整,把机器的负载分的更加均衡一点,每个机器既可以作为主节点、副本节点、仲裁节点,这样压力就会均衡很多了
架构调整如下图:
则分片规则调整如下:
调成为上面之后。
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: <sizeInMB> } )
实际修改:
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/