1. 基础概念说明
    • 单实例

简单易用易搭建,只推荐学习使用,生产环境不推荐。

  • 主从模式(Master-Slaver)

类似MySQL的主从模式,实现数据的全量备份,并可实现读写分离。

图1.2 主从模式构架

这种MySQL式主从模式,目前MongoDB官方已经不推荐。虽然根据二八原则,对实际业务的读写进行了分离,提高了数据的读写并发能力,实现了负载均衡和数据的安全性,但数据的但是实际使用中仍然存在很多先天不足。

如系统构架严重依赖主节点,当主节点挂点或者压力过大,会严重制约系统稳定性。同时从节点对主节点进行全量拷贝,节点压力以及对磁盘的利用率相对较低,而且未能做到系统的健壮性,当主节点挂掉时不能自动切换会为运维人员带来很多麻烦。

  • 副本集(Replica Set)

副本集,简单来说就是集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,并且这种切换时自动的,副本集提供呢一种自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案。

图1.3-1 副本集构架

从MongoDB官方提供的构架图中可以看出,主节点(Primary)承担所有写操作,同时主副节点都可承担读操作,所以可实现数据的读写分离操作。但是但从这点来看其和主从模式还不能看出区别,下面我们来看下该构架的真正的强大之处。

这就是MongoDB副本集的心跳服务和选举机制,当主节点挂掉或者压力过大时,MongoDB就会发起投票机制推举中新的主节点。

图1.3-2 副本集推举机制

这里需要注意的是关于仲裁者节点(Arbiter)的争议,仲裁者节点,只参与投票但自身其实不提供数据存储能力,所以永远也不能成为主节点。副本集投票机制的产生必须要维持副本集的奇数个的情况下才能成立,所以偶数个情况下必须添加仲裁者节点。

图1.3-3 副本集(仲裁者参与)

仲裁者节点在节点个数为偶数情况下加入是必须的,但是有人提出仲裁节点只会在节点偶数投票发生情况下跳出进行僵局平衡的打破,所以是必要的。但从官方文档上可以看出:

图1.3-4 仲裁者官方说明

仲裁者节点并不是必须的,只是单纯为了满足奇数投票的规则加入的,且因其存在会拖慢投票产生新主节点的速度,所以尽量在服务器充足情况下不要使用仲裁者节点。

  • 分片(Sharding)

MongoDB副本集虽然在数据读写分离以及可靠性的保证,但是对于现在海量存储数据以及大批量数据插入查询还是有一定限制,所以MongoDB的解决方案就是分而治之,提出了分片概念。

图1.4-1 MongoDB分片构架

从图中可以看到有四个组件:mongos、config server、shard、replica set。

  • Mongos:数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的MongoDB请求都没有办法操作。
  • Config server:顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, MongoDB集群就不会挂掉。
  • Shard:这就是传说中的分片了。上面提到一个机器就算能力再大也有天花板,就像军队打仗一样,一个人再厉害喝血瓶也拼不过对方的一个师。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:

图1.4-2 MongoDB分片

一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了!在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力。也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈。在MongoDB集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上。在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!

  • Replica set:副本集,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建副本集保证分片的可靠性。
  1. MongoDB集群
    • 官方推荐构架

根据以上了解,一个完整的MongoDB集群应该包含分片和副本集的集合,在生产环境中灵活搭配即可构建出一个高性能高可靠高容错的服务集群。总体构架应参照官方推荐的构架如下:

图2.1 总体构架

  • 构架说明

图2.2-1 集群构架

图2.2-2 服务器配置