副本集:自动故障转移 主从复制 集群
- 解决问题:1.数据冗余备份 2.架构高可用
- 不能解决:单节点压力问题(硬件限制 并发访问压力)
垂直扩容(Scale Up) VS 水平扩容(Scale Out):
垂直扩容 : 用更好的服务器,提高 CPU 处理核数、内存数、带宽等
水平扩容 : 将任务分配到多台计算机上
什么是 MongoDB 分片集群:
MongoDB 分片集群(Sharded Cluster)是对数据进行水平扩展的一种方法
使用 分片集群 来支持大数据集和高吞吐量的业务场景。
MongoDB 支持自动分片,集群自动切分数据做负载均衡。
分片集群的基本架构
- Mongos
分片集群的访问入口
对请求进行路由、分发、合并
部署多个 Mongos 来保证高可用- ConfigServer
存储元信息和集群配置
部署为副本集
来保证高可用- Shard
存储用户数据,不同 Shard 保存不同用户数据
可以 部署为副本集
来保证高可用
依据
片键
:设置分片时需要在集合选取一个键,用该键的值作为拆分数据的依据
片键的决定了数据散列是否均匀。
分片集群搭建(模拟)
建议localhost写成具体IP
1.集群规划
- Shard Server 1: 27017
- Shard Repl 1: 27018 # Shard Server 1的副本集节点,用作备份
- Shard Server 2: 27019
- Shard Repl 2: 27020
- Shard Server 3: 27021
- Shard Repl 3: 27022
- Config Server : 27023
- Config Server : 27024
- Config Server : 27025
- Route Rrocess : 27026
2.进入安装的bin目录(~/mongodb/bin)创建数据目录
# 分片
- mkdir -p ../cluster/shard/s0
- mkdir -p ../cluster/shard/s0-repl
- mkdir -p ../cluster/shard/s1
- mkdir -p ../cluster/shard/s1-repl
- mkdir -p ../cluster/shard/s2
- mkdir -p ../cluster/shard/s2-repl
# 配置服务器
- mkdir -p ../cluster/shard/config1
- mkdir -p ../cluster/shard/config2
- mkdir -p ../cluster/shard/config3
# 检查
- ls ../cluster/shard/
3.启动4个shard服务
# 启动s0、r0,并初始化
- ./mongo --port 27017 --dbpath ../cluster/shard/s0 --bind_ip 0.0.0.0 --shardsvr --replSet r0/localhost:27018
- ./mongo --port 27018 --dbpath ../cluster/shard/s0-repl --bind_ip 0.0.0.0 --shardsvr --replSet r0/localhost:27017
#登录任意客户端节点,连接任意节点
- cd mongodb/bin
- ./mongo --port 27017
#初始化
- use admin
- var config = {
_id:"r0",
members:[
{_id:0,host:"localhost:27017"},
{_id:1,host:"localhost:27018"}]
}
- rs.initiate(config); #初始化配置
# 启动s1、r1,并初始化
- ./mongo --port 27019 --dbpath ../cluster/shard/s1 --bind_ip 0.0.0.0 --shardsvr --replSet r1/localhost:27020
- ./mongo --port 27020 --dbpath ../cluster/shard/s1-repl --bind_ip 0.0.0.0 --shardsvr --replSet r1/localhost:27019
#登录任意客户端节点,连接任意节点
- cd mongodb/bin
- ./mongo --port 27019
#初始化
- use admin
- var config = {
_id:"r1",
members:[
{_id:0,host:"localhost:27019"},
{_id:1,host:"localhost:27020"}]
}
- rs.initiate(config); #初始化配置
# 启动s2、r2,并初始化
- ./mongo --port 27021 --dbpath ../cluster/shard/s1 --bind_ip 0.0.0.0 --shardsvr --replSet r2/localhost:27022
- ./mongo --port 27022 --dbpath ../cluster/shard/s1-repl --bind_ip 0.0.0.0 --shardsvr --replSet r2/localhost:27021
#登录任意客户端节点,连接任意节点
- cd mongodb/bin
- ./mongo --port 27021
#初始化
- use admin
- var config = {
_id:"r2",
members:[
{_id:0,host:"localhost:27021"},
{_id:1,host:"localhost:27022"}]
}
- rs.initiate(config); #初始化配置
# 启动Config Servers
- ./mongo --port 27023 --dbpath ../cluster/shard/config --bind_ip 0.0.0.0 --replSet config /[localhost:27024,localhost:27025] --configsvr
- ./mongo --port 27024 --dbpath ../cluster/shard/config --bind_ip 0.0.0.0 --replSet config /[localhost:27023,localhost:27025] --configsvr
- ./mongo --port 27025 --dbpath ../cluster/shard/config --bind_ip 0.0.0.0 --replSet config /[localhost:27023,localhost:27024] --configsvr
#登录任意客户端节点,连接任意节点
- cd mongodb/bin
- ./mongo --port 27023
#初始化
- use admin
- var config = {
_id:"config ",
configsvr:true,
members:[
{_id:0,host:"localhost:27023"},
{_id:1,host:"localhost:27024"},
{_id:2,host:"localhost:27025"}]
}
- rs.initiate(config);
# 启动mongos路由
- ./mongo --port 27026 --configdb config/localhost:27023,localhost:27024,localhost:27025 --bind_ip 0.0.0.0
# 登录 mongos 服务
- cd mongodb/bin
- ./mongo --port 27026
- use admin
# 添加分片信息
- db.runCommand({ addshard:"r0/localhost:27017,localhost:27018","allowLocal":true });
- db.runCommand({ addshard:"r1/localhost:27019,localhost:27020","allowLocal":true });
- db.runCommand({ addshard:"r2/localhost:27021,localhost:27022","allowLocal":true });
建好了,测试
# 登录 mongos 服务
- cd mongodb/bin
- ./mongo --port 27026
- use admin
# 指定分片的数据库
- db.runCommand({ enablesharding:"testDatabase" });
# 设置库的片键信息
# 启用id为片键
- db.runCommand({ shardcollection:"testDatabase.users",key:{_id:1}});
# 启用id为片键,使用散列,分布更均匀
- db.runCommand({ shardcollection:"testDatabase.users",key:{_id:"hashed"}});