当前位置:u赢电竞手机版 > uwin电竞app官网下载 > mongo 3.4分片集群系列之一:浅谈分片集群uwin电竞

mongo 3.4分片集群系列之一:浅谈分片集群uwin电竞

文章作者:uwin电竞app官网下载 上传时间:2019-05-14

一、概述

分片是一种在多台机器上分配数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作。有两种解决系统增长的方法:垂直扩展和水平扩展。

垂直扩展涉及增加单个服务器的容量,例如使用更强大的CPU,增加更多RAM或增加存储空间量等。介于硬件成本和硬件性能单机器能支持的并发访问和存储容量是有限的。因此,垂直扩展是存在最大上限的。

水平扩展包括将系统数据集和负载分配到多个服务器上,添加额外的服务器以根据需要增加容量。尽管单台机器的整体速度或容量可能并不高,但每台机器可处理整个工作负载的一部分,效率可能会高于单台高速大容量服务器。而且很多时候可以选择成本很低的普通PC电脑;与单台机器的高端硬件相比,总成本可能会更低,但是增加了维护的复杂性。

 

MongoDB版本:3.6 

这篇为理论篇,稍后会有实践篇。

二、分片集群架构

这个系列大致想跟大家分享以下篇章:

uwin电竞app官网下载 1

1、mongo 3.4分片集群系列之一:浅谈分片集群

1).分片

分片的含义是指将数据拆分,将其分散存放在不同的机器上的过程,MongoDB的分片机制允许你创建一个包含许多台机器的集群,将数据子集分散在集群中,每一个分片维护着一个数据集合的子集。与单机服务器和副本集相比,使用分片集群架构可以使应用程序具有更大的数据处理能力。

备注:每一个分片都是由一个副本集组成。从MongoDB 3.6版本之后,分片必须是副本集。

2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片

2).配置服务器

配置服务器是整个集群的大脑,保存着集群和分片的元数据库,比如:分片信息、群集数据库信息、分片集合信息、块信息、平衡器信息、版本信息、群集操作日志、相关设置信息等。因此配置服务器数据必须保存在非易失性驱动器上。每个配置服务器都应该位于单独的物理机器上,最好是异地分布,同时还需要启用日志功能。

备注:在Mongos3.4版本之后,配置服务器也必须是副本集。

3、mongo 3.4分片集群系列之三:搭建分片集群--哈希分片 安全

3).Mongos进程

Mongos提供客户端应用程序和分片群集之间的接口。

部署多个mongos支持高可用性和可伸缩性;常见的模式是mongos在每个应用程序服务器上部署一个 ,在每个应用程序服务器上部署一个 可减少应用程序和之间的网络延迟。或者您可以专用的服务器上部署mongos。大型部署一般使用此方法,因为它将客户端应用程序服务器与mongos分离 这可以更好地控制mongod实例的连接数量。

可以在主分片上部署mongos,mongos不会与mongod实例共享内存。需要注意内存争用可能导致的问题。

理论上可以部署无数个mongos路由。但是由于mongos路由经常与配置服务器进行通信,所以在增加mongos数量时应该密切监视配置服务器的性能。如果您看到性能下降,应该现在mongos的数量

4、mongo 3.4分片集群系列之四:搭建分片集群--哈希分片 安全 区域

三、部署分片 

5、mongo 3.4分片集群系列之五:详解平衡器

1).环境

192.168.137.10:rs-a-1:27010;rs-a-2:27011;rs-a-3:27012

192.168.137.20:rs-b-1:28010;rs-b-2:28011;rs-b-3:28012

192.168.137.30:config-1:29010,config-2:29011;config-3:29012;mongos:30000

rs-a分片副本集配置

--------------rs-a-1配置-------------------------
pidfilepath = /rs-a-1/mongod.pid
logpath = /rs-a-1/data/log/mongod.log
dbpath = /rs-a-1/data/db
logappend = true
port = 27010
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-1/autokey

--------------rs-a-2配置-------------------------
pidfilepath = /rs-a-2/mongod.pid
logpath = /rs-a-2/data/log/mongod.log
dbpath = /rs-a-2/data/db
logappend = true
port = 27011
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-2/autokey

--------------rs-a-3配置-------------------------
logpath = /rs-a-3/data/log/mongod.log
dbpath = /rs-a-3/data/db
logappend = true
port = 27012
fork = true
auth = true
replSet = rs-a
shardsvr = true
keyFile = /rs-a-3/autokey

rs-b分片副本集配置

--------------rs-b-1配置-------------------------
pidfilepath = /rs-b-1/mongod.pid
logpath = /rs-b-1/data/log/mongod.log
dbpath = /rs-b-1/data/db
logappend = true
port = 28010
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-1/autokey

--------------rs-b-2配置-------------------------
pidfilepath = /rs-b-2/mongod.pid
logpath = /rs-b-2/data/log/mongod.log
dbpath = /rs-b-2/data/db
logappend = true
port = 28011
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-2/autokey

--------------rs-b-3配置-------------------------
pidfilepath = /rs-b-3/mongod.pid
logpath = /rs-b-3/data/log/mongod.log
dbpath = /rs-b-3/data/db
logappend = true
port = 28012
fork = true
auth = true
replSet = rs-b
shardsvr = true
keyFile = /rs-b-3/autokey

config配置服务器配置

--------------config-1配置-------------------------
pidfilepath = /config-1/mongod.pid
logpath = /config-1/data/log/mongod.log
dbpath = /config-1/data/db
logappend = true
port = 29010
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-1/autokey

--------------config-2配置-------------------------
pidfilepath = /config-2/mongod.pid
logpath = /config-2/data/log/mongod.log
dbpath = /config-2/data/db
logappend = true
port = 29011
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-2/autokey

--------------config-3配置-------------------------
logpath = /config-3/data/log/mongod.log
dbpath = /config-3/data/db
logappend = true
port = 29012
fork = true
auth = true
configsvr = true
replSet = config
keyFile = /config-3/autokey

Mongos路由配置

configdb = config/192.168.137.30:29010,192.168.137.30:29011,192.168.137.30:29012
port = 30000
logpath = /mongos/log/route.log
bind_ip = 192.168.137.30,127.0.0.1
logappend = true
fork = true
keyFile = /mongos/autokey
maxConns=20000

备注:当前为了便于理解所以节点的分布不合理,如果是真实的生成环境每个数据节点都应该分开。

6、mongo 3.4分片集群系列之六:详解配置数据库

2).分片配置

1.启动所有分片副本集(rs-a,rs-b)和配置服务器(config)

具体方法可以参考我前面写的搭建副本集的文章。

MongoDB 搭建可复制群集:

2.启动mongos路由

mongos --config /mongos/mongos.conf

3.分片配置

登入验证

mongo --port 30000
use admin
db.auth("dba","dba")

添加分片

sh.addShard("rs-a/192.168.137.10:27010,192.168.137.10:27011,192.168.137.10:27012");
sh.addShard("rs-b/192.168.137.20:28010,192.168.137.20:28011,192.168.137.20:28012");

文档分片

use admin
sh.enableSharding("test");
sh.shardCollection("test.person",{_id:1});

sh.enableSharding("news");
sh.shardCollection("news.person",{"username":"hashed"});

备注:这里的分片方式有1,-1,hashed三种;

1.如果分片集合是空集合那么可以不需要提前创建索引,对集合分片默认会对分片字段创建索引。

2.如果分片集合是非空集合那么需要手动创建索引。

3.如果分片集合存在唯一索引,那么分片必须是唯一索引上的键。

具体参考:

插入测试数据

use test;
for(var i=0;i<100000;i  ){ db.person.insert({"_id":i,"username":"user" i,"createdate":new Date()})}

use news;
for(var i=0;i<100000;i  ){ db.person.insert({"_id":i,"username":"user" i,"createdate":new Date()})}

7、mongo 3.4分片集群系列之七:配置数据库管理

3).查询

sh.status();

uwin电竞app官网下载 2

备注:可以看到rs-a;rs-b两个分片上的数据库块都是一样的,分布的很均匀,接下来看一下增加一个新分片之后数据库块的分布情况。

8、mongo 3.4分片集群系列之八:分片管理

4).添加新分片

uwin电竞app官网下载 3

 备注:添加新的分片之后,mongos再一次移动了数据块,保证数据块在每一个分片上都均匀的分布。数据库的移动是异步的。

 

 四、总结

Mongos采取异步的方式将数据块移动到其它的分片,数据块不能设的太小否则对于密集写的系统所有的写操作会集中到一个分片上,最后异步移动数据块到其它的分片。

 

 

 

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。

《欢迎交流讨论》

 

1、分片集群是个啥玩意儿

要回答这个问题,首先得知道它是由什么东东组成的。

MongoDB分片集群由以下组件组成:

  • mongos:mongos作为查询路由器,提供客户端应用程序和分片集群之间的接口。
  • 配置服务器:配置服务器存储集群的元数据和配置信息。从MongoDB 3.4开始,配置服务器必须部署为副本集(CSRS)。
  • 分片:每个分片包含分片数据的一部分。每个分片可以部署为副本集。

   uwin电竞app官网下载 4

MongoDB基于集合级别的数据分片,将集合数据分布在集群的分片上。

2、 为啥要用分片集群(分片的好处)

  分片是一种在多台机器上存储数据的方法。MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。

1)工作负载

  MongoDB将读写工作负载分布在分片集群的 分片上,从而允许每个分片处理集群操作的一个子集。通过添加更多的分片,可以在集群之间水平地缩放读取和写入的工作负载。

2)存储容量

  分片用来存储数据,当数据集增大,可以通过添加分片来扩展分片集群的容量。因此,理论上,分片集群的容量可以无限水平扩展。

3)高可用

  分片集群可以继续执行部分读/写操作,即使一个或多个分片不可用。虽然在停机期间无法访问不可用的分片上的数据子集,但是可用分片上的读取或写入仍然可以成功。

3、分片集群要知道的名词(分片键,块)

1)分片键

  分片键就是由集合中每个文档中存在的字段或不可变字段组成。

  分片键的作用:MongoDB 使用分片键对集合进行分片。

  注意:分片后的分片键的选择不能改变,也就是说字段不能更改为其他字段,并且字段的值不能修改。分片集合只能有一个分片键。

  要分割非空集合,集合必须具有 以分片键开头的索引。对于空集合,如果集合尚未具有指定分片键的适当索引,则MongoDB将创建索引。

  分片键的选择会影响分片集群的性能,效率和可扩展性。

2)块

本文由u赢电竞手机版发布于uwin电竞app官网下载,转载请注明出处:mongo 3.4分片集群系列之一:浅谈分片集群uwin电竞

关键词: MongoDB