『MongoDB』MongoDB高可用部署架构——分片集群篇(Sharding)

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: ?读完这篇文章里你能收获到- 为什么要使用分片- Mongodb分片集群有哪些特点- Mongodb分片集群的完整架构- Mongodb分片集群数据分布方式- Mongodb分片集群的设计思路- Mongodb分片集群搭建及扩容- 这篇文章强烈建议收藏!!!免得下次找不到

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

请添加图片描述
?读完这篇文章里你能收获到

  • 为什么要使用分片
  • Mongodb分片集群有哪些特点
  • Mongodb分片集群的完整架构
  • Mongodb分片集群数据分布方式
  • Mongodb分片集群的设计思路
  • Mongodb分片集群搭建及扩容
  • 这篇文章强烈建议收藏!!!免得下次找不到

请添加图片描述

一、初识分片集群

  • 基础概念本文就不讲了,百度百科了解即可

1 为什么要使用分片集群

  • 数据容量日益增大,访问性能日渐降低,怎么破?
  • 新品上线异常火爆,如何支撑更多的并发用户?
  • 单库已有 10TB 数据,恢复需要1-2天,如何加速?
  • 地理分布数据

2 分片如何解决[案例]

  • 银行交易单表内10亿笔资料 超负荷运转

在这里插入图片描述

  • 把数据分成两半,放到2个库物理里

在这里插入图片描述

  • 把数据分成4部分,放到4个物理库里(以此类推)

在这里插入图片描述

3 MongoDB 分片集群有哪些特点

  • 应用全透明,无特殊处理
  • 数据自动均衡
  • 动态扩容,无须下线
  • 提供三种分片方式

请添加图片描述

二、Mongodb分片集群架构解剖

1 完整的分片集群

在这里插入图片描述

2 分片集群解剖:路由节点 mongos(Router)

  • 路由节点
  • 提供集群单一入口转发应用端请求
  • 选择合适数据节点进行读写合并多个数据节点的返回
  • 无状态
  • 建议至少2个

在这里插入图片描述

3 分片集群解剖:配置节点 Config

  • 配置(目录)节点
  • 提供集群元数据存储分片数据分布的映射
  • 普通复制集架构

在这里插入图片描述

在这里插入图片描述

4 分片集群解剖:数据节点 Shard

  • 数据节点
  • 以复制集为单位横向扩展
  • 最大1024分片
  • 分片之间数据不重复所有分片在一起才可完整工作

在这里插入图片描述
请添加图片描述

三、Mongodb分片集群数据分布方式

1 分片集群数据分布方式 – 基于范围

在这里插入图片描述
在这里插入图片描述

2 分片集群数据分布方式 – 基于哈希

在这里插入图片描述
在这里插入图片描述

3 分片集群数据分布方式 – 自定义Zone(区域/范围)

在这里插入图片描述
请添加图片描述

四、分片集群设计-如何用好分片集群

  • 分片集群可以有效解决性能瓶颈及系统扩容问题
  • 分片额外消耗较多,管理复杂,能不分片尽量不要分片

1 合理的架构

在这里插入图片描述

1.1 合理的架构 – 分片大小

  • 分片的基本标准:
  1. 关于数据:数据量不超过3TB,尽可能保持在2TB一个片
  2. 关于索引:常用索引必须容纳进内存
  • 按照以上标准初步确定分片后,还需要考虑业务压力,随着压力增大,CPU、RAM、磁盘中的任何一项出现瓶颈时,都可以通过添加更多分片来解决

1.2 合理的架构 – 需要多少个分片

  • A = 所需存储总量 / 单服务器可挂载容量
  • B = 工作集大小 / (单服务器内存容量 * 0.6)
  • C = 并发量总数 / (单服务器并发量 * 0.7)
  • 分片数量 = max(A, B, C)

举例:
所需存储总量8TB
单服务器可挂载容量 2TB
工作集大小 400GB
单服务器内存容量 256GB
并发量总数 30000
单服务器并发量 9000

除了单服务器并发量需要实际压测外,其余均可预估
A = 8TB / 2TB = 4
B = 400GB / (256G * 0.6) = 3
C = 30000 / (9000*0.7) = 6
分片数量 = max(A, B, C) = 6

1.3 合理的架构 – 其他需求

  • 考虑分片的分布:
  1. 是否需要跨机房分布分片?
  2. 是否需要容灾?
  3. 高可用的要求如何?

2 正确的姿势

在这里插入图片描述

  • 各种概念由小到大:
  1. 片键 shard key:文档中的一个字段
  2. 文档 doc :包含 shard key 的一行数据
  3. 块 Chunk :包含 n 个文档
  4. 分片 Shard:包含 n 个 chunk
  5. 集群 Cluster: 包含 n 个分片

在这里插入图片描述

2.1 正确的姿势 - 选择合适片键

  • 影响片键效率的主要因素:
  1. 取值基数(Cardinality)
  2. 取值分布
  3. 分散写,集中读
  4. 被尽可能多的业务场景用到
  5. 避免单调递增或递减的片键

2.2 正确的姿势 - 选择基数大的片键

  • 对于小基数的片键:
  1. 因为备选值有限,那么块的总数量就有限
  2. 随着数据增多,块的大小会越来越大
  3. 水平扩展时移动块会非常困难
  • 例如:存储一个高中的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么:15<=年龄<=65,且只为整数最多只会有51个 chunk
  • 结论:取值基数要大!

2.3 正确的姿势 – 选择分布均匀的片键

  • 对于分布不均匀的片键:
  1. 造成某些块的数据量急剧增大
  2. 这些块压力随之增大
  3. 数据均衡以 chunk 为单位,所以系统无能为力
  • 例如:存储一个学校的师生数据,以年龄(假设年龄范围为15~65岁)作为片键,那么:15<=年龄<=65,且只为整数,大部分人的年龄范围为15~18岁(学生)

15、16、17、18四个 chunk 的数据量、访问压力远大于其他 chunk

  • 结论:取值分布应尽可能均匀

3 足够的资源

在这里插入图片描述

  • mongos 与 config 通常消耗很少的资源,可以选择低规格虚拟机
  • 资源的重点在于 shard 服务器:
  1. 需要足以容纳热数据索引的内存
  2. 正确创建索引后 CPU 通常不会成为瓶颈,除非涉及非常多的计算
  3. 磁盘尽量选用 SSD
  • 最后,实际测试是最好的检验,来看你的资源配置是否完备
  • 即使项目初期已经具备了足够的资源,仍然需要考虑在合适的时候扩展。建议监控各项资源使用情况,无论哪一项达到60%以上,则开始考虑扩展,因为:
  1. 扩展需要新的资源,申请新资源需要时间
  2. 扩展后数据需要均衡,均衡需要时间。应保证新数据入库速度慢于均衡速度
  3. 均衡需要资源,如果资源即将或已经耗尽,均衡也是会很低效的

请添加图片描述

五、分片集群搭建及扩容

1 目标及流程

  • 目标:学习如何搭建一个2分片的分片集群
  • 环境:3台 Linux 虚拟机, 4 Core 8 GB
  • 步骤:

在这里插入图片描述

2 实验架构

在这里插入图片描述
在这里插入图片描述

3 开始搭建

3.1 配置域名解析

  • 在3台虚拟机上分别执行以下3条命令,注意替换实际 IP 地址
echo "192.168.1.1 demo1 member1.example.com member2.example.com" >> /etc/hosts
echo "192.168.1.2 demo2 member3.example.com member4.example.com" >> /etc/hosts
echo "192.168.1.3 demo3 member5.example.com member6.example.com" >> /etc/hosts

3.2 准备分片目录

  • 在各服务器上创建数据目录,我们使用 /data,请按自己需要修改为其他目录:
在member1 / member3 / member5 上执行以下命令:
mkdir -p /data/shard1/  mkdir -p /data/config/

在member2 / member4 / member6 上执行以下命令:
mkdir -p /data/shard2/  mkdir -p /data/mongos/

3.3 创建第一个分片用的复制集

在 member1 / member3 / member5 上执行以下命令:

mongod --bind_ip 0.0.0.0 --replSet shard1 --dbpath /data/shard1 --logpath
/data/shard1/mongod.log --port 27010 --fork --shardsvr --wiredTigerCacheSizeGB 1

3.4 初始化第一个分片复制集

mongo --host member1.example.com:27010  rs.initiate({
    _id: "shard1",
    "members": [
        {
            "_id": 0,
            "host": "member1.example.com:27010"
        },
        {
            "_id": 1,
            "host": "member3.example.com:27010"
        },
        {
            "_id": 2,
            "host": "member5.example.com:27010"
        }
    ]
});

3.5 创建 config server 复制集

  • 在 member1 / member3 / member5 上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet config --dbpath /data/config --logpath
/data/config/mongod.log --port 27019 --fork --configsvr --wiredTigerCacheSizeGB 1

3.6 初始化 config server 复制集

# mongo --host member1.example.com:27019  rs.initiate({
    _id: "config",
    "members": [
        {
            "_id": 0,
            "host": "member1.example.com:27019"
        },
        {
            "_id": 1,
            "host": "member3.example.com:27019"
        },
        {
            "_id": 2,
            "host": "member5.example.com:27019"
        }
    ]
});

3.7 在第一台机器上搭建 mongos

# mongos --bind_ip 0.0.0.0 --logpath /data/mongos/mongos.log --port 27017 --fork
--configdb  config/member1.example.com:27019,member3.example.com:27019,member5.example.com:27019

# 连接到mongos, 添加分片
# mongo --host member1.example.com:27017

mongos >  sh.addShard("shard1/member1.example.com:27010,member3.example.com:27010,member5
.example.com:27010");

3.8 创建分片表

# 连接到mongos, 创建分片集合
# mongo --host member1.example.com:27017

mongos > sh.status()
mongos > sh.enableSharding("foo");
mongos > sh.shardCollection("foo.bar", {_id: 'hashed'});  mongos > sh.status();

# 插入测试数据
use foo
for (var i = 0; i < 10000; i++) {  db.bar.insert({i: i});
}

3.9 创建第2个分片的复制集

  • 在 member2 / member4 / member6 上执行以下命令:
mongod --bind_ip 0.0.0.0 --replSet shard2 --dbpath /data/shard2
--logpath /data/shard2/mongod.log --port 27011 --fork --shardsvr
--wiredTigerCacheSizeGB 1

3.10 初始化第二个分片的复制集

# mongo --host member2.example.com:27011

mongo --host member1.example.com:27010  rs.initiate({
    _id: "shard2",
    "members": [
        {
            "_id": 0,
            "host": "member2.example.com:27011"
        },
        {
            "_id": 1,
            "host": "member4.example.com:27011"
        },
        {
            "_id": 2,
            "host": "member6.example.com:27011"
        }
    ]
});

3.11 加入第2个分片

# 连接到mongos, 添加分片
# mongo --host member1.example.com:27017

mongos >  sh.addShard("shard2/member2.example.com:27011,member4.example.com:27011,  member6.example.com:27011");
mongos > sh.status()
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
5天前
|
存储 负载均衡 NoSQL
MongoDB分片技术:实现水平扩展的利器
【4月更文挑战第30天】MongoDB的分片技术是应对数据增长和复杂业务需求的解决方案,它将数据水平拆分存储在多个实例上,实现数据库的水平扩展。分片带来水平扩展性、负载均衡、高可用性和灵活的数据管理。分片工作涉及mongos路由进程、config server和shard实例。设置分片包括部署配置服务器、添加分片、启动mongos、配置分片键和开始分片。选择合适的分片键和有效管理能确保系统性能和稳定性。
|
2天前
|
运维 监控 Docker
使用Docker进行微服务架构的部署
【5月更文挑战第18天】本文探讨了如何使用Docker进行微服务架构部署,介绍了Docker的基本概念,如容器化平台和核心组件,以及它与微服务的关系。通过Docker,每个微服务可独立运行在容器中,便于构建、测试和部署。文章详细阐述了使用Docker部署微服务的步骤,包括定义服务、编写Dockerfile、构建镜像、运行容器、配置服务通信、监控和日志管理以及扩展和更新。Docker为微服务提供了可移植、可扩展的解决方案,是现代微服务架构的理想选择。
|
5天前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
5天前
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
5天前
|
存储 NoSQL MongoDB
【MongoDB 专栏】MongoDB 与微服务架构的结合
【5月更文挑战第11天】微服务架构流行趋势下,选择合适的数据库至关重要。MongoDB作为非关系型数据库,与微服务有天然契合度。其灵活的文档模型、水平扩展性、高性能及局部事务支持,满足微服务对数据模型多样性、高可用性、快速读写的需求。实践中,需注意数据划分、索引优化、监控调优和版本控制。未来,MongoDB在微服务中的应用将更广泛,新技术将提升其在微服务架构中的价值。
【MongoDB 专栏】MongoDB 与微服务架构的结合
|
5天前
|
存储 监控 关系型数据库
关系型数据库设计集群架构节点规划
【5月更文挑战第6天】在实际项目中,可能还需要考虑其他因素,如安全性、合规性、成本等。因此,在进行关系型数据库设计集群架构节点规划时,建议与经验丰富的数据库管理员和架构师合作,以确保项目的成功实施和稳定运行。
22 4
关系型数据库设计集群架构节点规划
|
5天前
|
存储 负载均衡 关系型数据库
关系型数据库设计集群架构架构选择
【5月更文挑战第6天】还可以考虑使用现有的数据库管理系统(DBMS)提供的集群解决方案,如MySQL的InnoDB Cluster、PostgreSQL的Streaming Replication和Patroni等。这些解决方案已经经过了广泛测试和验证,可以大大降低集群架构设计和实现的难度。
19 1
关系型数据库设计集群架构架构选择
|
5天前
|
分布式计算 负载均衡 关系型数据库
关系型数据库设计集群架构需求分析
【5月更文挑战第6天】关系型数据库设计集群架构的需求分析是一个综合考虑业务需求、性能、可用性、可扩展性、数据一致性、安全性、成本效益和技术选型等多个方面的过程。通过深入分析和评估,可以设计出满足业务需求且高效可靠的数据库集群架构。
22 3
关系型数据库设计集群架构需求分析
|
5天前
|
缓存 监控 负载均衡
关系型数据库设计集群架构
【5月更文挑战第5天】关系型数据库设计集群架构
21 3
关系型数据库设计集群架构
|
5天前
|
存储 监控 NoSQL
【MongoDB 专栏】MongoDB 分片策略与最佳实践
【5月更文挑战第10天】MongoDB 分片是应对大数据量的扩展策略,涉及哈希和范围分片两种策略。分片架构包含分片服务器、配置服务器和路由服务器。最佳实践包括选择合适分片键、监控调整、避免热点数据等。注意数据分布不均和跨分片查询的挑战。通过实例展示了如何在电商场景中应用分片。文章旨在帮助理解并优化 MongoDB 分片使用。
【MongoDB 专栏】MongoDB 分片策略与最佳实践
http://www.vxiaotou.com