设为首页 收藏本站
查看: 1290|回复: 0

[经验分享] MongoDB 3.4 分片 由副本集组成

[复制链接]

尚未签到

发表于 2017-12-15 22:33:23 | 显示全部楼层 |阅读模式
  要在真实环境中实现MongoDB分片至少需要四台服务器做分片集群服务器,其中包含两个Shard分片副本集(每个包含两个副本节点及一个仲裁节点)、一个配置副本集(三个副本节点,配置不需要仲裁节点),其中Shard的副本节点必须拥有单独的服务器,通常一个Shard副本集由3个以上副本节点组成更好,奇数个副本节点不需要额外配置仲裁节点。因为仲裁节点和配置节点不需要耗费很多的资源,可以与其他进程共享一台服务器。
DSC0000.png

  当然了,对于平时学习而言,配置那么多服务器是不现实的,用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
DSC0001.png DSC0002.png DSC0003.png

  其中Shard节点和Config节点和开启普通MongoDB数据库一样,用Mongod启动,在Windows下不能使用 fork参数后台化,个人更推荐使用Service来托管
  其中Shard节点的配置如下,每个文件夹下对应的配置把dbpath/logpath/replSet(shard-a和shard-b)改掉,因为要开启多个db所以httpinterface设置为false,不开启监听,否则每个db都会对应多一个端口号+1000的监听端口,37002的监听端口为38002
  

dbpath=D:\mongodatas\shard-a2\data  
logpath=D:\mongodatas\shard-a2\log\mongod.log
  
logappend=true
  
directoryperdb=true
  
rest=true
  
httpinterface=false
  
port=37002
  
shardsvr=true
  
replSet=shard-a
  

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

dbpath=D:\mongodatas\config1\data  
logpath=D:\mongodatas\config1\log\mongod.log
  
logappend=true
  
directoryperdb=true
  
rest=true
  
port=41001
  
configsvr=true
  
replSet=configset
  

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

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

  使用命令  services.msc打开服务窗口查看服务是否开启或者使用 netstat -nao指令查端口是否开启,如果全都正常开启,则开始配置Shard副本集
  任意连接shard-a中服务器 (37001/37002/37003)打开MongoDB Shell
  

mongo --port 37001  

DSC0004.png

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

rs.initiate()  

DSC0005.png

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

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

DSC0006.png

  最好使用本机的内网地址,而不是使用localhost或者127.0.0.1
  接下来查看副本集是否运行正常
  

rs.status()  

DSC0007.png

  退出现有MongoDB Shell或者开启新的CMD进入Shard-b中任意服务器对Shard-b副本集进行初始化,进入Config副本集任意服务器对Config副本集进行初始化,注意Config副本集进行初始化的时候不需要指定仲裁节点
  以上所有操作,对Config副本集进行初始化非常重要,网上有很多示例都没有对Config副本集进行初始化,会导致mongos服务无法开启,连接不上router服务器
  现在开始配置router的配置mongos.cfg
  

configdb=configset/DESKTOP-4NVUAKK:41001,192.168.20.229:41002,192.168.20.229:41003  
logpath=D:\mongodatas\router\log\mongod.log
  
logappend=true
  
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的端口并未打开
DSC0008.png

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

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

  注意上面的执行程序是mongos而不是mongod 配置文件名不要弄错了
  正常启动Router服务器之后,连接到router数据库的MongoDB Shell
  

mongo --port 50000  

DSC0009.png

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

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

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

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

  正常情况下添加成功如下
DSC00012.png

  查看数据库config中的shards集合
  

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

DSC00013.png

DSC00014.png

  到现在为止,分片环境已经搭建成功,但要引用到数据库和文档上,还需要对数据库和文档进行分片
  开启一个数据库上的分片,这是对任何集合进行分片的先决条件
  

sh.enableSharding("dbName")   

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

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

DSC00015.png

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

sh.shardCollection("dbName.collectionName",{key1:1,key2:1})  

  
db.getSiblingDB("config").collections.find()
  

DSC00016.png

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

  用客户端连接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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424524-1-1.html 上篇帖子: MongoDB 3.2.8 副本集搭建 下篇帖子: MongoDB - 在Windows上安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表