MongoDB 集群分片搭建

环境要求

本次安装环境使用了三台乌班图虚拟机, 关于为什么搭建分片集群,想必这里不用多介绍了.肯定是因为数据量太大,不是一台机器所能承受的. 关于这些分片的理论知识可以去谷歌,后者 SB度 都可以,只是SB 度都是千篇一律的文章,没有什么含金量..

咱们还是进行实战实战一下如何搭建高可用的mongodb集群:
首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:

《MongoDB 集群分片搭建》 架构图.png

1、下载 mongodb
https://www.mongodb.com/ 这里下载就不多介绍了, 下载使用的相应版本就 OK 了,这里使用的是乌班图版本,版本号是3.4.2.

2、准备机器,IP分别设置为:172.16.174.145(mdb1),172.16.174.146(mdb2),172.16.174.147(mdb3),并分别创建mongos 、config 、 shard1 、shard2、shard3对应目录

分别在mdb1,mdb2,mdb3 三台机器上执行以下命令:
#建立mongos及日志目录
sudo  mkdir -p /data/mongodb/mongos/log
#建立config server 数据文件存放目录
sudo mkdir -p /data/mongodb/config/data
#建立config server 日志文件存放目录
sudo mkdir -p /data/mongodb/config/log
#建立shard1 数据文件存放目录
sudo mkdir -p /data/mongodb/shard1/data
#建立shard1 日志文件存放目录
sudo mkdir -p /data/mongodb/shard1/log
#建立shard2 数据文件存放目录
sudo mkdir -p /data/mongodb/shard2/data
#建立shard2 日志文件存放目录
sudo mkdir -p /data/mongodb/shard2/log
#建立shard3 数据文件存放目录
sudo mkdir -p /data/mongodb/shard3/data
#建立shard3 日志文件存放目录
sudo mkdir -p /data/mongodb/shard3/log

或者可以使用这条简单的命令创建
mkdir - p /data/mongodb/{filename1,filename2,...}

《MongoDB 集群分片搭建》 目录格式

2、规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文 mongos为 20000, config server 为 21000, shard1为 22001 , shard2为22002, shard3为22003.

3、本文的 mongodb 存放目录是在 /usr/local/server/mongodb 目录中.
当准备工作都做好之后,分别在mdb1,mdb2,mdb3三台机器上执行下面命令

《MongoDB 集群分片搭建》 执行成功

然后执行下面命令

sudo /usr/local/server/mongodb/bin/mongo --host  mdb1 --port 21000 , 

(这里可以随便连接一台服务器,我这里就连接第一台了)执行.下面语句

rs.initiate({_id:"cfgReplSet",configsvr:true,
          members:[{_id:0,host:"mdb1:21000"},
                   {_id:1,host:"mdb2:21000"},
                   {_id:2,host:"mdb3:21000"}]})

《MongoDB 集群分片搭建》 执行成功

4、在每一台服务器分别启动分片及副本集。(后台运行)在每一台服务器分别以副本集方式启动分片,执行以下命令

 sudo /usr/local/server/mongodb/bin/mongod --shardsvr --replSet shard1ReplSet --port 22001 --dbpath /data/mongodb/shard1/data --logpath /data/mongodb/shard1/log/shard1.log --fork --nojournal
 sudo /usr/local/server/mongodb/bin/mongod --shardsvr --replSet shard2ReplSet --port 22002 --dbpath /data/mongodb/shard2/data --logpath /data/mongodb/shard2/log/shard2.log --fork --nojournal
 sudo /usr/local/server/mongodb/bin/mongod --shardsvr --replSet shard3ReplSet --port 22003 --dbpath /data/mongodb/shard3/data --logpath /data/mongodb/shard3/log/shard3.log --fork --nojournal

《MongoDB 集群分片搭建》 执行完毕

执行完毕之后,随便连接一台服务器,,这里连接的是

mdb1  
 首先执行 sudo /usr/local/server/mongodb/bin/mongo --host mdb1 --port 22001  
 rs.initiate({_id:"shard1ReplSet",
          members:[{_id:0,host:"mdb1:22001"},
                   {_id:1,host:"mdb2:22001"},
                   {_id:2,host:"mdb3:22001"}]})
其次执行 sudo /usr/local/server/mongodb/bin/mongo --host mdb1 --port 22002 
 rs.initiate({_id:"shard2ReplSet",
          members:[{_id:0,host:"mdb1:22002"},
                   {_id:1,host:"mdb2:22002"},
                   {_id:2,host:"mdb3:22002"}]})
最后执行 sudo /usr/local/server/mongodb/bin/mongo --host mdb1 --port 22003 
 rs.initiate({_id:"shard3ReplSet",
          members:[{_id:0,host:"mdb1:22003"},
                   {_id:1,host:"mdb2:22003"},
                   {_id:2,host:"mdb3:22003"}]})

下面是执行效果

《MongoDB 集群分片搭建》 首先
《MongoDB 集群分片搭建》 其次
《MongoDB 集群分片搭建》 最后

5、选择一台服务器当做 mongos路由服务

  sudo  /usr/local/server/mongodb/bin/mongos  --configdb cfgReplSet/mdb1:21000,mdb2:21000,mdb3:21000 --port  20000  --logpath  /data/mongodb/mongos/log/mongos.log --fork 

执行效果图

《MongoDB 集群分片搭建》 选举路由服务.png

连接路由服务

    /usr/local/server/mongodb/bin/mongo --host mdb1 --port 20000

《MongoDB 集群分片搭建》 登录路由服务

 执行以下命令,添加分片到集群
 sh.addShard("shard1ReplSet/mdb1:22001,mdb2:22001,mdb3:22001")
 sh.addShard("shard2ReplSet/mdb1:22002,mdb2:22002,mdb3:22002")
 sh.addShard("shard3ReplSet/mdb1:22003,mdb2:22003,mdb3:22003")

《MongoDB 集群分片搭建》 执行成功

下面进行测试,,

《MongoDB 集群分片搭建》 通过客户端

从图片中可以看出 分片1的数据非常的巨大,可以说是全部数据都在这里了..
下面我们做下改变

《MongoDB 集群分片搭建》 改变之后的.png
《MongoDB 集群分片搭建》 改变之后的.png

到这里基本上就已经成功了..是不是很简单呢… 其实摸索之后就感觉非常简单呢. 但是我这却摸索了一下午. 不过也算是有收获吧..小伙伴们赶紧抓紧搭建一下吧.

这里使用的是 java 语言.. springboot 框架

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.database=mdb
spring.data.mongodb.host=172.16.174.147
spring.data.mongodb.port=20000  #这里端口就写路由的端口.
spring.data.mongodb.username=root
spring.data.mongodb.password=root
spring.data.mongodb.write-concern=SAFE
spring.data.mongodb.connections-per-host=10
spring.data.mongodb.threads-allowed-to-block-for-connection-multiplier=5
spring.data.mongodb.connect-timeout=5000
spring.data.mongodb.heartbeat-frequency=2000
spring.data.mongodb.heartbeat-connect-timeout=10000
spring.data.mongodb.heartbeat-socket-timeout=10000
spring.data.mongodb.socket-timeout=0
spring.data.mongodb.max-wait-time=1500
mongodb.socket-keep-alive=true

《MongoDB 集群分片搭建》 连接成功.png
《MongoDB 集群分片搭建》 保存并查询完毕

完毕了..
这里搭建我遇到了很多未知的问题, 谷歌了很久,看官方文档学习,但还是错误摆出,但是这些并不能磨灭我的意志,最终功夫不负有心人啊..还是让我给搭建成功了…小伙伴们赶紧试试吧.

    原文作者:PrimaryKeyEnoch
    原文地址: https://www.jianshu.com/p/d5e693f99760
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞