-
Notifications
You must be signed in to change notification settings - Fork 8
MongoDB Distribution Learning Doc
2019/10/8 姜其升 徐浩宇
[TOC]
MongoDB集群包括一定数量的mongod(分片存储数据)、mongos(路由处理)、config server(配置节点)、clients(客户端)、arbiter(仲裁节点:为了选举某个分片存储数据节点那台为主节点)。

一个shard为一组mongod,通常一组为两台,主从或互为主从,这一组mongod中的数据时相同的。数据分割按有序分割方式,每个分片上的数据为某一范围的数据块,故可支持指定分片的范围查询,数据块有指定的最大容量,一旦某个数据块的容量增长到最大容量时,这个数据块会切分成为两块;当分片的数据过多时,数据块将被迁移到系统的其他分片中。另外,新的分片加入时,数据块也会迁移。
可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。
存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。
为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段组成以分发数据。shard key相邻的数据通常会存在同一台服务(数据块)上.
服务器部署可以有多种方式。首先,每台config server、mongos、mongod都可以是单独的服务器,但这样会导致某些服务器的浪费,比如config server。下图为物理机共享的集群部署,不需要额外加机器。

https://www.mongodb.com/download-center/community
部署一个三节点的 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)在本机上部署一个完整的生产级别的 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 的默认端口号相同。
如此一来,集群的各个成员都启动完毕了,可以开始配置集群了。
实际上,在启动 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 集群便配置完毕,可以开始使用了。