MongoDB分片集群部署
MongoDB分片集群介绍:
什么是 MongoDB 分片集群:
- MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方
- MongoDB 使用 分片集群 来支持大数据集和高吞吐量的业务场景。
为什么要使用分片集群:
副本集遇到的问题:
副本集(ReplicaSet) 帮助我们解决读请求扩展、高可用等问题。随着业务场景进一 步增长,可能会出现以下问题:
- 存储容量超出单机磁盘容量
- 活跃数据集超出单机内存容量:很多读请求需要从磁盘读取
- 写入量超出单机 IOPS 上限
垂直扩容(Scale Up) VS ⽔平扩容(Scale Out):
- 垂直扩容 : 用更好的服务器,提高 CPU 处理核数、内存数、带宽等
- 水平扩容 : 将任务分配到多台计算机上
分片集群的基本架构:
- Mongos
- 分片集群的访问入口
- 对请求进行路由、分发、合并
- 部署多个 Mongos 来保证高可用
- ConfigServer
- 存储元信息和集群配置
- 部署为副本集来保证高可用
- Shard
- 存储用户数据,不同 Shard 保存不同用户数据
- 部署为副本集来保证高可用
服务规划:
由于设备问题,目前我们只采用了3个设备进行部署。3个设备同时部署config Servers,shard1,shard2,route。
该部署使用的Red Hat 7为例
前提工作
所有设备都要进行如下操作。
1.关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
2.关闭SELinux
setenforce 0 //临时关闭
vim /etc/selinux/config //永久关闭
3.解压MongoDB包
注意选择对应的系统版本的MongoDB包,在这里我使用的是Centos7的环境,所以下载的也是rhel70的MongoDB包
tar -zxvf /opt/install/mongodb-linux-x86_64-rhel70-3.4.24.tgz
mv /opt/install/mongodb-linux-x86_64-rhel70-3.4.24/ /usr/local/mongodb
configServers部署
三台设备都需要部署configServer形成副本集,最后部署完成的结果是:192.168.36.137为主(PRIMARY),138和139为从(SECONDARY),端口都为21000。
1.创建configServers相关目录
mkdir -p /usr/local/mongodb/configServers/{data,log,conf}
2.配置configServers配置文件
vim /usr/local/mongodb/configServers/conf/configServers.conf
dbpath=/usr/local/mongodb/configServers/data
logpath=/usr/local/mongodb/configServers/log/configServers.log
pidfilepath=/usr/local/mongodb/configServers/configServers.pid
logappend=true
bind_ip=192.168.36.137 #其它设备只需要替换这个成本机IP即可
port=21000
fork=true
replSet=replconf #副本集名称
configsvr=true #开启config Servers组件
3.启动configServers
cd /usr/local/mongodb/bin
./mongod -f /usr/local/mongodb/configServers/conf/configServers.conf
4.副本集初始化
cd /usr/local/mongodb/bin
./mongo 192.168.36.137:21000
> use admin
> rs.initiate({
_id:"replconf",
members:[
{_id:0,host:"192.168.36.137:21000"},
{_id:1,host:"192.168.36.138:21000"},
{_id:2,host:"192.168.36.139:21000"},]
})
shard1部署
三台设备都需要部署shard1形成副本集,最后部署完成的结果是:192.168.36.137为主(PRIMARY),138为从(SECONDARY),139为仲裁(ARBITER),端口都为22001。
1.创建shard1相关目录
mkdir -p /usr/local/mongodb/shard1/{data,log,conf}
2.配置shard1配置文件
vim /usr/local/mongodb/shard1/conf/shard1.conf
dbpath=/usr/local/mongodb/shard1/data
logpath=/usr/local/mongodb/shard1/log/shard1.log
pidfilepath=/usr/local/mongodb/shard1/shard1.pid
logappend=true
bind_ip=192.168.36.137 #其它设备只需要替换这个成本机IP即可
port=22001
fork=true
replSet=shard1 #副本集名称
shardsvr=true #开启shard组件
3.启动shard1
cd /usr/local/mongodb/bin
./mongod -f /usr/local/mongodb/shard1/conf/shard1.conf
4.副本集初始化
cd /usr/local/mongodb/bin
./mongo 192.168.36.137:22001
> use admin
> rs.initiate({
_id:"shard1",
members:[
{_id:0,host:"192.168.36.137:22001","priority":2},
{_id:1,host:"192.168.36.138:22001","priority":1},
{_id:2,host:"192.168.36.139:22001",arbiterOnly:true},]
})
注:shard中的仲裁节点其实也不是必须的,若是不想设置仲裁节点,可以将arbiterOnly选项修改为priority
shard2部署
三台设备都需要部署shard2形成副本集,最后部署完成的结果是:192.168.36.137为仲裁(ARBITER),138为主(PRIMARY),139为从(SECONDARY),端口都为22002。
1.创建shard2相关目录
mkdir -p /usr/local/mongodb/shard2/{data,log,conf}
dbpath=/usr/local/mongodb/shard2/data
logpath=/usr/local/mongodb/shard2/log/shard2.log
pidfilepath=/usr/local/mongodb/shard2/shard2.pid
logappend=true
bind_ip=192.168.36.137 #其它设备只需要替换这个成本机IP即可
port=22002
fork=true
replSet=shard2 #副本集名称
shardsvr=true #开启shard组件
3.启动shard2
cd /usr/local/mongodb/bin
./mongod -f /usr/local/mongodb/shard2/conf/shard2.conf
4.副本集初始化
cd /usr/local/mongodb/bin
./mongo 192.168.36.138:22002
> use admin
> rs.initiate({
_id:"shard2",
members:[
{_id:0,host:"192.168.36.137:22002",arbiteOnly:true},
{_id:1,host:"192.168.36.138:22002","priority":2},
{_id:2,host:"192.168.36.139:22002","priority":1},]
})
route部署(也就是mongos)
三台设备同样也都需要部署route,端口都为20000。
1.创建route相关目录
mkdir -p /usr/local/mongodb/route/{log,conf} #route不需要data目录
2.配置route配置文件
vim /usr/local/mongodb/route/conf/route.conf
logpath=/usr/local/mongodb/route/log/route.log
pidfilepath=/usr/local/mongodb/route/route.pid
logappend=true
bind_ip=192.168.36.137 #其它设备只需要替换这个成本机IP即可
port=20000
fork=true
configdb=replconf/192.168.36.137:21000,192.168.36.138:21000,192.168.36.139:21000 #这里指定的是我们configServers的地址端口
3.启动route
cd /usr/local/mongodb/bin
./mongos -f /usr/local/mongodb/router/conf/router.conf
4.增加shard节点
cd /usr/local/mongodb/bin
./mongo 192.168.36.137:20000
#下列两种方式任选其一即可
方式一:
> use admin
> db.runCommand({addshard:"shard1/192.168.36.137:22001,192.168.36.138:22001,192.168.36.139:22001"}) //shard是我们第一个设置的share名称和它的各个节点
> db.runCommand({addshard:"shard2/192.168.36.137:22002,192.168.36.138:22002,192.168.36.139:22002"}) //shard是我们第二个设置的share名称和它的各个节点
> sh.status() //查看集群分片状态 > use config
> db.shards.find() //查看当前所有shard节点信息
方式二:
sh.addShard("shard1/192.168.36.137:22001,192.168.36.138:22001,192.168.36.139:22001");
sh.addShard("shard2/192.168.36.137:22002,192.168.36.138:22002,192.168.36.139:22002");
若后期我们有新的shard节点也是通过该方式进行新增。