MongoDB | 集群
Contents
什么是集群
集群(cluster)
:指一组计算机系统作为一个整体向用户提供服务,这些单个的计算机系统在集群中称为节点(node),通常通过局域网连接。集群有以下关键特性:
- 可扩展性:新服务实体可动态加入集群
- 高可用性:
- 负载均衡:
- 错误恢复:
数据库集群分类
:
- 负载均衡集群(Load Balance Cluster, LBC):侧重与数据库的横向扩展,提升数据库性能
- 高可用性集群(High Availability Cluster, HAC):侧重保证数据库应用持续不断
- 高安全性集群(High Security Cluster, HSC):侧重于容灾
分布式数据库架构
:Sharding(分片),Sharding 不是一个或某个特定数据库软件附属的功能,而是在具体技术细节之上的抽象处理,是水平扩展(Scale Out,亦或横向扩展、向外扩展)的解决方案,其主要目的是为突破单节点数据库服务器的 I/O
能力限制,解决数据库扩展性问题。
MongoDB集群
基本概念
- Chunck(块):一个区间的数据称为一个数据块,是一个逻辑概念,物理存储并不连续,默认64M,可在MongoDB服务启动时附加 ‘-chunckSize N’ 参数设置块大小。
- Sharding(水平分片):逻辑上是同一个数据库,但物理存储上
- Balancing(平衡):当存在多个可用的分片,且块的数据量足够多,mongodb的balancer(平衡器)会把数据迁移到其他分片上。
集群组成
一个MongoDB集群基本由3类进程组成:shards(存储数据)、mongos(路由器)、config server(配置服务器);还可包括clients(客户端)、arbiter(仲裁节点:参与选举,把某个分片存储数据的从节点提升为主节点)等。
Shard Server
:即存储实际数据的分片;每个shard可以是一个mongod实例,亦可以是一组mongod实例构成的Replica Set。- 为了实现每个Shard内部的
auto-failover(自动故障转移)
, MongoDB官方建议每个Shard为一组Replica Set。
- 为了实现每个Shard内部的
mongos
:数据库集群请求的入口,所有请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心, 他负责把对应的数据请求转发到对应的shard服务器上。- 在生产环境中通常有多个mongos作为集群请求的入口,防止其中一个挂掉而导致整个集群都不能访问。
- 在生产环境中通常有多个mongos作为集群请求的入口,防止其中一个挂掉而导致整个集群都不能访问。
Config Server
:配置服务器, 存储所有数据库元信息(路由,分片)的配置- 在生产环境中有多个config server配置服务器来存储分片路由的元数据,就算其中一台挂掉也不会影响整个mongodb集群的访问。
- 在生产环境中有多个config server配置服务器来存储分片路由的元数据,就算其中一台挂掉也不会影响整个mongodb集群的访问。
集群方案
MongoDB有三种集群处理方式: Replica Set
、Sharding
、Master-Slaver
Replica Set(副本集)
Replica Set 副本集,即在MongoDB集群中保存多份数据, 保证主节点挂掉后,备用节点能够继续提供数据服务, 提供的前提是数据需要和主节点保持一致。(多台服务器间的数据同步) 其架构图如下:
MongoDB(M):表示主节点;MongoDB(S):表示备节点; MongoDB(A):表示仲裁节点
- 主备节点可存储数据,仲裁节点不存储数据; 客户端同时链接主备节点,不链接仲裁节点。
- 主节点提供所有的增删改查服务,备节点不提供任何服务;但可通过配置使备节点提供查询服务,这样可减少主节点的压力,当客户端进行数据查询时,请求自动转发到备节点处理。这种设置叫做:
Read Preference Modes
。 - 仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点。
副本级特征
- N个节点的集群
- 任何节点可作为主节点
- 所有写操作都在主节点上进行
- 自动故障转移
- 自动恢复
Sharding(分片)
Sharding 分片,是使用多个机器存储数据的方法, MongoDB使用分片存储以支持巨大的数据存储量与对数据的操作;Sharding和Replica Set一样,都需要一个仲裁节点,但是Sharding还需要配置节点和路由节点。
The following diagram shows the sharding in MongoDB using sharded cluster.
- 分片的目的:高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上.
- 一个分片可由多台服务器组成,每台服务器都有一份分片的Replica Set; 根据片键(key), 分片[a,b), MongoDB会在不同分片区间移动数据子集。
Shard Key(片键)
Shard Key:分割数据集,需要定制分片key的格式, 通常由一个或多个字段组成以分发数据。
- shard key大小不能超过512 bytes.
- 分片后shard key不可改变,除非重建collection
Master Slaver(主从)
官方已不推荐使用
See Also
Thanks to the authors 🙂