什么是集群

集群(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。
  • mongos:数据库集群请求的入口,所有请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心, 他负责把对应的数据请求转发到对应的shard服务器上。

    • 在生产环境中通常有多个mongos作为集群请求的入口,防止其中一个挂掉而导致整个集群都不能访问。
  • Config Server:配置服务器, 存储所有数据库元信息(路由,分片)的配置

    • 在生产环境中有多个config server配置服务器来存储分片路由的元数据,就算其中一台挂掉也不会影响整个mongodb集群的访问。

有关集群组成部分的解释·1
有关集群组成部分的解释·2

集群方案

MongoDB有三种集群处理方式: Replica SetShardingMaster-Slaver

Replica Set(副本集)

Replica Set 副本集,即在MongoDB集群中保存多份数据, 保证主节点挂掉后,备用节点能够继续提供数据服务, 提供的前提是数据需要和主节点保持一致。(多台服务器间的数据同步) 其架构图如下:

Replica Set架构图

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.

Sharding

  • 分片的目的:高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的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 🙂