Mongodb集群搭建一篇就够了

Stella981
• 阅读 517

本文主要介绍mongodb集群的搭建安装过程,对于学习mongodb的同学很有帮助,包括分片模式、复制集模式、是否启用认证等,本文选取mongodb-3.6.3版本为例进行详细安装说明,其他版本搭建过程和本过程一样,只需按照本文说明操作即可。

  1. Mongodb分片集群架构

Mongodb集群搭建一篇就够了

如上图所示,整个mongodb分片集群由lvs、mongos、mongo-config集群、mongodb复制集组成,其对应的功能如下:

Mongos: 提供路由功能

Mongo-config集群:配置服务器相当于集群的大脑,保存在集群和路由分片的元数据,包括集群有哪些分片、分片的是哪些集合、以及数据块的分布。

Mongodb复制集:用于多个mongod实例之间的数据复制,维护mongod集群的稳定性,实现故障转移,故障切换,故障恢复。

有了该架构,可以很方便的实现增加可用RAM、增加可用磁盘空间、减轻单台服务器的负载、处理单个mongod集群无法承受的吞吐量。

以下按照mongod复制集、mongo-config集群、mongos代理的顺序进行安装介绍。其地址信息分别如下:

mongos节点: 127.0.0.1:9000,127.0.0.1:9000

mongo-cfg集群节点: 127.0.0.1:8000,127.0.0.1:8001,127.0.0.1:8002

mongod复制集分片1: 127.0.0.1: 27017,127.0.0.1: 27018,127.0.0.1: 27019

mongod复制集分片2: 127.0.0.1: 27027,127.0.0.1: 27028,127.0.0.1: 27029

2. 分片集群(不带认证)安装构建过程****

2.1下载mongodb安装包****

https://www.mongodb.org/dl/linux/x86_64-rhel62 https://www.mongodb.org/dl/linux/x86_64-rhel70下载对应的mongodb二进制安装包,然后解压到安装目录,例如本文指定安装目录为/usr/local/,如下图所示:

Mongodb集群搭建一篇就够了

安装完成后,检查mongo二进制文件是否可以正常运行,如果能正常运行,则会有相应提示,如下:

Mongodb集群搭建一篇就够了

2.2 mongod分片复制集安装过程

2.2.1 不带认证分片集群搭建过程****

2.2.1.1创建mongo分片复制集节点相关目录

假设数据库信息存放到/home/mongodb目录,则根据下面步骤创建相关的子目录,同时修改配置文件。

cd /home/mongodb

mkdir  taxi_business   //代表这个集群是什么业务

cd taxi_business

mkdir  shardcluster1   //mongo赋值集分片1的数据全部存放在这里面,如果有多个分片,则这里还会创建shardcluster2,shardcluster-n,根据自己实际需要创建

cd  shardcluster1

mkdir node1 node2 node3  //该复制集分片有3个节点,相关数据分布存入到node1、node2、node3节点中

cd node1

mkdir  data  etc  keys  logs  //创建node1节点的相关配置、数据、日志、key目录

cd node2

mkdir  data  etc  keys  logs

cd node3

mkdir  data  etc  keys  logs

Mongodb集群搭建一篇就够了

*2.2.*1.2 修改配置*mongod*文件****

processManagement:

fork: true

systemLog:

destination: file

# 指定mongod服务日志文件目录,如果node2则把node1改为node2,类推

path: /home/mongodb/taxi_business/shardcluster1/node1/logs/mongodb.log

logAppend: true

storage:

journal:

enabled: true

指定数据存放的路径,如果node2则把node1改为node2,类推

dbPath: /home/mongodb/taxi_business/shardcluster1/node1/logs/data/

directoryPerDB: true

engine: wiredTiger  #选择存储引擎

wiredTiger:

engineConfig:

cacheSizeGB: 20  #指定存储引擎的cache大小

directoryForIndexes: true

collectionConfig:

blockCompressor: snappy

indexConfig:

prefixCompression: true

net:

port: 27028          #设置mongod监听端口

maxIncomingConnections: 10000 #设置最大连接数

bindIpAll: true

operationProfiling:

slowOpThresholdMs: 100  #设置慢日志时间

mode: slowOp

sharding:       #是否支持分片,本集群需要支持分片,因此需要加上配置

clusterRole: shardsvr

archiveMovedChunks: true

replication:

oplogSizeMB: 10240

replSetName: featdoc_1  #表示这是featdoc集群的第一个分片,该复制集中的所有node节点这个名字要一样,如果是第二个复制集,这里可以取名featdoc_2

#不带认证需要屏蔽一下配置

#security:

#   keyFile: /home/mongodb/taxi_business/shardcluster1/node1/keys/keyfile

#   clusterAuthMode: keyFile

#   authorization: enabled

注意:把该配置文件拷贝到所有mongod集群的etc配置文件中,并根据实际情况修改端口和路径****

2.2.1.3 启动mongod服务

  1. 根据前面的配置启动mongod服务

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node1/etc/mongodb.cnf –fork

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node2/etc/mongodb.cnf –fork

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node3/etc/mongodb.cnf –fork

注意: mongodb服务端使用numactl --interleave=all 可以成倍的提高导入速度

*2.2.1.4 构建node1 node2 node3*同一个复制集

/usr/local/mongodb-3.6.3/bin/mongo  --port 27017

config = {_id : "featdoc_1",   members : [{_id : 0, host : "127.0.0.1:27017" },{_id : 1, host : "127.0.0.1:27018" },{_id : 2, host : "127.0.0.1:27019"}]}

rs.initiate(config)

Mongodb集群搭建一篇就够了

Rs.initiate(config)执行后会进行主从选举,选举成功后可以通过rs.status()查看复制集集群状态

rs.status()

Mongodb集群搭建一篇就够了

然后,通过rs.status()查看集群状态,可以看到27017节点被选举为主节点,该复制集1集群搭建完成。

如果要搭建其他分片复制集2,过程类似,以此内推。

2.2.2 mongo-cfg集群搭建****

*2.2.2.1 创建mongo-cfg集群相关*节点目录

cd /home/mongodb/taxi_business

mkdir mongocfg_cluster

mkdir node1  node2  node3

cd node1

mkdir data  etc  keys  logs

cd ../node2

mkdir data  etc  keys  logs

cd ../node3

mkdir data  etc  keys  logs

Mongodb集群搭建一篇就够了

*2.2.2.2 添加mongo-cfg配置文件*

以node1为例,在etc目录下面创建mongocfg.cnf配置文件内容如下:

processManagement:

fork: true

systemLog:

destination: file

#日志路径,node2 node3节点需要把node1改为node2或者node3

path: /home/mongodb/taxi_business/mongocfg_cluster/node1/logs/mongodb.log

logAppend: true

storage:

journal:

enabled: true

#数据路径,node2 node3节点需要把node1改为node2或者node3

dbPath: /home/mongodb/taxi_business/mongocfg_cluster/node1/data/

directoryPerDB: true

engine: wiredTiger

wiredTiger:

engineConfig:

cacheSizeGB: 20

directoryForIndexes: true

collectionConfig:

blockCompressor: snappy

indexConfig:

prefixCompression: true

net:

port: 8000  #监听的端口

maxIncomingConnections: 10000

bindIpAll: true

operationProfiling:

slowOpThresholdMs: 100

mode: slowOp

sharding:

clusterRole: configsvr #这里是重点,表示该mongod进程是提供mongo-cfg服务

archiveMovedChunks: true

replication:

oplogSizeMB: 10240

replSetName: featdoc  #需要和mongos configDB配置中的名字一致

#不认证集群需要屏蔽以下配置

#security:

#key路径,node2 node3节点需要把node1改为node2或者node3

#   keyFile: /home/mongodb/taxi_business/mongocfg_cluster/node1/keys/keyfile

#   clusterAuthMode: keyFile

#   authorization: enabled

说明:

  1. mongo-cfg集群和mongod复制集都是由mongod进程提供服务,他们的配置文件几乎完全一致,唯一的区别是clusterRole角色不一样,复制集配置中角色为shardsvr(表示分片),mongo-cfg集群角色为configsvr
  2. mongo-cfg配置中的replSetName名称必须和mongos configDB配置名称一样
  3. 同理,node2和node3中的etc下面的配置文件修改过程类似
  4. Mongo-cfg目录etc下面的配置文件最好取名为mongocfg.cnf,这样可以很方便的从进程名就能知道是mongo分片集群还是mongo-cfg集群

注意:把该配置文件拷贝到所有mongo-config集群node节点etc配置文件中,并根据实际情况修改端口和路径****

******2.**2.2.3 启动mongo-cfg服务

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node1/etc/mongodb.cnf --fork

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node2/etc/mongodb.cnf --fork

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node3/etc/mongodb.cnf –fork

Mongodb集群搭建一篇就够了

2.2.2.4 构建不带认证的mongo-cfg集群

登录任何一个cfg节点,构建集群:

config = {_id : "featdoc",   members : [{_id : 0, host : "127.0.0.1:8000" },{_id : 1, host : "127.0.0.1:8001" },{_id : 2, host : "127.0.0.1:8002"}]}

rs.initiate(config)

Mongodb集群搭建一篇就够了

Mongodb集群搭建一篇就够了

*2.2.3 mongos不带*认证代理搭建****

*2.2.3.1 创建mongos相关的*目录****

cd /home/mongodb/taxi_business

mkdir mongos

cd mongos

mkdir mongos_1 mongos_2

cd mongos_1

mkdir etc  keys  logs

cd mongos_2

mkdir etc  keys  logs

cd /home/mongodb/taxi_business/mongos/mongos_1/etc

在该目录创建mongos.cnf

*2.2.3.2 添加mongos配置文件*

#不带认证需要屏蔽这两行配置

#security:

#   keyFile: /home/mongodb/taxi_business/mongos/mongos_1/keys/keyfile

systemLog:

destination: file

logAppend: true

path: /home/mongodb/taxi_business/mongos/mongos_1/logs/mongos.log

processManagement:

fork: true

pidFilePath: /home/mongodb/taxi_business/mongos/mongos_1/mongos.pid

net:

port: 9000   #端口

maxIncomingConnections: 20000

sharding:

这里的的featdoc必须和mongs configDB配置名称一致

# 这里的三个地址为mongo-cfg集群的地址

configDB: featdoc/127.0.0.1:8000,127.0.0.1:8001,127.0.0.1:8002

2.2.3.3 启动mongos服务

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongos -f /home/mongodb/taxi_business/mongos/mongos_1/etc/mongos.cnf

2.2.3.4 mongos代理添加分片信息****

sh.addShard("featdoc_1/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019")

*2.2.3 mongos不带*认证代理搭建****

*2.2.3.1 创建mongos相关的*目录****

cd /home/mongodb/taxi_business

mkdir mongos

cd mongos

mkdir mongos_1 mongos_2

cd mongos_1

mkdir etc  keys  logs

cd mongos_2

mkdir etc  keys  logs

cd /home/mongodb/taxi_business/mongos/mongos_1/etc

在该目录创建mongos.cnf

*2.2.3.2 添加mongos配置文件*

#不带认证需要屏蔽这两行配置

#security:

#   keyFile: /home/mongodb/taxi_business/mongos/mongos_1/keys/keyfile

systemLog:

destination: file

logAppend: true

path: /home/mongodb/taxi_business/mongos/mongos_1/logs/mongos.log

processManagement:

fork: true

pidFilePath: /home/mongodb/taxi_business/mongos/mongos_1/mongos.pid

net:

port: 9000   #端口

maxIncomingConnections: 20000

sharding:

这里的的featdoc必须和mongs configDB配置名称一致

# 这里的三个地址为mongo-cfg集群的地址

configDB: featdoc/127.0.0.1:8000,127.0.0.1:8001,127.0.0.1:8002

2.2.3.3 启动mongos服务

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongos -f /home/mongodb/taxi_business/mongos/mongos_1/etc/mongos.cnf

2.2.3.4 mongos代理添加分片信息****

sh.addShard("featdoc_1/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019")

Mongodb集群搭建一篇就够了

注意: featdoc_1必须和该分片对应的复制集的replSetName名字一致

如果要再搭建一个mongos,搭建步骤****类似

3. 分片集群(带认证)安装构建过程****

接前面的第2章节,带认证分片集群搭建过程,首先需要搭建好不带认证分片集群(mongos+mongo-cfg集群+mongo复制集集群),参考前面。

然后为mongos和mongod集群添加账号信息,添加成功后退出服务,然后修改配置加上认证配置,重新启动服务即可,注意退出服务顺序为:

  1. stop mongos
  2. stop mongod
  3. Stop mongo-cfg

重启服务的启动顺序为:

  1. start mongo-cfg
  2. start mongod
  3. start mongos

3.1 为不带认证的mongo复制集和mongos添加账号****

  1. 登录mongo复制集集群主节点,为mongo复制集集群添加账号

/home/yyz/mongodb-test/bin/mongo 127.0.0.1:27017

use admin

db.createUser({user: "root", pwd: "123456", roles: [{role: "root", db: "admin"}]});

db.createUser( { user: "admin", pwd: "123456", roles: [{role: "userAdminAnyDatabase", db: "admin"}]});

2. 为mongos代理添加账号

/home/yyz/mongodb-test/bin/mongo 127.0.0.1:9000

use admin

db.createUser({user: "root", pwd: "123456", roles: [{role: "root", db: "admin"}]});

db.createUser( { user: "admin", pwd: "123456", roles: [{role: "userAdminAnyDatabase", db: "admin"}]});

Mongodb集群搭建一篇就够了

3.2 shutdown关闭mongos、mongod集群、mongo-cfg

依次登录mongos、mongod节点、mongo-cfg节点,然后执行:
use admin

db.shutdownServer()

Mongodb集群搭建一篇就够了

3.3 生成key文件,并拷贝到所有node节点的keys目录****

1. 生成key文件,并修改权限

openssl rand -base64 666 > keyfile

chmod 600 keyfile

2.拷贝keyfile到mongos、mongod集群节点、mongo-cfg集群节点的相应目录中

cp keyfile keys

cp keyfile ../node2/keys/

cp keyfile ../node3/keys/

Mongodb集群搭建一篇就够了

3.4 修改配置文件,在mongodmongo-cfg配置文件中,使能认证配置****

1. mongo-cfg和mongod集群配置中,把以下配置加上

security:

#key路径,node2 node3节点需要把node1改为node2或者node3

keyFile: /home/mongodb/taxi_business/mongocfg_cluster/node1/keys/keyfile

clusterAuthMode: keyFile

authorization: enabled

2. 在mongos配置文件中,把以下配置加上:

security:

keyFile: /home/mongodb/taxi_business/mongos/mongos_1/keys/keyfile

3.4 依次重启mongo-cfg集群、mongo复制集集群、mongos代理****

1. 启动mong-cfg集群实例

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/mongocfg_cluster/node1/etc/mongocfg.cnf

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/mongocfg_cluster/node2/etc/mongocfg.cnf

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/mongocfg_cluster/node3/etc/mongocfg.cnf

2.启动mongo复制集集群实例

numactl --interleave=all  /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node1/etc/mongodb.cnf

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node2/etc/mongodb.cnf

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongod -f /home/mongodb/taxi_business/shardcluster1/node3/etc/mongodb.cnf

3.启动mongos代理实例

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongos -f /home/mongodb/taxi_business/mongos/mongos_1/etc/mongos.cnf

numactl --interleave=all /usr/local/mongodb-3.6.3/bin/mongos -f /home/mongodb/taxi_business/mongos/mongos_2/etc/mongos.cnf

3.5带认证分片集群测试

通过上面的步骤整个分片集群已经安装完毕,进行简单测试:

Mongodb集群搭建一篇就够了

插入后查找,查找成功,说明带认证分片集群搭建完成

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
MongoDb分片集群认证
本文主要基于已经搭建好的未认证集群,结合上篇Mongodb副本集分片集群模式环境部署(https://www.cnblogs.com/woxingwoxue/p/9875878.html),MongoDb分片集群认证几个主要流程1.在分片集群环境中,副本集内成员之间需要用keyFile认证,mongos与配置服务器,副本集之间也要keyFi
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这