MongoDB分片集群基本配置

发布时间:2017-12-05 编辑:小张个人博客 查看次数:7628

MongoDB分片集群简介

在之前有说过关于MongoDB的复制集,复制集主要用来实现自动故障转移从而达到高可用的目的,然而,随着业务规模的增长和时间的推移,业务数据量会越来越大,当前业务数据可能只有几百GB不到,一台DB服务器足以搞定所有的工作,而一旦业务数据量扩充大几个TB几百个TB时,就会产生一台服务器无法存储的情况,此时,需要将数据按照一定的规则分配到不同的服务器进行存储、查询等,即为分片集群。分片集群要做到的事情就是数据分布式存储。

MongoDB分片集群架构设计

MongoDB分片集群


先做一些解释: 

1.shard片:一般为一台单独的服务器,即为一个数据存储节点,这个存储节点需要做复制集,实现高可用以及自动故障转移,一般一个分片集群有多个shard片; 

2. config服务器:主要是记录shard的配置信息(元信息metadata),如数据存储目录,日志目录,端口号,是否开启了journal等信息,为了保证config服务器的可用性,也做了复制集处理,注意,一旦配置服务器无法使用,则整个集群就不能使用了,一般是独立的三台服务器实现冗余备份,这三台可能每一台是独立的复制集架构。 

3.Mongos路由进程(Router):应用程序通过驱动程序直接连接router,router启动时从配置服务器复制集中读取shared信息,然后将数据实际写入或读取(路由)到具体的shard中。

MongoDB-分片优势

读/写

MongoDB的读写负载分布在碎片在分片集群,让每个碎片处理群集操作的子集。读取和写入工作负载可以bescaled横向集群添加更多的碎片。

对于查询,包括碎片钥匙或一个前缀复合碎片的关键,mongos可以针对查询特定的碎片或碎片。这些targetedoperations通常是更有效的比广播在集群中的每一个碎片。

存储容量

分片将数据分布在碎片内,允许每个碎片包含集群的总数据的一个子集。随着数据集的增长,更多的碎片增加群集的存储容量。

高可用性

一分片集群可以继续即使一个或多个碎片可执行部分读/进行中写入操作。而在没有碎片的子集数据不能停机期间访问,readsor写针对可用的碎片仍然可以成功。


在MongoDB3.2开始,您可以部署配置服务器作为副本集。分片集群配置服务器与副本集(CSR)可以继续处理读取和写入只要多数副本集是可用的。反转3.4、MongoDB删除SCCC配置服务器支持。升级你的配置服务器从SCCC现今,看升级配置服务器副本集

在生产环境中,个体的碎片应部署副本集,提供增加的冗余性

MongoDB-部署配置

注意:此处由于我这边只有一台服务器(PC机),所以这里实现的是一个伪集群,部署架构如图所示: 

MongoDB-部署配置


一个Shard(复制集模式),一个config进程,一个router进程,均在同一台服务器上面

沿用上一节的复制集作为shard,


1、在2台独立服务器上,分别运行 27018,27019实例, 互为副本集,形成2套repl set

2、在2台服务器上,各配置config server, 运行27020端口上

mongod --dbpath D:\MongoDB\data\m1 --logpath D:\MongoDB\data\log1\1.log --port 27018 
mongod --dbpath D:\MongoDB\data\m2 --logpath D:\MongoDB\data\log2\2.log --port 27019

配置config server

mongod --dbpath D:\MongoDB\data\m3 --logpath D:\MongoDB\data\log3\3.log --configsvr --port 27020

配置Mongos路由

mongos --logpath D:\MongoDB\data\log4\4.log  --port 27021 --configdb 192.168.1.107:27020  --quiet

新启mongo客户端-连接路由器

./bin/mongo --port 27021

添加repl set为片

sh.addShard('192.168.1.107:27018');
sh.addShard('192.168.1.107:27019');

查看状态

 sh.status()

mongodb分片

制定分片规则

添加待分片的库

sh.enableSharding('test')

添加待分片的表(注:分片前创建一个以分片键开头的索引)

sh.shardCollection("test.user",{uid:1})


uiduser的一个字段,系统将会利用uid的值,来计算应该分到哪一个片上.

这个uid叫”片键”, shard key

添加测试数据

for(var i=1; i<=20000;i++){
   db.user.insert(uid:i,name:'xiaoqing')
}


mongodb不是从单篇文档的级别,绝对平均的散落在各个片上, 而是N篇文档,形成一个块"chunk",优先放在某个片上, 当这片上的chunk,比另一个片的chunk,区别比较大时, (>=3) ,会把本片上的chunk,移到另一个片上, 以chunk为单位,维护片之间的数据均衡

问: 为什么插入了10万条数据,才2个chunk?

答: 说明chunk比较大(默认是64M),在config数据库中,修改chunksize的值.

问: 既然优先往某个片上插入,当chunk失衡时,再移动chunk,

自然,随着数据的增多,shard的实例之间,有chunk来回移动的现象,这将带来什么问题?

答: 服务器之间IO的增加, 

能否定义一个规则, 某N条数据形成1个块,预告分配M个chunk,

M个chunk预告分配在不同片上. 以后的数据直接入各自预分配好的chunk,不再来回移动?

答: 能, 手动预先分片(sh.splitAt(fullName,middle))!

for(var i=1; i<=20;i++){
   sh.splitAt('test.user',{uid:i*1000})
}

添加测试数据

for(var i=1; i<=20000;i++){
   db.user.insert({uid:i,name:'hello xiaoqing'})
}

mongodb手动分片

预先在1K 2K...20K这样的界限切好chunk(虽然chunk是空的), 这些chunk将会均匀移动到各片上.

通过mongos添加user数据. 数据会添加到预先分配好的chunk上, chunk就不会来回移动


参考文档:《mongodb文档



出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号