MongoDB 分片集群

副本集:自动故障转移 主从复制 集群

  • 解决问题: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"}});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容