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

六台主机

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_wens12和id_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. /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. pid=`ps -o pid,command ax | grep mongo | awk '!/grep/ && !/awk/ {print $1}'`;
  3. if [ "${pid}" != "" ]; then
  4. kill -2 ${pid};
  5. fi

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

转载于:https://blog.51cto.com/dbazengli/1118820

MongoDB集群构建相关推荐

  1. mongodb 集群shard_mongodb集群构建方案(二)

    0.创建网段 docker network create mongo 1.编写yaml文件,,这里我命名fates-mongo-compose.yaml 以下这个文件,建立3个mongo shard服 ...

  2. mongodb java连接 集群_java连接mongodb集群

    MongoDb 的分片拓展与副本集 Mongodb 数据库分片是通过并行处理数据实现负载均衡的一种重要手段[12],同时也是数据库集群 实现分布式计算的关键技术.在生产环境中,...... 本地数据访 ...

  3. mongodb集群与分片的配置说明

    mongodb集群与分片的配置说明 Shardingcluster介绍: 这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统. 系统分为需要三种角 ...

  4. 高可用的MongoDB集群

    高可用的MongoDB集群 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l  面向集合的存储:适合存储对象及JSON ...

  5. mongodb集群 java_Mongodb集群操作的JAVA代码详解

    本次测试是通过java代码直接连接Mongodb集群,执行增删改查操作来完成对集群的测试. jar准备 由于mongodb复制集的版本为3.4.3,需要我们到mongodb官网去下载对应的java驱动 ...

  6. java 探花交友项目day5 推荐好友列表 MongoDB集群 发布动态,查询动态 圈子功能

    推荐好友列表 需求分析 推荐好友:分页形式查询推荐的用户列表,根据评分排序显示 代码实现: tanhuaController: /**  * 查询分页推荐好友列表  */ @GetMapping(&q ...

  7. Dobbo微服务项目实战(详细介绍+案例源码) - 5.推荐好友列表/MongoDB集群/动态发布与查看

    You are a wizard, Harry! 系列文章目录 1. 项目介绍及环境配置 2. 短信验证码登录 3. 用户信息 4. MongoDB 5.推荐好友列表/MongoDB集群/动态发布与查 ...

  8. k8s使用StatefulSet部署MongoDB集群

    1.1 前提准备 制作MongoDB 镜像,可从 Docker Hub 官网 下载镜像,目的是解决提示权限mongo-sidecar提示权限错误问题(官方镜像基础上添加了密码认证) 生成 keyfil ...

  9. mysql mongodb 集群_MongoDB 集群

    MongoDB 集群中包含一个自动分片模块 (mongos). 自动分片可以用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器.自动建立一个水平扩展的数据库集群系统,将数据库分表存 ...

最新文章

  1. 为什么UI线程中创建Handler可以不传Looper?
  2. Angular CLI 使用教程指南参考
  3. ActiveMQ消息队列的使用及应用
  4. 汇编学习--7.17--键盘输入和磁盘读写
  5. php颜色淡入代码,JavaScript_jquery 淡入淡出效果的简单实现,样式:复制代码 代码如下:nbsp - phpStudy...
  6. web 前端面试题50道
  7. 穿越熊市?用 Python 自制指数估值图
  8. latex公式符号大全
  9. el-amap的使用
  10. php warning: file_get_contents,解决PHP Warning: file_get_contents failed to open stream
  11. 适合旅游时住的各地旅馆 超级便宜,绝对实用,谢谢分享!有好东西大家共享!
  12. java 对象数据 搜索,Java数据对象JDO 2.0查询语言的特点
  13. CAD2014学习笔记-常用绘图命令和工具
  14. (OpenCV)图像目标尺寸检测
  15. kd树 python实现_Python - KDTree 实现
  16. 【Warshall算法】
  17. 可恶的RunDll广告怎么关闭
  18. Androd高清平板应用推荐之挖财2.0
  19. react----元素的在窗口范围内的拖动(react-rnd)
  20. 基于条件LayerNorm的多任务文本分类模型

热门文章

  1. 欧盟网络安全局发布《供应链攻击威胁全景图》报告(中)
  2. 立即更新!SonicWall 公司再次发布SMA 100 0day 固件更新
  3. 谁在指使这家印度 IT 公司攻击全球政治家、投资者和记者?
  4. SaltStack Salt 开源管理框架修复2个严重漏洞,多款开源产品等受影响
  5. atomic、锁、多线程
  6. 《FPGA全程进阶---实战演练》第十一章 VGA五彩缤纷
  7. 实战百度竞价恶意点击心得
  8. Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
  9. GridView的RowCommand事件中取得行索引 技巧
  10. Freebsd上使用pf防火墙