环境要求
本次安装环境使用了三台乌班图虚拟机, 关于为什么搭建分片集群,想必这里不用多介绍了.肯定是因为数据量太大,不是一台机器所能承受的. 关于这些分片的理论知识可以去谷歌,后者 SB度
都可以,只是SB 度
都是千篇一律的文章,没有什么含金量..
咱们还是进行实战实战一下如何搭建高可用的mongodb集群:
首先确定各个组件的数量,mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例。这些实例可以部署在独立机器也可以部署在一台机器,我们这里资源有限,只准备了 3台机器,在同一台机器只要端口不同就可以,看一下物理部署图:
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,...}
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
三台机器上执行下面命令
然后执行下面命令
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"}]})
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
执行完毕之后,随便连接一台服务器,,这里连接的是
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"}]})
下面是执行效果
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
执行效果图
连接路由服务
/usr/local/server/mongodb/bin/mongo --host mdb1 --port 20000
执行以下命令,添加分片到集群
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")
下面进行测试,,
从图片中可以看出 分片1的数据非常的巨大,可以说是全部数据都在这里了..
下面我们做下改变
到这里基本上就已经成功了..是不是很简单呢... 其实摸索之后就感觉非常简单呢. 但是我这却摸索了一下午. 不过也算是有收获吧..小伙伴们赶紧抓紧搭建一下吧.
这里使用的是 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
完毕了..
这里搭建我遇到了很多未知的问题, 谷歌了很久,看官方文档学习,但还是错误摆出,但是这些并不能磨灭我的意志,最终功夫不负有心人啊..还是让我给搭建成功了...小伙伴们赶紧试试吧.