勿以浮沙筑高台
基础准备:
搭建三台Linux服务器,其中109配置mongodb。见文章:
副本集搭建
MongoDB集群搭建
- 配置conf配置文件
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # where to write logging data # 日志文件路径配置. systemLog: destination: file logAppend: true path: /usr/local/mongodb/log/mongod.log # Where and how to store data. # 数据文件路径配置. storage: dbPath: /usr/local/mongodb/data journal: enabled: true # engine: # wiredTiger: # how the process runs processManagement: # fork代表后台运行 fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo # network interfaces net: # 端口 port: 27017 # bindIp改为任意IP访问 bindIp: 0.0.0.0 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, # alternatively, use the net.bindIpAll setting. ### 添加授权,授权要注释掉 # security: # authorization: enabled ### 副本集参数 replication: replSetName: rs0
- 将文件发送至108,107,2台机器
scp -r /usr/local/mongodb/ root@192.168.31.107:/usr/local scp -r /usr/local/mongodb/ root@192.168.31.108:/usr/local
- 创建进程文件路径,进程文件路径是默认不创建的,三台都要创建
mkdir -p /var/run/mongodb
- 启动三台服务器
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/conf/mongod.conf
- 启动客户端,通过IP链接,不要直接启动,直接启动链接的是127.0.0.1.外网访问不到
/usr/local/mongodb/bin/mongo 192.168.31.109:27018
- 初始化链接,建立主从关系
##第一种方式 rs.initiate(); rs.add("192.168.31.107:27017"); rs.add("192.168.31.108:27017"); ##第二种方式 >rs.initiate({ _id:"rs0", members:[ {_id:0,host:"192.168.31.109:27017"}, {_id:1,host:"192.168.31.108:27017"}, {_id:2,host:"192.168.31.107:27017"}] } )
- 查看主从关系
rs.status()
- 验证是否成功
在从机器上启动客户端并执行脚本,开启查询配置use testdb db.users.save({name:"张三",age:19});
2台机子查询出数据即成功。/usr/local/mongodb/bin/mongo 192.168.31.108:27017 db.getMongo().setSlaveOk(); #开启查询配置 use testdb db.users.find()
分片集搭建
基础概念
同样准备3台Linux虚拟机,分别是109,108,107。
因为理解不像主从关系这么简单,因此画了个图:
在mongodb集群中有三个集群结构。
路由集群(mongos):
负责请求消息的分发与每个分片集群都有关系,并与配置服务的主集群有关系。将请求分发到每一个shard上。
配置服务集群(coing server):
主要是负责分片数据和路由数据的配置文件的管理与每一个路由和每个分片的主有联系,当配置服务发生变化会通知config更新。mongos 本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos 第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货,mongodb 集群就不会挂掉。
分片集群(shard):
负责数据的分片。比如750MB的数据,分片下来就是250MB的数据,减少数据库的压力
配置服务器(configs-server)配置
- 创建文件夹
# 创建集群文件夹 /usr/local/mongodb-cluster/ # 创建分片文件夹 /usr/local/mongodb-cluster/shard/ /usr/local/mongodb-cluster/shard/log #分片日志 /usr/local/mongodb-cluster/shard/config #分片配置文件夹 /usr/local/mongodb-cluster/shard/data #分片进程文件文件夹 # 创建配置服务器文件夹 /usr/local/mongodb-cluster/configs/ /usr/local/mongodb-cluster/configs/log #分片日志 /usr/local/mongodb-cluster/configs/config #分片配置文件夹 /usr/local/mongodb-cluster/configs/data #分片进程文件文件夹 # 创建路由文件夹 # 日志 /usr/local/mongodb-cluster/mongos/log /usr/local/mongodb-cluster/mongos/conf # 将mongodb源文件copy到集群文件夹下 cp /usr/local/mongodb/ /usr/local/mongodb-cluster
- 配置服务启动文件
cd /usr/local/mongodb-cluster/configs/conf/ #编辑配置文件 vim config.conf
systemLog: destination: file path: "/usr/local/mongodb-cluster/configs/log/config-server.log" logAppend: true storage: journal: enabled: true dbPath: "/usr/local/mongodb-cluster/configs/data/" net: # 真实环境这里改为本机IP,这里的改为让任意访问 bindIp: 0.0.0.0 port: 27018 replication: oplogSizeMB: 2048 replSetName: configs sharding: clusterRole: configsvr processManagement: fork: true
- 将整个mongodb-cluster集群文件夹发送到另外2台服务器上
scp -r /usr/local/mongodb-cluster root@192.168.31.108:/usr/local/ scp -r /usr/local/mongodb-cluster root@192.168.31.107:/usr/local/
- 启动3台配置服务器(configs-server)主机
/usr/local/mongodb-cluster/mongodb/bin/mongod -f /usr/local/mongodb-cluster/configs/conf/config.conf
- 登录任意一台服务器主机。添加configs-server的主从关系
配置成功# 登录操作客户端 /usr/local/mongodb-cluster/mongodb/bin/mongo --host 192.168.31.109 --port 27018 # 配置主从关系 rs.initiate({_id:"configs",members:[{_id:0,host:"192.168.31.109:27018"},{_id:1,host:"192.168.31.107:27018"}, {_id:2,host:"192.168.31.108:27018"}]})
# 查看配置状态 rs.status();
分片服务器(shard)配置
-
编写配置文件,这样的配置文件修改为三份。
# cd /usr/local/mongodb-cluster/shard/config/ # vim shard1.conf # vim shard2.conf # vim shard3.conf
systemLog: destination: file # 这里需要根据配置更改 改 path: "/usr/local/mongodb-cluster/shard/log/shard1.log" logAppend: true storage: journal: enabled: true # 这里需要根据配置更改 改 dbPath: "/usr/local/mongodb-cluster/shard/data/shard1" processManagement: fork: true net: # 改为任意访问IP bindIp: 0.0.0.0 # 这里需要根据配置更改 改 port: 27001 setParameter: enableLocalhostAuthBypass: false replication: # 分片集群ID 改 replSetName: "rs1" sharding: #角色 clusterRole: shardsvr
-
将配置文件发送到其他2台电脑上
scp -r /usr/local/mongodb-cluster/shard/config/ root@192.168.31.107:/usr/local/mongodb-cluster/shard/config/ scp -r /usr/local/mongodb-cluster/shard/config/ root@192.168.31.108:/usr/local/mongodb-cluster/shard/config/
-
启动分片服务,一台机子上3个服务。(三台机子都要执行这个命令)
/usr/local/mongodb-cluster/mongodb/bin/mongod -f /usr/local/mongodb-cluster/shard/config/shard1.conf /usr/local/mongodb-cluster/mongodb/bin/mongod -f /usr/local/mongodb-cluster/shard/config/shard2.conf /usr/local/mongodb-cluster/mongodb/bin/mongod -f /usr/local/mongodb-cluster/shard/config/shard3.conf
-
任意登录2700X端口,服务器客户端,给分片服务器添加主从关系。
# 登录 27001 分片服务 /usr/local/mongodb-cluster/mongodb/bin/mongo --host 192.168.31.109 --port 27001 # 添加主从关系 rs.initiate({_id:"rs1",members:[{_id:0,host:"192.168.31.109:27001"},{_id:1,host:"192.168.31.108:27001"},{_id:2,host:"192.168.31.107:27001"}]}) # 登录 27002分片服务 /usr/local/mongodb-cluster/mongodb/bin/mongo --host 192.168.31.109 --port 27002 # 添加主从关系 rs.initiate({_id:"rs2",members:[{_id:0,host:"192.168.31.109:27002"},{_id:1,host:"192.168.31.108:27002"},{_id:2,host:"192.168.31.107:27002"}]}) # 登录 27003分片服务 /usr/local/mongodb-cluster/mongodb/bin/mongo --host 192.168.31.109 --port 27003 # 添加主从关系 rs.initiate({_id:"rs3",members:[{_id:0,host:"192.168.31.109:27003"}, {_id:1,host:"192.168.31.108:27003"},{_id:2,host:"192.168.31.107:27003"}]})
成功:
上面:搭建了**分片(shard)和配置服务器集群(configs-server)**下面搭建路由服务
路由服务(mongos)配置
-
配置mongos配置文件
# cd /usr/local/mongodb-cluster/mongos/conf/ # vim vim mongos.conf
systemLog: destination: file path: "/usr/local/mongodb-cluster/mongos/log/mongos.log" logAppend: true net: bindIp: 0.0.0.0 port: 27017 sharding: configDB: configs/192.168.31.109:27018,192.168.31.108:27018,192.168.31.107:27018 processManagement: fork: true
-
将mongos配置文件,发送当另外2台主机上
scp -r /usr/local/mongodb-cluster/mongos/ root@192.168.31.108:/usr/local/mongodb-cluster/mongos/ scp -r /usr/local/mongodb-cluster/mongos/ root@192.168.31.107:/usr/local/mongodb-cluster/mongos/
-
三台启动路由mongos
/usr/local/mongodb-cluster/mongodb/bin/mongos -f /usr/local/mongodb-cluster/mongos/conf/mongos.conf
-
登录一台服务器
#登录一个路由 /usr/local/mongodb-cluster/mongodb/bin/mongo --host 192.168.31.109 --port 27017 #切换到admin use admin #添加切片集群 sh.addShard("rs1/192.168.31.109:27001,192.168.31.108:27001,192.168.31.107:27001") sh.addShard("rs2/192.168.31.109:27002,192.168.31.108:27002,192.168.31.107:27002") sh.addShard("rs3/192.168.31.109:27003,192.168.31.108:27003,192.168.31.107:27003")
成功
这里解释一下为什么只用在一个路由配置,因为我们配置configs-server集群,集群会自动的帮助我们同步消息。 -
启用数据库分片
需要对哪一个数据库进行分片
对哪一个表那个字段作为哈希分片算法sh.enableSharding("tests") #需要对哪一个数据库进行分片 sh.shardCollection("tests.user",{"id":"hashed"}) #对哪一个表那个字段作为哈希分片算法
测试
-
测试
use tests switched to db tests for(i=1;i<=5000;i++){db.user.insert({"id":i,"name":"mr_fu"+i})} WriteResult({ "nInserted" : 1 })
Navicat链接集群查询成功!!!
sh.status() #查看分片情况