`
豉汁凤爪
  • 浏览: 5343 次
文章分类
社区版块
存档分类
最新评论

MongoDB集群构建

阅读更多

最近做的项目,拿出来分享交流。

六台主机

hostname分别为wens012~017

IP:10.50.9.12~10.50.9.17

下面为部署方案

 

六个server,每个server上跑四个进程。

进程一共分三类:

shard server:启动守护进程mongod加上参数shardsvr即可。当然还有一些其他的配置。

config server:启动守护进程mongod加上参数configsvr即可。

route server:启动路由进程mongos。

部署方案中shard与rep都是shard server进程,每3个组成一个复制集,复制集中如果某个进程down掉了,会有另外一个进程成为主节点。

例如:shard11,rep12,rep13为一个复制集。

 

进程端口分配:

 

主机

ip

进程端口

Server1

10.50.9.12

Mongod shard11 : 27017

Mongod rep32  : 27018

Mongod rep33  : 27019

Mongod conf1  : 20000

Server2

10.50.9.13

Mongod shard21 : 27017

Mongod rep12  : 27018

Mongod rep13  : 27019

Mongos       : 30000

Server3

10.50.9.14

Mongod shard31 : 27017

Mongod rep22  : 27018

Mongod rep23  : 27019

Mongod conf2  : 20000

Server4

10.50.9.15

Mongod shard41 : 27017

Mongod rep62  : 27018

Mongod rep63  : 27019

Mongos       : 30000

Server5

10.50.9.16

Mongod shard51 : 27017

Mongod rep42  : 27018

Mongod rep43  : 27019

Mongod conf3  : 20000

Server6

10.50.9.17

Mongod shard61 : 27017

Mongod rep52  : 27018

Mongod rep53  : 27019

Mongds       : 30000

 

 

 

文件目录:

我的是下载压缩文件解压出来的mongodb,放在/erpfs/mongoDB/ 中。

加压出来后mongodb的所有执行文件都放在/erpfs/mongoDB/bin/ 中。

创建文件夹/erpfs/mongoDB/data/ 用于存放数据文件

每个server按照所需运行的mongod进程建数据目录。

例如:

server1:

mkdir -p /erpfs/mongoDB/data/shard11

mkdir -p /erpfs/mongoDB/data/rep32

mkdir -p /erpfs/mongoDB/data/rep33

mkdir -p /erpfs/mongoDB/data/config1

server2:

 

mkdir -p /erpfs/mongoDB/data/shard21

mkdir -p /erpfs/mongoDB/data/rep12

mkdir -p /erpfs/mongoDB/data/rep13

route server不需要数据目录

 

 


该项目还有一个需求,在server1只需执行一个启动脚本则整个集群都启动完毕,并且所有分片都加到集群中。

为了达到目的,我使用ssh。但是这样执行启动脚本之后,每当连接到另外一台server的时候都需要输入root密码,非常繁琐,需要有自动完成登录的功能。我们可以利用公钥和私钥来完成。

在server1中执行:ssh-keygen -t rsa

按回车,提示输入文件名,我用id_rsa_wens012命名

随后提示使用的加密方式,直接按回车两次,使用默认的即可。

这样会生成私钥和公钥文件id_rsa_wens12id_rsa_wens12.pub

将私钥和公钥文件都放到/root/.ssh/中

id_rsa_wens12.pub放到server2~6的/root/.ssh/中,并且重命名为authorized_keys(如果这个文件已存在,则id_rsa_wens12.pub的内容加到文件末尾

这部分可以在写完所有脚本之后再补上,不过能在一开始就完成也很好。


然后开始写配置文件

还是以sever1为例:

conf文件有四个,每个进程一个。

#shard11.conf

 

shardsvr = true

replSet = shard1

dbpath = /erpfs/mongoDB/data/shard11

logpath = /erpfs/mongoDB/data/shard11.log

logappend = true

fork = true

port = 27017

journal = true

smallfiles = true

 

#rep32.conf

 

shardsvr = true

replSet = shard3

dbpath = /erpfs/mongoDB/data/rep32

logpath = /erpfs/mongoDB/data/rep32.log

logappend = true

fork = true

port = 27018

journal = true

smallfiles = true

 

#rep33.conf

 

shardsvr = true

replSet = shard3

dbpath = /erpfs/mongoDB/data/rep33

logpath = /erpfs/mongoDB/data/rep33.log

logappend = true

fork = true

port = 27019

journal = true

smallfiles = true

 

#config1.conf

 

configsvr = true

dbpath = /erpfs/mongoDB/data/config1

logpath = /erpfs/mongoDB/data/config1.log

logappend = true

fork = true

port = 20000

journal = true

smallfiles = true

 

其他server类似配置,改改名字就差不多。

server2中的mongos配置文件

#mongos

 

configdb = 10.50.9.12:20000,10.50.9.14:20000,10.50.9.16:20000

 

logpath = /erpfs/mongoDB/data/mongos.log

logappend = true

fork = true

port = 30000

chunkSize = 100

 

 

然后是启动脚本文件

先写好每个server的启动脚本

在每个server中都有一个serverX_start.sh(X表示1~6),用来启动该机器上的进程。

server2、4、6还有一个serverX_start_mongos.sh脚本,因为route server需要等到所有config server启动了之后才能启动。因为找不到config server 的话route server就不知道从哪里读取集群配置了。

以server1为例:

#server1_start.sh

 

#!/bin/bash

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/config1.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/shard11.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep32.conf

/erpfs/mongoDB/bin/mongod -f /erpfs/mongoDB/rep33.conf

 

选项-f(或--config)代表执行配置文件内容。

server2中用mongos的启动脚本,其实就是一句。

#server2_start_mongos.sh

 

#!/bin/bash

/erpfs/mongoDB/bin/mongos -f /erpfs/mongoDB/mongos.conf

 

 

 

 

 

 

进程都启动之后,route server已经跟config server连接上,但是所有的shard server都还是处于游离状态。我们要将他们加入到集群中,在加入集群之前还有一件事情,就是初始化复制集

 

任意一台server上使用bin目录下的mongo连接到某一复制集的其中一个shard server上。

例如:/erpfs/mongoDB/bin/mongo 10.50.9.12:27017

就连接上了shard11了

执行初始化复制集代码

 

  1. cfg={_id:'shard1',members:[{_id:1,host:'10.50.9.12:27017'},{_id:2,host:'10.50.9.13:27018'},{_id:3,host:'10.50.9.13:27019'}]}; 
  2. rs.initiate(cfg); 

 

 

看到 'OK':1字样则初始化成功。

然后exit退出。

接着重复上述步骤初始化复制集shard2~6

 

 

 

初始化复制集完成之后就是将每个复制集加入到集群当中。

使用bin目录下的mongo连接到任意一个route server,进入admin数据库(命令:use admin)

然后执行下列代码增加分片的复制集

  1. db.runCommand({addshard:'shard1/10.50.9.12:27017,10.50.9.13:27018,10.50.9.13:27019'}); 
  2. db.runCommand({addshard:'shard2/10.50.9.13:27017,10.50.9.14:27018,10.50.9.14:27019'}); 
  3. db.runCommand({addshard:'shard3/10.50.9.14:27017,10.50.9.12:27018,10.50.9.12:27019'}); 
  4. db.runCommand({addshard:'shard4/10.50.9.15:27017,10.50.9.16:27018,10.50.9.16:27019'}); 
  5. db.runCommand({addshard:'shard5/10.50.9.16:27017,10.50.9.17:27018,10.50.9.17:27019'}); 
  6. db.runCommand({addshard:'shard6/10.50.9.17:27017,10.50.9.15:27018,10.50.9.15:27019'}); 

执行命令db.runCommand({enablesharding:'test'})

这样test数据库就可以分片了,MongodDB默认连接上的是test数据库。

如果想要使数据库中的某个集合可以分片存储,例如test集合,可以使用db.runCommand({shardcollection:'test.test',key:{_id:1}})

key是片键,是分片的依据,这里使用_id字段作为片键。

所谓片键,例如某个片键的值的范围是a~z,则可能某一分片存储a~h,某一分片存储i~n,某一分片存储o~z。

 

为了不用每次启动MongoDB的时候都人为执行上述初始化复制集和加入分片的操作,可以将上述命令写成js脚本,MongoDB可以执行js脚本。

只要启动bin目录下的mongo时加入参数

mongo [ip][:port] [*.js]

 

然后将所有执行js脚本的命令写入shell脚本

  1. #!/bin/bash 
  2. /erpfs/mongoDB/bin/mongo 10.50.9.12:27017 /erpfs/mongoDB/shard1Initiate.js 
  3. /erpfs/mongoDB/bin/mongo 10.50.9.13:27017 /erpfs/mongoDB/shard1Initiate.js 
  4. /erpfs/mongoDB/bin/mongo 10.50.9.14:27017 /erpfs/mongoDB/shard1Initiate.js 
  5. /erpfs/mongoDB/bin/mongo 10.50.9.15:27017 /erpfs/mongoDB/shard1Initiate.js 
  6. /erpfs/mongoDB/bin/mongo 10.50.9.16:27017 /erpfs/mongoDB/shard1Initiate.js 
  7. /erpfs/mongoDB/bin/mongo 10.50.9.17:27017 /erpfs/mongoDB/shard1Initiate.js 
  8.  
  9. /erpfs/mongoDB/bin/mongo 10.50.9.13:30000/admin /erpfs/mongoDB/addshards.js 

这样只要一执行启动脚本,就自动完成启动server进程,初始化复制集,加入分片的操作。

 

 

停止MongoDB

要停止MongoDB的方法有几种,只要MongoDB接受到结束信号就会迅速停止。

可以使用 kill -2来停止MongoDB

记住,如果使用kill -9的话MongoDB会马上停止,一些停止前的操作尚未执行就停止了,这样下次启动的时候MongDB就会查询日志,进行修复,启动时间就会变得很慢。

当然,这是在使用了journal参数设为true的情况下,才会有恢复操作,如果没有将journal设置为true,就麻烦了。

还有一点,journal在64位的机器上是默认为true的,在32位的机器上默认为false的。

 

言归正传,要停止MongoDB可以就是将正在运行的mongo进程号找出来然后kill -2掉。

  1. #!/bin/bash 
  2.  
  3. pid=`ps -o pid,command ax | grep mongo | awk '!/grep/ && !/awk/ {print $1}'`; 
  4. if [ "${pid}" != "" ]; then 
  5.     kill -2 ${pid}; 
  6. fi 

以上作为serverX_stop.sh脚本放在每个server上,写一个stop.sh脚本,通过ssh执行每个server上的serverX_stop.sh脚本即可。

 

 

  • 大小: 40.8 KB
分享到:
评论

相关推荐

    mongo-docker, 基于 Docker的即时MongoDB集群环境.zip

    mongo-docker, 基于 Docker的即时MongoDB集群环境 即时MongoDB分片...Dockerfile和 Bootstrap 脚本提供了使用Virtualbox软件管理程序构建的虚拟机来创建MongoDB集群。 在安装完成后,在本地机器上运行的单个虚拟机上共

    基于Spring Boot 2.0的MongoDB集群网页管理工具源码 - WeAdmin版

    项目名称:WeAdmin版MongoDB集群网页管理工具(基于Spring Boot 2.0) 技术栈:主要采用Java语言,辅以JavaScript、CSS和HTML。 文件构成:总计158个文件,包括: - GIF动画:75个,用于界面交互提示和演示。 - ...

    MongoDB集群部署文档.docx

    MongoDB集群部署文档,这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统。 要构建一个 MongoDB Sharding Cluster

    深入探索MongoDB集群模式:从高可用复制集到动态扩容实战

    本文详细介绍了MongoDB的集群模式,包括复制集的构建和管理,分片机制的原理及其应用。重点阐述了如何通过复制集实现MongoDB的高可用性,包括数据的复制、读写分离、异地容灾等关键技术。同时,文章深入分析了分片...

    详解MongoDB4.0构建分布式分片群集

    MongoDB分片简述 高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘 IO 上。 MongoDB 分片是...

    2021MongoDB中文社区杭州大会干货分享版.zip

    MongoDB中文社区-技术大会开场; MongoDB 典型用例分享及新特性介绍-唐峰;...万亿级MongoDB集群内核优化-李鑫; MongoDB-全球领先的现代通用数据库平台; Tapdata - 基于MongoDB的多源异构数据实时同步产品;

    深入学习MongoDB

    前一部分“MongoDB扩展技术”指导大家创建一个不断增长以满足应用程序需求的MongoDB集群,内容简明扼要,指导用户设置和使用集群存储大量数据并高效访问数据。此外,读者还可了解如何让应用程序兼容分布式数据库系统...

    Spring Boot中增强对MongoDB的配置

    Spring Boot中增强对MongoDB的配置(连接池等)主要重写了MongoDbFactory的构建来完成,整体实现的过程还是比较复杂的。本文就来具体说说如何更简单的来实现对MongoDB的更多配置定制。

    MongoDB的分片集群基本配置教程

    要构建一个 MongoDB Sharding Cluster,需要三种角色: 1.Shard Server 即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replication Set。为了实现每个Shard内部的auto-...

    MongoDB权威指南 中文版第一版

    执行基本的写入操作,构建各种复杂的查询,任何条件下都能查出数据。使用索引、聚合工具,以及其他高级查询技巧。了解监控、安全和认证、备份和修复等内容。建立主从集群和自动故障恢复复制。利用分片水平扩展...

    shrinkifi:使用Node,MongoDB,Express和Vanilla JS,HTML和CSS构建的开源URL缩写

    创建一个MongoDB集群。 这是一个视频教程 创建一个名为url_data的新数据库并创建一个名为urls的集合 复制您的NodeJS连接URI / URL并记下来 在项目的根目录中创建一个.env文件 还要记下您的域名(如果您使用的是...

    ecommerce:使用MongoDB,Hadoop大数据和Spring技术开发电子商务应用程序

    分片的MongoDB集群为产品目录数据,产品库存数据和其他应用程序数据提供存储。 应用程序域模型基于MongoDB POJO类构建。 建立了一个包含100000多种产品的示例数据库,以支持E-Commerce应用程序。 Hadoop大数据技术...

    spark-mongodb-examples:在Spark中使用NSMC(spark-mongodb-connector)的示例

    您可以通过IntelliJ Idea IDE或通过sbt命令行工具来构建项目,但是您将需要使用sbt来运行assembly命令,以便可以将示例提交到Spark集群。 提交到Spark集群 这些示例并非旨在“在本地”运行:您需要将生成的程序集...

    phonebook-web-app::telephone:使用React,Express和MongoDB构建的电话簿Web应用

    电话簿应用程序-全页电话簿网络应用程序,用户可以在其中创建,更新,删除和过滤联系人。... 在创建集群和数据库用户。 然后,连接您的应用程序,并将MONGODB_URI中的.env的值设置为连接字符串。 在已配置的phoneb

    ANM:Angular +节点+ MongoDB

    MongoDB集群实践 ... 涉及主要技术和工具: 后面括号中为响应技术技术或工具选择时对比参考过的。 Client: Angular: 1.3 (backbone/ext) Bootstrap: 3.3 (Foundation/YUI) jQuery: 2.1 (prototype/YUI) lodash: 3 ...

    java8看不到源码-springboot-kubernetes:在kubernetes集群上部署带有MongoDB后端的SpringBoot

    构建会在build/libs文件夹中创建一个 spring boot fat jar springboot-kubernetes-0.0.1-SNAPSHOT 。 该应用程序可以使用build/libs文件夹中的java -jar springboot-kubernetes-0.0.1-SNAPSHOT.jar运行,但我们希望...

    Spark机器学习视频第2课.Spark2集群安装

    课时2:Spark2集群安装 课时3:Spark RDD操作 课时4:SparkRDD原理剖析 课时5:Spark2sql从mysql中导入 课时6:Spark1.6.2sql与mysql数据交互 课时7:SparkSQL java操作mysql数据 课时8:Spark统计用户的收藏转换...

    tfs:基于mongodb的分布式文件系统

    tfs之所以叫tfs,是因为...完全非阻塞基于async并发执行代码,并且对图片加了imagemagick组件,可以实现动态缩放通过Mongodb集群很容易实现分布式存储,同时grid file 自动对大体积文件进行切分所以读取也是分布式读取

    todolist-v2:with MongoDB的待办事项列表应用程序的更新版本

    使用MongoDB构建的简单待办事项列表应用程序的更新版本 :laptop_computer: 样本 :hammer_and_wrench_selector: 技术领域 :gear_selector: 要求 :rocket: 安装 $ git clone ...

Global site tag (gtag.js) - Google Analytics