MongoDB4.0搭建分布式集群

    xiaoxiao2023-10-21  28

    搭建之前先了解一下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.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

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

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

                         

    整个分片集群搭建完了,思考一下我们这个架构是不是足够好呢?其实还有很多地方需要优化,比如我们把所有的仲裁节点放在一台机器,其余两台机器承担了全部读写操作,但是作为仲裁的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/

     

    最新回复(0)