Skip to content

MongoDB Distribution Learning Doc

ChaunceyJ edited this page Oct 7, 2019 · 2 revisions

MongoDB分布式集群架构 学习报告

2019/10/8 姜其升 徐浩宇

[TOC]

MongoDB分布式应用原理

MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。

The MongoDB Distribution Architecture

shards

一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。

mongos

可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。

config server

存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。

shard key

为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据。shard key相邻的数据通常会存在同一台服务(数据块)上.

MongoDB分布式部署方式

服务器部署可以有多种方式。首先,每台config server、mongos、mongod都可以是单独的服务器,但这样会导致某些服务器的浪费,比如config server。下图为物理机共享的集群部署,不需要额外加机器。

The MongoDB Distribution Example

MongoDB下载

https://www.mongodb.com/download-center/community

MongoDB分布式部署举例

Replica Set部署

部署一个三节点的 Replica Set。

Replica Set

首先,为每个 mongod 实例创建它自己的 dbpath。

mkdir 1
mkdir 2
mkdir 3

然后,启动这三个mongod实例。使用 --replSet 参数指定了 mongod 实例所属 Replica Set 的名字。这个名字是可以随意起的,但必须确保属于同一个 Replica Set 的 mongod 实例设置了相同的 --replSet

mongod --dbpath 1 --port 27001 --replSet myRS
mongod --dbpath 2 --port 27002 --replSet myRS
mongod --dbpath 3 --port 27003 --replSet myRS

最后,启动Replica Set。使用 mongo 连入随便一个 mongod 实例,并进行设置。在 conf 中,我们将 _id 设置为 Replica Set 的名称,并在 members 中设置了 Replica Set 所有成员的信息,其中包括成员的名称 _id 以及成员的主机名 host

var conf = {
  _id : "myRS",
  members : [
    { _id : 1, host : "localhost:27001" },
    { _id : 2, host : "localhost:27002" },
    { _id : 3, host : "localhost:27003" }
  ]
}

rs.initiate(conf)

Shard 集群部署

在本机上部署一个完整的生产级别的 MongoDB Shard 集群。集群由 4 个 Shard 负责存储数据,其中每个 Shard 都是包含三个结点的 Replica Set。除此之外,集群还包括 4 个 mongos 和 3 个 Config Server。

4 个 Replica Set 的信息分别如下:

{
  _id : "a",
  members : [
    { _id : "a1", host : "localhost:27001" },
    { _id : "a2", host : "localhost:27002" },
    { _id : "a3", host : "localhost:27003" }
  ]
}

{
  _id : "b",
  members : [
    { _id : "b1", host : "localhost:27101" },
    { _id : "b2", host : "localhost:27102" },
    { _id : "b3", host : "localhost:27103" }
  ]
}

{
  _id : "c",
  members : [
    { _id : "c1", host : "localhost:27201" },
    { _id : "c2", host : "localhost:27202" },
    { _id : "c3", host : "localhost:27203" }
  ]
}


{
  _id : "d",
  members : [
    { _id : "d1", host : "localhost:27301" },
    { _id : "d2", host : "localhost:27302" },
    { _id : "d3", host : "localhost:27303" }
  ]
}

集群各成员启动

首先,分别启动集群的各个成员,分别是 Shard、Config Server 和 Query Router。其中前两种成员均为 mongod,而 Query Router 则是 mongos。

单个 Replica Set 的配置方式大致上无太大变化,只是作为 Shard Server 在启动 mongod 时需要加上–shardsvr选项。 以 Replica Set a 为例:

mkdir a{1,2,3}

mongod --shardsvr --replSet a --dbpath a1 --logpath log.a1 --port 27001 --fork
mongod --shardsvr --replSet a --dbpath a2 --logpath log.a2 --port 27002 --fork
mongod --shardsvr --replSet a --dbpath a3 --logpath log.a3 --port 27003 --fork

注意:当 --shardsvr 选项被打开时,mongod 的默认端口号变为 27018。

然后,使用 mongo 连接至任意一个 mongod 实例,启动 Replica Set:

var conf = {
  _id : "a",
  members : [
    { _id : "a1", host : "localhost:27001" },
    { _id : "a2", host : "localhost:27002" },
    { _id : "a3", host : "localhost:27003" }
  ]
}

rs.initiate(conf)

重复上述操作即可启动其余三个 Replica Set。

接下来开始启动 Config Server:

mkdir cfg{1,2,3}

mongod --configsvr --dbpath cfg1 --logpath log.cfg1 --port 26050 --fork
mongod --configsvr --dbpath cfg2 --logpath log.cfg2 --port 26051 --fork
mongod --configsvr --dbpath cfg3 --logpath log.cfg3 --port 26052 --fork

注意:当 --configvr 选项被打开时,mongod 的默认端口号变为27019。

最后,启动 Query Router:

mongos --configdb localhost:26050,localhost:26051,localhost:26052 --logpath log.mongos1 --fork
mongos --configdb localhost:26050,localhost:26051,localhost:26052 --logpath log.mongos2 --port 26061 --fork
mongos --configdb localhost:26050,localhost:26051,localhost:26052 --logpath log.mongos3 --port 26062 --fork
mongos --configdb localhost:26050,localhost:26051,localhost:26052 --logpath log.mongos4 --port 26063 --fork

注意:mongos 的默认端口号为27017,与 mongod 、 mongo 的默认端口号相同。

如此一来,集群的各个成员都启动完毕了,可以开始配置集群了。

添加 Shard

实际上,在启动 mongos 时,我们已经指定了集群所使用的 Config Server 的地址。接下来就是为集群指定每个 Shard 的地址了。

打开 mongo 连接至任意一个 mongos,并执行如下指令:

sh.addShard("a/localhost:27001")
sh.addShard("b/localhost:27101")
sh.addShard("c/localhost:27201")
sh.addShard("d/localhost:27301")

注意:我们添加 Shard 时,输入了 Replica Set 的名称以及其中一个成员的地址。该成员并不一定得是 Primary,只要它是该 Replica Set 的成员,mongos 就能自动发现 Replica Set 的其他所有成员。

在添加了 4 个 Shard 以后,整个 Shard 集群便配置完毕,可以开始使用了。

Reference

  1. MongoDB 官方文档

  2. MongoDB 分布式部署教程

  3. mongodb分布式集群架构

Clone this wiki locally