勿以浮沙筑高台
基础准备:
搭建三台Linux服务器,其中109配置mongodb。见文章:
Linux下MongoDB安装
MongoDB集群搭建
# 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
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
/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});
在从机器上启动客户端并执行脚本,开启查询配置/usr/local/mongodb/bin/mongo 192.168.31.108:27017
db.getMongo().setSlaveOk(); #开启查询配置
use testdb
db.users.find()
2台机子查询出数据即成功。 同样准备3台Linux虚拟机,分别是109,108,107。
因为理解不像主从关系这么简单,因此画了个图:
在mongodb集群中有三个集群结构。
路由集群(mongos):
负责请求消息的分发与每个分片集群都有关系,并与配置服务的主集群有关系。将请求分发到每一个shard上。
配置服务集群(coing server):
主要是负责分片数据和路由数据的配置文件的管理与每一个路由和每个分片的主有联系,当配置服务发生变化会通知config更新。mongos 本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos 第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货,mongodb 集群就不会挂掉。
分片集群(shard):
负责数据的分片。比如750MB的数据,分片下来就是250MB的数据,减少数据库的压力
# 创建集群文件夹
/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
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/
/usr/local/mongodb-cluster/mongodb/bin/mongod -f /usr/local/mongodb-cluster/configs/conf/config.conf
# 登录操作客户端
/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();
编写配置文件,这样的配置文件修改为三份。
#
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"}]})
配置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"}) #对哪一个表那个字段作为哈希分片算法