zoukankan      html  css  js  c++  java
  • 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})}

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

      

  • 相关阅读:
    ZJNU 1138
    ZJNU 1133
    架构设计:系统存储(21)——图片服务器:详细设计(1)
    架构设计:系统存储(20)——图片服务器:需求和技术选型(2)
    架构设计:系统存储(19)——图片服务器:需求和技术选型(1)
    架构设计:系统存储(18)——Redis集群方案:高性能
    大端模式和小端模式
    阶段性纠错邀请
    架构设计:系统存储(17)——Redis集群方案:高可用
    Android深入浅出之Binder机制
  • 原文地址:https://www.cnblogs.com/gdpuzxs/p/6836212.html
Copyright © 2011-2022 走看看