MongoDB分片

  这几天在学习MongDB的分片技术,网上搜了好多资料,那些资料都比较老了,新版的MongDB已经不支持以前的那种分片方法了,最后都是失败告终。我用的版本是MongDB3.4,后面直接去官网看了一下,这也是自己第一次看全英文看文档,毕竟一直看中文的资料的,过程有点小痛苦,但是最后做出来,还是爽歪歪的哈。废话不多说,下面进行总结一下。官网的资料地址:https://docs.mongodb.com/manual/tutorial/deploy-shard-cluster/

  下面看一下MongoDB的分片技术框架图:如下

  

  mongos,数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器,mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

  shard,数据储存的地方。俗话说三个臭皮匠顶个诸葛亮,这个时候团队的力量就凸显出来了。在互联网也是这样,一台普通的机器做不了的多台机器来做,如下图:

  

  config server,顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置。mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。

  replica set,上图4个分片如果没有 replica set 是个不完整架构,假设其中的一个分片挂掉那四分之一的数据就丢失了,所以在高可用性的分片架构还需要对于每一个分片构建 replica set 副本集保证分片的可靠性。

  下面总结一下如何进行环境的搭建,由于我是在一台机器上搭建的,所以所有端口都需要不一样。(相应的数据,日志文件夹需要提前先建立好)

  (1)一个config server服务器(172.31.18.239:27000)(正常情况下也需要多个副本,防止一个宕机后,无法对外提供服务)

  启动cmd控制台输入:mongod --configsvr --replSet rs0 --dbpath=D:mongoDBconfigdata --logpath=D:mongoDBconfigloglog.txt --port 27000

  启动客户端连接config server服务器:输入rs.initiate({_id:"rs0",configsvr:true,members:[{_id:0,host:"172.31.18.239:27000"}]})

  (2)创建分片服务器,这里需要2个分片(172.31.18.239:27020)(172.31.18.239:27022)同时,需要两个分片的副本集(172.31.18.239:27021)(172.31.18.239:27023)。

   启动cmd控制台输入:mongod --shardsvr --replSet s1 --dbpath=D:mongoDBsharedshared0data

            --logpath=D:mongoDBsharedshared0loglog.txt --port 27020

  启动cmd控制台输入:mongod --shardsvr --replSet s1 --dbpath=D:mongoDBsharedshared1data

            --logpath=D:mongoDBsharedshared1loglog.txt --port 27021

  启动客户端连接其中一个服务器,这里我连接了端口号为27020的服务器:

  输入:rs.initiate({_id:"s1",members:[{_id:0,host:"172.31.18.239:27020"},{_id:1,host:172.31.18.239:27021"}]})

  同理,按照以上方式启动另外一个分片(172.31.18.239:27022)以及副本集172.31.18.239:27023。

  (3)启动mongos服务器(默认端口27017)

  启动cmd控制台输入:mongos --configdb s0/172.31.18.239:27000 

  启动客户端连接mongos服务器输入:mongo 

  (4)将分片加入集群中(Add Shards to the Cluster)

  在mongo客户端中输入:sh.addShard( "s1/172.31.18.239:27020");sh.addShard( "s2/172.31.18.239:27022");

  (5)指定数据库开启分片功能(Enable Sharding for a Database)

  在mongo客户端中输入:sh.enableSharding("test")

  (6)指定数据库中某个集合开启分片功能(Shard a Collection using Hashed Sharding)

  在mongo客户端中输入:sh.shardCollection("test.persons", { name : 1 } )(需要指定集合中的某个键)

  到此,分片的功能已经实现了。可以使用命令db.printShardingStatus()查看分片的情况。

  

  在客户端输入:for(var i=0;i<100;i++){db.persons.insert({name:"a"+i})}; for(var i=0;i<10000;i++){db.persons.insert({name:"jack"+i})}

    查看两台分片的数据:如下:

  

原文地址:https://www.cnblogs.com/gdpuzxs/p/6836212.html