>使用一台Windows机器模拟集群分片部署,配置方案如下:

  • 3个分片sharding
  • 每一个分片由三个节点构成1主2备的 Replica Sets
  • 3个配置节点Configserver
  • 一个路由节点Mongos

分片复制集A(三个分片节点构成一个复制集):127.0.0.1:10000   127.0.0.1:10001  127.0.0.1:10002

分片复制集B(三个分片节点构成一个复制集):127.0.0.1:20000   127.0.0.1:20001  127.0.0.1:20002

分片复制集C(三个分片节点构成一个复制集):127.0.0.1:30000   127.0.0.1:30001  127.0.0.1:30002

Configsvc(三个配置服务器节点):127.0.0.1:40000   127.0.0.1:40001  127.0.0.1:4002

mongos(一个路由节点):127.0.0.1:50000

>配置目录

进入安装目录下,创建数据和日志目录:

创建数据文件目录:

data/a/r0、data/a/r1、data/a/r2

data/b/r0、data/b/r1、data/b/r2

data/c/r0、data/c/r1、data/c/r2

data/configsvr/r0、data/configsvr/r1、data/configsvr/r2

创建日志文件目录:

logs/a、logs/b、logs/c、logs/configsvr

>创建分片和复制集

1)配置第一组:

从命令行进入d:/mongodb目录,分别执行如下命令!

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/a/r0.log --logappend --dbpath d:/MongoDB/Server/4.2/data/a/r0 --port 9999 --shardsvr --replSet setA   --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/a/r1.log --logappend --dbpath d:/MongoDB/Server/4.2/data/a/r1 --port 10001 --shardsvr --replSet setA  --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/a/r2.log --logappend --dbpath d:/MongoDB/Server/4.2/data/a/r2 --port 10002 --shardsvr --replSet setA  --oplogSize 64

启动上述分片节点之后,再使用mongo的命令行来初始化复制集

打开命令行输入mongo --port 9999(前提是需要把mongodb配置的环境变量中去)

>config={_id:'setA',members:[{_id:0,host:'127.0.0.1:10000'},{_id:1,host:'127.0.0.1:10001'},{_id:2,host:'127.0.0.1:10002'}]}

> rs.initiate(config);

配置完成后,可以查看复制集状态状态:

rs.status()、rs.isMaster() 等,下面是示例,可以忽略这部分。

可以通过停掉成员,观察故障自动转移,这里不做演示。

setA:PRIMARY> rs.status()
{"set" : "setA","date" : ISODate("2019-10-10T06:47:27.962Z"),"myState" : 1,"term" : NumberLong(1),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"heartbeatIntervalMillis" : NumberLong(2000),"optimes" : {"lastCommittedOpTime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"lastCommittedWallTime" : ISODate("2019-10-10T06:47:23.390Z"),"readConcernMajorityOpTime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"readConcernMajorityWallTime" : ISODate("2019-10-10T06:47:23.390Z"),"appliedOpTime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"durableOpTime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"lastAppliedWallTime" : ISODate("2019-10-10T06:47:23.390Z"),"lastDurableWallTime" : ISODate("2019-10-10T06:47:23.390Z")},"lastStableRecoveryTimestamp" : Timestamp(1570690033, 1),"lastStableCheckpointTimestamp" : Timestamp(1570690033, 1),"members" : [{"_id" : 0,"name" : "127.0.0.1:9999","ip" : "127.0.0.1","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 10685,"optime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2019-10-10T06:47:23Z"),"syncingTo" : "","syncSourceHost" : "","syncSourceId" : -1,"infoMessage" : "","electionTime" : Timestamp(1570679979, 1),"electionDate" : ISODate("2019-10-10T03:59:39Z"),"configVersion" : 1,"self" : true,"lastHeartbeatMessage" : ""},{"_id" : 1,"name" : "127.0.0.1:10001","ip" : "127.0.0.1","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 10079,"optime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2019-10-10T06:47:23Z"),"optimeDurableDate" : ISODate("2019-10-10T06:47:23Z"),"lastHeartbeat" : ISODate("2019-10-10T06:47:25.991Z"),"lastHeartbeatRecv" : ISODate("2019-10-10T06:47:26.587Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "127.0.0.1:9999","syncSourceHost" : "127.0.0.1:9999","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1},{"_id" : 2,"name" : "127.0.0.1:10002","ip" : "127.0.0.1","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 10079,"optime" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1570690043, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2019-10-10T06:47:23Z"),"optimeDurableDate" : ISODate("2019-10-10T06:47:23Z"),"lastHeartbeat" : ISODate("2019-10-10T06:47:25.991Z"),"lastHeartbeatRecv" : ISODate("2019-10-10T06:47:26.614Z"),"pingMs" : NumberLong(0),"lastHeartbeatMessage" : "","syncingTo" : "127.0.0.1:9999","syncSourceHost" : "127.0.0.1:9999","syncSourceId" : 0,"infoMessage" : "","configVersion" : 1}],"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1570690043, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1570690043, 1)
}
setA:PRIMARY> rs.isMaster()
{"hosts" : ["127.0.0.1:9999","127.0.0.1:10001","127.0.0.1:10002"],"setName" : "setA","setVersion" : 1,"ismaster" : true,"secondary" : false,"primary" : "127.0.0.1:9999","me" : "127.0.0.1:9999","electionId" : ObjectId("7fffffff0000000000000001"),"lastWrite" : {"opTime" : {"ts" : Timestamp(1570690223, 1),"t" : NumberLong(1)},"lastWriteDate" : ISODate("2019-10-10T06:50:23Z"),"majorityOpTime" : {"ts" : Timestamp(1570690223, 1),"t" : NumberLong(1)},"majorityWriteDate" : ISODate("2019-10-10T06:50:23Z")},"maxBsonObjectSize" : 16777216,"maxMessageSizeBytes" : 48000000,"maxWriteBatchSize" : 100000,"localTime" : ISODate("2019-10-10T06:50:29.611Z"),"logicalSessionTimeoutMinutes" : 30,"connectionId" : 19,"minWireVersion" : 0,"maxWireVersion" : 8,"readOnly" : false,"ok" : 1,"$clusterTime" : {"clusterTime" : Timestamp(1570690223, 1),"signature" : {"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)}},"operationTime" : Timestamp(1570690223, 1)
}

2)配置第二组:

从命令行进入d:/MongoDB/Server/4.2/bin目录,分别执行如下命令!

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/b/r0.log --logappend --dbpath d:/MongoDB/Server/4.2/data/b/r0 --port 20000 --shardsvr --replSet setB  --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/b/r1.log --logappend --dbpath d:/MongoDB/Server/4.2/data/b/r1 --port 20001 --shardsvr --replSet setB  --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/b/r2.log --logappend --dbpath d:/MongoDB/Server/4.2/data/b/r2 --port 20002 --shardsvr --replSet setB  --oplogSize 64

启动上述分片节点之后,再使用mongo的命令行来初始化复制集

打开命令行输入mongo --port 2000(前提是需要把mongodb配置的环境变量中去)

>config={_id:'setB',members:[{_id:0,host:'127.0.0.1:20000'},{_id:1,host:'127.0.0.1:20001'},{_id:2,host:'127.0.0.1:20002'}]}

> rs.initiate(config);

3)配置第三组:

从命令行进入d:/MongoDB/Server/4.2/bin目录,分别执行如下命令!

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/c/r0.log --logappend --dbpath d:/MongoDB/Server/4.2/data/c/r0 --port 30000 --shardsvr --replSet setC   --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/c/r1.log --logappend --dbpath d:/MongoDB/Server/4.2/data/c/r1 --port 30001 --shardsvr --replSet setC   --oplogSize 64

mongod.exe --logpath d:/MongoDB/Server/4.2/logs/c/r2.log --logappend --dbpath d:/MongoDB/Server/4.2/data/c/r2 --port 30002 --shardsvr --replSet setC   --oplogSize 64

启动上述分片节点之后,再使用mongo的命令行来初始化复制集

打开命令行输入mongo --port 3000(前提是需要把mongodb配置的环境变量中去)

>config={_id:'setC',members:[{_id:0,host:'127.0.0.1:30000'},{_id:1,host:'127.0.0.1:30001'},{_id:2,host:'127.0.0.1:30002'}]}

> rs.initiate(config);

>启动三个配置服务节点Configsvr

从命令行分别执行如下命令,配置三个Configsvr

cd d:/MongoDB/Server/4.2/bin

call mongod.exe --configsvr –replSet cfgReplSet --logpath d:/MongoDB/Server/4.2/logs/configsvr/r0.log --logappend --dbpath d:/MongoDB/Server/4.2/data/configsvr/r0 --port 40000

cd d:/MongoDB/Server/4.2/bin

call mongod.exe --configsvr –replSet cfgReplSet --logpath d:/MongoDB/Server/4.2/logs/configsvr/r1.log --logappend --dbpath d:/MongoDB/Server/4.2/data/configsvr/r1 --port 40001

cd d:/MongoDB/Server/4.2/bin

call mongod.exe --configsvr –replSet cfgReplSet  --logpath d:/MongoDB/Server/4.2/logs/configsvr/r2.log --logappend --dbpath d:/MongoDB/Server/4.2/data/configsvr/r2 --port 40002

注意:–replSet cfgReplSet这个参数是mongodb 3.4之后的要求,因为mongodb3.4之后,要求config server也做成副本集。

将配置节点也做成复制集:

rs.initiate({_id:"cfgReplSet",configsvr:true,members:[{_id:0,host:'127.0.0.1:40000'},{_id:1,host:'127.0.0.1:40001'},{_id:2,host:'127.0.0.1:40002'}]})

>启动一个路由节点:

注意:3.4之后的版本,如果config server不配置replica set,还是采用mongodb 3.2的mirror模式,会报错!

call mongos.exe --configdb cfgReplSet/127.0.0.1:40000,127.0.0.1:40001,127.0.0.1:40002 --logpath  d:/MongoDB/Server/4.2/logs/mongos.log --logappend --port 50000

>在刚启动好的路由上,配置分片:

> use admin

>db.runCommand({addshard:"setA/127.0.0.1:9999,127.0.0.1:10001,127.0.0.1:10002",name:"ShardSetA"})

>db.runCommand({addshard:"setB/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002",name:"ShardSetB"})

>db.runCommand({addshard:"setC/127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002",name:"ShardSetC"})

> printShardingStatus()

配置到这里,集群搭建完毕了!

在完成了集群的搭建工作之后,需要做的就是建立一个数据库,建立表,设置分片主键来初始化数据了!

可以查看配置的具体情况,下面是本次示例,仍可以不用管。

mongos>  printShardingStatus()
--- Sharding Status ---sharding version: {"_id" : 1,"minCompatibleVersion" : 5,"currentVersion" : 6,"clusterId" : ObjectId("5d9ecee2a77cc1d708f69a8a")}shards:{  "_id" : "ShardSetA",  "host" : "setA/127.0.0.1:9999,127.0.0.1:10001,127.0.0.1:10002",  "state" : 1 }{  "_id" : "ShardSetB",  "host" : "setB/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002",  "state" : 1 }{  "_id" : "ShardSetC",  "host" : "setC/127.0.0.1:30000,127.0.0.1:30001,127.0.0.1:30002",  "state" : 1 }active mongoses:"4.2.0" : 1autosplit:Currently enabled: yesbalancer:Currently enabled:  yesCurrently running:  noFailed balancer rounds in last 5 attempts:  0Migration Results for the last 24 hours:No recent migrationsdatabases:{  "_id" : "config",  "primary" : "config",  "partitioned" : true }config.system.sessionsshard key: { "_id" : 1 }unique: falsebalancing: truechunks:ShardSetA       1{ "_id" : { "$minKey" : 1 } } -->> { "_id" : { "$maxKey" : 1 } } on : ShardSetA Timestamp(1, 0) 

>对上面提到的片键补充介绍:

分片是什么?分片就是将数据存储在多个机器上。当数据集超过单台服务器的容量,服务器的内存,磁盘IO都会有问题,即超过单台服务器的性能瓶颈。此时有两种解决方案,垂直扩展和水平扩展(分片)。

      垂直扩展就是增加CPU,增加容量,但高性能系统的CPU和容量不成比例,这样扩展成本大,并且有上限。

      水平扩展分片,将数据分发到多个服务器,每个服务器是一个单独的数据库,各个服务器加起来组成一个逻辑数据库,把写压力和操作分流到不同服务器,提高容量和吞吐量。

MongoDB的文档是无模式的,不固定结构,因此只能进行水平分片。当块超过指定大小或者文档数超过最大文档数,MongoDB尝试分割这个块,若分割成功,把它标记为一个大块避免重复分割。拆分块的关键就是片键,片键是文档的一个属性字段或者一个复合索引字段,一旦建立不能改变。片键是分片拆分数据的关键,片键的选择直接影响集群的性能。

MongoDB首先根据片键划分块chunks当块超过指定大小(默认64M),然后把块分到其他的分片上。

注意:片键也是查询时常用的一个索引。因为片键的选择和创建索引时键的选择原则是相似的,实际使用中,通常片键就是创建索引使用的键!

>部署示例

Mongo集群分片部署实践(4.2版本)相关推荐

  1. MongoDB集群分片部署指南

    角色 服务器1 服务器2 服务器3 路由服务器Mongos 10.0.0.201:30000 10.0.0.202:30000 10.0.0.203:30000 配置服务器Mongod 10.0.0. ...

  2. ELK教程1:ElasticSearch集群的部署

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 在分布式系统中,应用数量众多,应用调用链复杂,常常使用ELK作为日志收集.分析和展示的组件.本 ...

  3. 搭建mongo集群,以及分片和副本

    (我这里是安装在3个节点上,分别为:node1,node2,node3) 1. 安装 mongodb到node1,2,3节点 https://blog.csdn.net/ZZPJackie/artic ...

  4. mysql 集群实践_MySQL Cluster集群探索与实践

    MySQL集群是一种在无共享架构(SNA,Share Nothing Architecture)系统里应用内存数据库集群的技术.这种无共享的架构可以使得系统使用低廉的硬件获取高的可扩展性. MySQL ...

  5. 2W 字详解 Redis 6.0 集群环境搭建实践

    原文链接:https://www.cnblogs.com/hueyxu/p/13884800.html 本文是Redis集群学习的实践总结(基于Redis 6.0+),详细介绍逐步搭建Redis集群环 ...

  6. 在Kubernetes集群上部署高可用Harbor镜像仓库

    这里主要介绍使用kubectl部署Harbor镜像仓库到Kubernetes集群中. 使用Helm部署,参考: https://my.oschina.net/u/2306127/blog/181969 ...

  7. Storm集群安装部署步骤【详细版】

    作者: 大圆那些事 | 文章可以转载,请以超链接形式标明文章原始出处和作者信息 网址: http://www.cnblogs.com/panfeng412/archive/2012/11/30/how ...

  8. 使用 xCAT 简化 AIX 集群的部署和管理

    使用 xCAT 简化 AIX 集群的部署和管理 基于 IBM® Power 520 Express® (8203-E4A) 的实践 本文主要介绍了 xCAT 软件的工作原理,并且通过在 IBM® Po ...

  9. 利用Docker/Ansible实现轻量集群服务部署(视频演示+彩蛋)

    周良伟 网易云信系统架构师 负责云信IM平台的架构设计和服务器研发团队 作者简介 今天和大家分享的主题是如何用Docker/Ansible来做轻量私有化的技术方案.首先,简单介绍一下所谓轻量私有化到底 ...

最新文章

  1. mybatis mapper配置 bigint_SpringBoot基础架构1(SpringBoot、MyBatis-Plus与Thymeleaf)
  2. Redis集群配置和常见异常解决
  3. 京东网络接入体系解密之高性能四层网关DLVS
  4. linux c编程头文件,如何在Linux中找到C编程语言的头文件?
  5. Atitit  数据存储的分组聚合 groupby的实现attilax总结
  6. 第二章:React 面向组件编程
  7. TCP/IP and Socket
  8. iOS系统突然故障卡死怎么办?快速解决不求人
  9. StylesheetLanguage--如何使用Less--前端样式语言
  10. java random 种子数_java中Random类带种子与不带的区别,详细解析
  11. 为什么材料专业要劝退?材料专业就找不到好工作吗?
  12. Juniper Open contrail 虚拟网络互通
  13. yyds,35岁自学编程,入职微软
  14. 基于ESP32的蓝牙鼠标键盘(一)BleKeyboard.h函数解析
  15. android+路由器+名称,路由器默认wifi名称是什么?
  16. CVTE笔试面试经验分享(硬件)—2020秋招
  17. 【产品体验】明星衣橱
  18. Gin框架源码解析【建议收藏】
  19. c++练习 日期的顺延显示
  20. 阮一峰ES6读书笔记

热门文章

  1. Go语言内部包--控制包成员的对外暴露
  2. docker搭建zookeeper集群
  3. RocketMQ单机版本安装(windows环境)
  4. Lombok注解使用详解
  5. 回炉Spring--事务及Spring源码
  6. 整理Java基础知识--NumberMath类
  7. linux下chkConfig的用法,mysqld开机自启动
  8. redis超时原因排查
  9. LNMP之NGINX篇
  10. 改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects)