要在真实环境中实现MongoDB分片至少需要四台服务器做分片集群服务器,其中包含两个Shard分片副本集(每个包含两个副本节点及一个仲裁节点)、一个配置副本集(三个副本节点,配置不需要仲裁节点),其中Shard的副本节点必须拥有单独的服务器,通常一个Shard副本集由3个以上副本节点组成更好,奇数个副本节点不需要额外配置仲裁节点。因为仲裁节点和配置节点不需要耗费很多的资源,可以与其他进程共享一台服务器。

当然了,对于平时学习而言,配置那么多服务器是不现实的,用VM虚拟机也不现实,毕竟MongoDB内存开销不小,所以暂时将所有需要的数据库配置在同一台电脑,以不同端口区分,其中包含以下几个数据库

Shard节点

  Shard-a-1 端口 37001

  Shard-a-2 端口 37002

  Shard-a-3 端口 37003

--------------------------------------------------------------------  

  Shard-b-1 端口 37011

   Shard-b-2 端口 37012

   Shard-b-3 端口 37013

Config节点

  Config-1 端口 41001

  Config-2 端口 41002

  Config-3 端口 41003

Router节点

  Router 端口 50000

文件目录大概如下,其中router中的config改为 mongos.cfg

其中Shard节点和Config节点和开启普通MongoDB数据库一样,用Mongod启动,在Windows下不能使用 fork参数后台化,个人更推荐使用Service来托管

其中Shard节点的配置如下,每个文件夹下对应的配置把dbpath/logpath/replSet(shard-a和shard-b)改掉,因为要开启多个db所以httpinterface设置为false,不开启监听,否则每个db都会对应多一个端口号+1000的监听端口,37002的监听端口为38002

  1. dbpath=D:\mongodatas\shard-a2\data
  2. logpath=D:\mongodatas\shard-a2\log\mongod.log
  3. logappend=true
  4. directoryperdb=true
  5. rest=true
  6. httpinterface=false
  7. port=37002
  8. shardsvr=true
  9. replSet=shard-a

Config节点的配置如下,与shard节点的区别就是shardsvr换成了configsvr,配置服务器是不会开启监听端口的

  1. dbpath=D:\mongodatas\config1\data
  2. logpath=D:\mongodatas\config1\log\mongod.log
  3. logappend=true
  4. directoryperdb=true
  5. rest=true
  6. port=41001
  7. configsvr=true
  8. replSet=configset

接下来以托管到Service的方式启动所有的Shard节点和Config节点,以下只是启动其中一个,一共有九个(shard-a有3个,shard-b有3个,config有3个),在命令提示符(管理员) 的窗口执行,普通权限会报错的,下文用到Service的一样

  1. sc create MongoShardA1 binPath= "C:\Program Files\MongoDB\Server\3.4\bin\mongod.exe --config=D:\mongodatas\shard-a1\mongod.cfg --service"
  2. net start MongoShardA1

使用命令  services.msc打开服务窗口查看服务是否开启或者使用 netstat -nao指令查端口是否开启,如果全都正常开启,则开始配置Shard副本集

任意连接shard-a中服务器 (37001/37002/37003)打开MongoDB Shell

  1. mongo --port 37001

对副本集进行初始化,如果对rs方法不熟悉,可以使用rs.help()显示帮助文档

  1. rs.initiate()

此时发现37001端口的命令输入已经成为了副本集的形式,接下来添加另外两个成员,一个副本节点,一个仲裁节点

  1. rs.add("localhost:37002")
  2. rs.add("localhost:37003",{arbiterOnly:true})

最好使用本机的内网地址,而不是使用localhost或者127.0.0.1

接下来查看副本集是否运行正常

  1. rs.status()

退出现有MongoDB Shell或者开启新的CMD进入Shard-b中任意服务器对Shard-b副本集进行初始化,进入Config副本集任意服务器对Config副本集进行初始化,注意Config副本集进行初始化的时候不需要指定仲裁节点

以上所有操作,对Config副本集进行初始化非常重要,网上有很多示例都没有对Config副本集进行初始化,会导致mongos服务无法开启,连接不上router服务器

现在开始配置router的配置mongos.cfg

  1. configdb=configset/DESKTOP-4NVUAKK:41001,192.168.20.229:41002,192.168.20.229:41003
  2. logpath=D:\mongodatas\router\log\mongod.log
  3. logappend=true
  4. port=50000

注意configdb的配置,新版本里面采用 replSet/hsot:port,host:port的形式,其中host必须采用config副本集里面rs.status()出来的members中的name,否则会执行失败,如果configdb中的副本集没有执行初始化设定Primary ,此时用Service是无法启动成功的,但是用指令启动会给人一种启动成功的假象,查看router对应的日志会发现一只在尝试连接Config副本集: No primary detected for set configset,此时查看任务管理器会发现有mongos的进程,查看端口会发现router的端口并未打开

以托管到Service的方式开始Router服务

  1. sc create MongoRouter binPath= "C:\Program Files\MongoDB\Server\3.4\bin\mongos.exe --config=D:\mongodatas\shard-a1\mongos.cfg --service"
  2. net start MongoRouter

注意上面的执行程序是mongos而不是mongod 配置文件名不要弄错了

正常启动Router服务器之后,连接到router数据库的MongoDB Shell

  1. mongo --port 50000

开始为router指定分片副本集,具体操作如截图所示

  1. sh.addShard("replSet/host:port,host:port")

注意不要使用localhost或者127.0.0.1,否则会报错

使用与副本集Members里面name不一致的host也是会报错的

正常情况下添加成功如下

查看数据库config中的shards集合

  1. db.getSiblingDB("config").shards.find() 或者 db.runCommand({listshards:1})

到现在为止,分片环境已经搭建成功,但要引用到数据库和文档上,还需要对数据库和文档进行分片

开启一个数据库上的分片,这是对任何集合进行分片的先决条件

  1. sh.enableSharding("dbName")

完成之后去config里查看是否分片

  1. db.getSiblingDB("config").databases.find()

对数据库上的某个集合进行分片,要定义一个分片键,可以使用组合分片建,像我使用的是author和_id的组合,如果是对现有集合进行分片,必须在运行shardcollection命令前创建一个与分片键对应的索引

  1. sh.shardCollection("dbName.collectionName",{key1:1,key2:1})
  2.  
  3. db.getSiblingDB("config").collections.find()

对空集合进行、分片时 MongoDB会字每个分片上创建一个与分片键对应的索引,可以直接连接分片,用getIndexes()验证,此时数据量还没达到分片标准啊,分片shard-a副本集还没有创建books

用客户端连接router服务器(和连接普通服务器一样)插入大量数据,调用sh.status()可以看到分配到两个shard上保存了

db.chunks.count("shard","shard-a")

db.chunks.count("shard","shard-b")

查看拆分次数

db.changelog.count({what:"split"})

查看迁移次数

db.changelog.find({what:"moveChunk.commit"}).count()

可以通过db.books.find(****).explain() 查看执行计划

如果查询条件包含分片键,则能很快找到对应分区 针对性查询,否则将遍历所有分区 全局/分散/聚集查询

db.books.ensureIndex({title:1}) 在title上创建索引

每个分片都维护自己的索引,每个分片上的分片集合都应该拥有相同的索引

分片集合只允许在_id字段和分片键上添加唯一索引

分片键是不可以修改的,不要使用升序分片键,粒度不能太细(如照片就不应该按md5分,而应该按所属人分)

副本集的每个成员都应该在一个单独的服务器上,用于复制的成员要有自己的机器,

仲裁节点和配置节点可以与其他进程共享主机,但需要部署在不同服务器

少数大分片比大量小分片好

手动块拆分

sh.splitAt("dbname.collectionName",{key,value,key:value}) 根据key分块  value是数据库中的值,根据这个值拆分成两块

sh.moveChunk("dbname.collectionName",{key,value},"shardB") 将包含key为value的文档移动到分片B

MongoDB 3.4 分片 由副本集组成的更多相关文章

  1. mongodb的分布式集群(4、分片和副本集的结合)

    概述 前面3篇博客讲了mongodb的分布式和集群,当中第一种的主从复制我们差点儿不用,没有什么意义,剩下的两种,我们不论单独的使用哪一个.都会出现对应的问题.比較好的一种解决方式就是.分片和副本集的 ...

  2. Mongodb 分片与副本集

    测试搭建192.168.3.110mongos 30000,30001,30002config 40000,40001,40002shard1 50001,50002,50003shard2 5000 ...

  3. MongoDB 学习笔记之 分片和副本集混合运用

     分片和副本集混合运用: 基本架构图: 搭建详细配置: 3个shard + 3个replicat set + 3个configserver + 3个Mongos shardrsname Primary ...

  4. MongoDB学习笔记——Replica Set副本集

    副本集 可以将MongoDB中的副本集看作一组服务器集群由一个主节点和多个副本节点等组成,相对于之前讲到的主从复制提供了故障自动转移的功能 副本集实现数据同步的方式依赖于local数据库中的oplog ...

  5. MongoDB分布式集群搭建(分片加副本集)

    # 环境准备 服务器 # 环境搭建 文件配置和目录添加 新建目录的操作要在三台机器中进行,为配置服务器新建数据目录和日志目录 mkdir -p $MONGODB_HOME/config/data mk ...

  6. 快速掌握mongoDB(五)——读写分离的副本集实现和Sharing介绍

    1 mongoDB副本集 1 副本集简介 前边我们介绍都是单机MongoDB的使用,在实际开发中很少会用单机MongoDB,因为使用单机会有数据丢失的风险,同时单台服务器无法做到高可用性(即当服务器宕 ...

  7. 修改mongodb(带仲裁节点的副本集)各机器端口

    需求:因为端口调整,需要改变副本的备份集 1.查看当前的副本集信息 [root@localhost bin]# ./mongo 192.168.1.134:10001 repltest:PRIMARY ...

  8. MongoDB数据库 : 管道,用户管理,副本集等

    聚合(aggregate): db.集合.aggregate([{管道:{表达式}}]) db.集合.aggregate([ {管道1:{表达式1}}, {管道2:{表达式2}}, ... ...]) ...

  9. [原创]在Docker上部署mongodb分片副本集群。

    一.安装docker. 请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html 二.编写dockerfile. 1.在根目录下创建mongod的do ...

随机推荐

  1. Creating an generated Earth AVI with C++

    Creating an generated Earth AVI with C++        EarthGenerator.cpp /*    EarthGenerator.cpp An examp ...

  2. Linux系统——shell脚本

    shell脚本编程 作用:通过命令行解析的方式,自动执行设定好的程序或命令代码.(若将脚本挂到定时任务中,就会自动在非工作时间里自动触发执行程序) Shell脚本文件以“.sh”结尾 规范的Shell ...

  3. C#使用window API 控制打印纸张大小(转载)

    windows一个特点就是设备无关性,这样就给程序控制打印机提供了很好的方法. 首先引用“泥人张”写的打印API类. using System;using System.Collections;usi ...

  4. Android 4.4 音量调节流程分析(一)

    最近在做Android Audio方面的工作,有需求是在调节Volume_Up_Key & Volume_Down_key时,Spearker or Headset每音阶的衰减变为3db左右. ...

  5. ABP官方文档翻译 1.5 多租户

    多租户 什么是多租户? 数据库和部署架构 多部署-多数据库 单部署-多数据库 单部署-单数据库 单部署-混合数据库 多部署-单/多/混合数据库 ABP的多租户 启用多租户 租主和租户 会话 决定当前租 ...

  6. 快用Visual Studio(五)- 语言特性

    HTML 自带Emment $ SHIFT + OPTION + F:格式化代码 其他语言特性提示 CSS & LESS hover属性,提示样式对象标签 $ CMD + SHIFT + O: ...

  7. Metasploit 学习

    知识准备:CCNA/CCNP基础计算机知识框架:操作系统.汇编.数据库.网络.安全 木马.灰鸽子.口令破解.用后门拷贝电脑文件 渗透测试工程师 penetration test engineer &l ...

  8. Linq to SQL - 撤销所有未提交的改动

    在某些情况下我们需要撤销/丢弃所有未提交的改动,包括Update, Delete和Insert.context中GetChangeSet()方法可以返回当前所有未提交的改动,而我们的目标是清空Chan ...

  9. [BZOJ1584]Cleaning Up 打扫卫生

    Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的 ...

  10. filebeat 乱码

    查看 文件的类型 [root@elk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII ...