MongoDB 中的复制和分片

155 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

关于mysql备份,不知道大家还记不记得呢?本次讲解的MongoDB复制其实就很像数据备份。

复制

MongoDB 复制是将数据同步在多个服务器的过程。它提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,保证了数据的安全性,同时它允许从硬件故障和服务中断中恢复数据(即容灾)

那么如何实现复制?? MongoDB 有副本集及主从复制两种模式,本实验给大家介绍的是副本集模式(主从模式在 MongoDB 3.6 中已经彻底废弃不使用了)。 MongoDB 的副本集是由一组提供冗余和高可用性的 mongod 实例进程组成,一个副本集成员有:

  • 主节点(Primary):主节点接收所有的写操作。
  • 从节点(Secondary):从节点通过复制主节点的操作来维护一个相同的数据集,保持复制内所有成员存储相同的数据集,提供数据的高可用。从节点可以有多个。

副本集的最小推荐配置是一个包含三个数据承载成员的三成员副本集:一个 Primary 和两个 Secondary。下图就是这样的一个典型的副本集原理图:

图片描述

MongoDB 复制集具有下面四个特点:

  • 主节点是唯一的,但不是固定的。
  • 由大多数据原则保证数据的一致性。
  • 从节点无法进行写入操作。
  • 复制集可以自动容灾。

MongoDB 按功能可以分为主节点(Primary)从节点(Secondary) 以及仲裁节点(Arbiter)

节点名解释
主节点(Primary)副本集的主节点是唯一一个可以接收写操作的成员。
操作记录到主节点的 oplog 中。副本集最多有一个主节点,如果当前主节点不可用,通过选举会抉择出新的主节点。
从节点(Secondary)一个从节点维护了主节点数据集的一个副本。为了复制数据,从节点通过异步的方式将主节点 oplog 应用至自己的数据集中。一个副本集可以有一个或多个从节点。如果当前主节点不可用,副本集会发起选举来选择哪个从节点成为新的主节点。
仲裁节点(Arbiter)在某些情况下,可以在副本集中添加一个仲裁节点(比如:有一个主节点和一个从节点,但由于成本约束无法添加另一个从节点)。仲裁节点没有数据集的副本,并且不能成为主节点。但是其可以参与主节点选举。

复制集搭建

创建数据存放目录和日志文件

  • 创建 3 个数据存放的目录,分别名称为 mongodb1mongodb2mongodb3
  • 创建 log 文件夹。
  • 在 log 目录下创建 3 个日志文件,名称分别为 mongodb1.logmongodb2.logmongodb3.log。 给上面创建的目录和文件授予读写权限。
sudo chmod -R 777 /home/project/mongodb/mongodb{1,2,3}
sudo chmod -R 777 /home/project/mongodb/log/mongodb{1,2,3}.log

复制配置文件并进行修改

复制三个配置文件,名称分别为 mongod1.confmongod2.conf 、mongod3.conf

sudo cp /etc/mongod.conf /etc/mongod1.conf
sudo cp /etc/mongod.conf /etc/mongod2.conf
sudo cp /etc/mongod.conf /etc/mongod3.conf

分别修改三个配置文件,具体配置如下:

使用命令打开 mongod1.conf 文件,详细内容如下所示:

# 绑定 ip 地址(可选)
bind_ip=127.0.0.1
# 端口
port=27017
# 存放数据的目录
dbpath=/home/project/mongodb/mongodb1
# 日志文件
logpath=/home/project/mongodb/log/mongodb1.log
# 追加日志信息
logappend=true
# 配置副本集
replSet=rs0

使用命令打开 mongod2.conf 文件,内容和一差不多

使用命令打开 mongod3.conf 文件,内容和一差不多

启动多实例

    mongod -f /etc/mongod1.conf
    mongod -f /etc/mongod2.conf
    mongod -f /etc/mongod3.conf

✨ 说明:上面实例需要在终端中一个一个启动。

查看实例是否启动成功:

   ps -ef | grep mongo

选择端口为 27017 的这台实例进行连接并执行以下命令。

进入交互式客户端:

mongo 127.0.0.1:27017/lanqiao

配置主节点、从节点、仲裁节点

cfg={
    _id:'rs0',
    members:[
        {_id:0,host:'127.0.0.1:27017'},
        {_id:1,host:'127.0.0.1:27018'},
        {_id:2,host:'127.0.0.1:27019',arbiterOnly:true}
        ]
    }

说明:初始化复制集,第一台被初始化为 Primary,第二台被初始化为 Secondary,第三台被初始化为 Arbiter

使配置的节点生效

rs.initiate(cfg)

执行 rs.status() 查看集群信息。

rs.status()

上就是 MongoDB 复制集的搭建,单机多实例与不同服务器搭建原理都相同。不同服务器搭建 MongoDB,在初始化复制集的时候操作略有不同,单机多实例的搭建是通过不同端口号去实现的。而不同服务器是通过不同 IP 地址进行实现的

分片

分片是一种将数据分配到多个机器上的方法。MongoDB 通过分片技术来支持具有海量数据集和高吞吐量操作的部署方案。

当 MongoDB 存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量,此时 MongoDB 通过分片来实现水平扩展,即将数据集划分到多台机器上,使得数据系统能存储和处理更多的数据。

MongoDB 分片集群包括以下组件:

  • Shard:用于存储实际的数据块,每个 shard 包含被分片的数据集中的一个子集。每个分片可以被部署为副本集架构,可以防止主机单点故障。
  • mongos:充当查询路由器,在客户端应用程序和分片集群之间提供接口。从 MongoDB 4.4 开始,mongos 可以支持对冲读取(hedged reads)以最大程度地减少延迟。
  • Config Server:存储分片集群的元数据和配置信息。

图片描述

MongoDB 收集集合的分片数据,将收集数据分布在集群中的各个分片上。