到MongoDB官网下载:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.6.tgz
为方便大家下载,这里也提供了本文所用的mongodb供大家免费下载
解压到/home/mongodb,设置环境变量:
echo 'export PATH=$PATH:/home/mongodb/bin' >> /etc/profile
保存后执行:
source /etc/profile
启动配置文件存放的文件夹: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 /home/mongodb/log/shard1.log
分片2服务日志存放文件:touch /home/mongodb/log/shard2.log
分片3服务日志存放文件:touch /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.conf
3:连接mongo,只需在任意一台机器执行即可:
mongo --host 10.211.55.3 --port 27018
切换数据库:
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
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 /export/server/mongoDb-5.0.8/conf/shard{1/2/3}.conf
这一步如果报错则参考下面做法:
上面的配置文件是直接从网上复制粘贴的,这里面有两个问题: 1、可能是想将存储引擎改成mmapv1,但是可能是粘贴错误,也可能是在前期定位过程中误改成了mmapv;
2、这是3.4版本的mongdb,从MongoDB3.2 版本开始,MongoDB默认的存储引擎就已经是WiredTiger,配置文件里面配置的data目录/usr/local/mongo/data是WiredTiger引擎的数据。当引擎改成mmapv1,data目录与WiredTiger引擎还指向同一个目录,就会报“ERROR: child process failed, exited with error number 100”的错。 因为WiredTiger引擎创建的数据目录无法用mmapv1引擎去打开。
所以将配置文件的“storageEngine=mmapv”注释掉,服务就正常启动了。
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/192.168.43.201:27001,192.168.43.202:27001,192.168.43.201:27001")
sh.addShard("shard2/192.168.43.201:27002,192.168.43.202:27002,192.168.43.203.5:27002")
sh.addShard("shard3/192.168.43.201:27003,192.168.43.202:27003,192.168.43.203:27003")
查看集群状态:
sh.status()
4、实现分片功能
设置分片chunk大小
use config
db.setting.save({"_id":"chunksize","value":1})
设置块大小为1M是方便实验,不然需要插入海量数据(默认是64(1~1024M),块越大查询越快,但对硬件要求更高)这里我设置的是128M
5、模拟写入数据
use calon
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
模拟往calon数据库的user表写入5万数据
6、启用数据库分片
sh.enableSharding("calon")
7、创建索引,对表进行分片
db.user.createIndex({"id":1}) # 以"id"作为索引
sh.shardCollection(calon.user",{"id":1}) # 根据"id"对user表进行分片
sh.status() # 查看分片情况
到此,MongoDB分布式集群就搭建完毕。
附加(为mongodb创建超级用户)
'''创建超级用户'''
# mongo //进入数据库
> use admin
> db.createUser({user: "用户名",pwd: "密码",roles: [ { role: "userAdminAnyDatabase", db: "admin" }]})
'''身份验证'''
> db.auth("用户名", "密码")
'''给用户对应数据库放权限'''
> db.grantRolesToUser("用户名", [ { role: "权限内容", db: "库名" } ])
权限内容包括:read,readWrite
参考网站1
参考网站2