title: MongoDB分片副本集生产环境部署(Windows版本)
date: 2022-10-29 17:21:11
tags:
- 运维

系统架构

配置环境

  1. 系统都是windows 10 专业版,使用VMWare安装作为实验环境
  2. MongoDB版本为6.0.2

架构图

部署架构:

访问流程:

架构说明

  1. Mongos是用户和集群之间的交互点,实际上mongos应该和客户端部署在同一台服务器上(重点!!,参考最后一节中的参考文章3)

  2. 集群的配置文件是部署在ConfigServer中的

  3. ShardServer是存储数据的节点,是一主一从一仲裁,主节点负责写,从节点负责读,仲裁节点只负责在主节点挂掉之后投票的,不会存储数据,因此整个分片复制集都是高可用状态

  4. ConfigServer是配置节点,为一主二从,节点数量必须为3个,否则一个挂掉之后会变成只读?(不确定,官网推荐的是必须是奇数)

  5. 以上配置属于最低配置,如果服务器有富余的话建议每一个主从节点都单独部署,从而达到最高吞吐量

  6. 以上部署了两个分片,每个分片都是一个副本集,且注意一个副本集内的节点不能有两个在同一个主机上,否则宕机的话会一起挂掉

部署流程

安装MongoDB

  1. mongodb下载地址:https://www.mongodb.com/try/download/community,选择zip压缩包
  2. mongosh下载:https://www.mongodb.com/try/download/shell,6.0之后不会自带mongoshell,因此需要自己下载对应的工具包然后解压缩到mongodb的bin目录下
  3. mongocompass:https://www.mongodb.com/try/download/compass,mongodb的gui连接工具,如果用的其它的工具也可以跳过这个

配置Shard1分片主节点

新建文件夹如下:

配置文件内容为:

dbpath=C:\mongodb\shard1\data
logpath=C:\mongodb\shard1\log\shard1.log
journal=true
port=20001
replSet=shard1
bind_ip=0.0.0.0 # 必须加,否则连不上

运行并安装成服务,以管理员运行如下命令:

mongod -config C:\mongodb\shard1\shard1_primary.conf --install –serviceName MongoDBShard1Primary -serviceDisplayName MongoDBShard1Primary

配置Shard2分片主节点

创建对应文件夹:

配置文件内容:

dbpath=C:\mongodb\shard2\data
logpath=C:\mongodb\shard2\log\shard2.log
journal=true
port=30001
replSet=shard2
bind_ip=0.0.0.0 # 必须加,否则连不上

管理员运行如下命令:

mongod -config C:\mongodb\shard2\shard2_primary.conf --install –serviceName MongoDBShard2Primary -serviceDisplayName MongoDBShard2Primary

配置ConfigServer主节点

新建文件夹如下:

配置文件内容如下:

dbpath=C:\mongodb\configserver\data
logpath=C:\mongodb\configserver\log\config.log
journal=true
port=40001
replSet=config-server
bind_ip=0.0.0.0 # 必须加,否则连不上
configsvr=true

管理员运行如下命令:

mongod -config C:\mongodb\configserver\config_primary.conf --install –serviceName MongoDBConfigPrimary -serviceDisplayName MongoDBConfigPrimary

设置完成之后到任务管理器把三个服务都启动,服务状态变成正在运行则说明一切正常:

这时候我们第一台服务器就配好了,mongos我们先暂时不配置,要等所有都配置完成了再弄

配置Shard1从节点

和配置Shard1的主节点一模一样,在主机2上新建好文件夹,配置文件也是一样的,运行如下命令安装从节点服务:

mongod -config C:\mongodb\shard1\shard1_secondary.conf --install –serviceName MongoDBShard1Secondary -serviceDisplayName MongoDBShard1Secondary

配置Shard2仲裁节点

和配置Shard2的主节点一模一样,在主机2上新建好文件夹,配置文件也是一样的,运行如下命令安装仲裁节点服务:

mongod -config C:\mongodb\shard2\shard2_arb.conf --install –serviceName MongoDBShard2Arb -serviceDisplayName MongoDBShard2Arb

配置ConfigServer从节点

和配置ConfigServer的主节点一模一样,在主机2上新建好文件夹,配置文件也是一样的,运行如下命令安装从节点服务:

mongod -config C:\mongodb\configserver\config_secondary.conf --install –serviceName MongoDBConfigSecondary -serviceDisplayName MongoDBConfigSecondary

以上3个配置完成之后,同样的在任务管理器内运行服务,下面是截图:

配置Shard1仲裁节点

和配置Shard1的主节点一模一样,在主机3上新建好文件夹,配置文件也是一样的,运行如下命令安装仲裁节点服务:

mongod -config C:\mongodb\shard1\shard1_arb.conf --install –serviceName MongoDBShard1Arb -serviceDisplayName MongoDBShard1Arb

配置Shard2从节点

和配置Shard2的主节点一模一样,在主机3上新建好文件夹,配置文件也是一样的,运行如下命令安装从节点服务:

mongod -config C:\mongodb\shard2\shard2_secondary.conf --install –serviceName MongoDBShard2Secondary -serviceDisplayName MongoDBShard2Secondary

配置ConfigServer从节点

和配置ConfigServer的主节点一模一样,在主机3上新建好文件夹,配置文件也是一样的,运行如下命令安装仲裁节点服务:

mongod -config C:\mongodb\configserver\config_arb.conf --install –serviceName MongoDBConfigArb -serviceDisplayName MongoDBConfigSecondary

同样的,主机3也全都配置好了,运行相应的服务:

配置副本集

这一步我们要把Shard1、Shard2、ConfigServer三个部分的副本集都配置好,首先在主机1上运行如下命令:

mongo -port 20001 # 进入shard1主节点
use admin #进入管理员数据库 config = {
_id : "shard1",
configsvr: false,
version: 1,
members : [
{ _id : 0 , host : "192.168.137.128:20001" },
{ _id : 1 , host : "192.168.137.134:20001" },
{ _id : 2 , host : "192.168.137.133:20001" , arbiterOnly : true},
]
} rs.initiate(config) # 初始化shard1集群 rs.status() #查看状态

shard1分片的副本集就配置好了,接着配置shard2副本集:

mongo -port 30001 # 进入shard1主节点
use admin #进入管理员数据库 config = {
_id : "shard2",
configsvr: false,
version: 1,
members : [
{ _id : 0 , host : "192.168.137.128:30001" },
{ _id : 1 , host : "192.168.137.134:30001", arbiterOnly : true },
{ _id : 2 , host : "192.168.137.133:30001" },
]
} rs.initiate(config) # 初始化shard1集群 rs.status() #查看状态

shard2副本集配置就好了,接着配置configserver:

mongo -port 40001 # 进入shard1主节点
use admin #进入管理员数据库 config = {
_id : "config-server",
configsvr: true,
version: 1,
members : [
{ _id : 0 , host : "192.168.137.128:40001" },
{ _id : 1 , host : "192.168.137.134:40001"},
{ _id : 2 , host : "192.168.137.133:40001"}
]
} rs.initiate(config) # 初始化shard1集群 rs.status() #查看状态

配置Mongos

新建C:\mongodb\mongos.conf配置文件,内容如下:

logpath=C:\mongodb\mongos\mongos.log
port=50001
bind_ip=0.0.0.0

直接在主机1上运行如下命令配置成服务:

mongos -configdb "config-server/192.168.137.128:40001,192.168.137.134:40001,192.168.137.133:40001" --config C:\mongodb\mongos.conf --install –serviceName MongoDBMongos -serviceDisplayName MongoDBMongos

之前没建的一些文件记得创建,否则启动不起来,记得在对应目录下建一下对应的日志文件

然后在任务管理器启动对应服务,运行成功之后就可以用MongoCompass连接测试了,地址为mongodb://192.168.137.128:50001/,连接之后截图如下:

到此成功,接下来客户端只需要连接这个mongos的地址就行了

登录账号密码验证

连接mongos,输入如下命令创建用户:

mongo -port 50001
use admin
db.createUser({user:'admin',pwd:'admin',roles:['clusterAdmin','dbAdminAnyDatabase','userAdminAnyDatabase','readWriteAnyDatabase']})
# 查看用户 在 admin库
db.system.users.find().pretty()

http://slproweb.com/products/Win32OpenSSL.html下载openssl工具,安装之后输入这个命令:

openssl rand -base64 756 > D:/key.file

生成一个keyfile,然后复制到每个主机的C:\mongodb\key.file路径,之后重新配置configserver、shard1、shard2的所有节点配置:

auth=true
keyFile=C:\mongodb\key.file

然后全部重启,新的连接字符串如下:

>mongo -port 50001 -u admin -p "admin"

如果用mongocompass连接方式如下:

mongodb://admin:admin@192.168.137.128:50001/?authMechanism=DEFAULT

连接成功截图

到这步就大功告成!如果后面需要添加任何分片节点,重复上面的步骤就可以了,每个分片需要配置一主一从一仲裁,仲裁节点其实可以放在一个监控服务器上,因为不需要存储数据

其他操作及问题

修改配置

mongo --port 20001 -u "admin" -p "admin"

# 获取配置
cfg = rs.conf() # 测试环境和生产环境这里不能配localhost,否则客户端访问不到
cfg.members[0].host = "你的IP 或者域名" # 重新加载配置
rs.reconfig(cfg)

新增或者删除新的节点

mongo --port 20001 -u "admin" -p "admin"
rs.add("IP:端口") # 普通节点
rs.addArb("IP:端口") # 仲裁节点
rs.remove("IP:端口") # 删除节点

mongo 控制台乱码

由于mongodb后台的字符编码都是utf-8的,而中文windows cmd窗口使用的字符编码是GBK(属性-》选项-》当前代码页),所以当在cmd中使用mongo命令查询数据并显示后,中文会变成乱码。

使用下述方式修改cmd窗口的编码为utf8如下,再次查询时中文会显示正常,但是仍然不能执行中文的插入操作,可以使用MongoVUE工具执行中文的插入操作:

  1. chcp 65001

  2. 选择“属性”中的字体,除“点阵字体”外所有的都行

来自文章:https://blog.51cto.com/u_15127509/4595971

未完成的部分

  1. 虽然设置了分片集群,但是每个集合和数据库都还不是分片的,需要自己手动连接mongos设置,这里就不继续加了,很简单
  2. 分片状态下怎么备份?怎么还原?这一条是大问题,后面有空了解了再写一篇新博客

参考文章

  1. https://www.freesion.com/article/98231067515/
  2. https://www.cnblogs.com/young978/p/15721098.html
  3. https://dba.stackexchange.com/questions/188164/how-to-make-mongos-to-be-in-a-replica-set
  4. 分片认证

MongoDB分片副本集生产环境部署-Windows版本的更多相关文章

  1. Mongodb分片副本集集群搭建

    一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...

  2. [原创]在Docker上部署mongodb分片副本集群。

    一.安装docker. 请参考:http://www.cnblogs.com/hehexiaoxia/p/6150584.html 二.编写dockerfile. 1.在根目录下创建mongod的do ...

  3. MongoDB 分片副本集集群搭建

    配置准备 三台机器: A(193.168.10.101) B(193.168.10.102) C(193.168.10.103) MongoDB 安装目录:/usr/local/mongodb Mon ...

  4. Mongo分片+副本集集群搭建

    一. 概念简单描述 1. MongoDB分片集群包含组件: mongos,configserver,shardding分片 2. Mongos:路由服务是Sharded cluster的访问入口,本身 ...

  5. Mongodb副本集+分片集群环境部署记录

    前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...

  6. Mongodb副本集+分片集群环境部署

    前面详细介绍了mongodb的副本集和分片的原理,这里就不赘述了.下面记录Mongodb副本集+分片集群环境部署过程: MongoDB Sharding Cluster,需要三种角色: Shard S ...

  7. MongoDB集群部署 - 带访问控制的分片副本集

    1. 前言 Ceilometer将meter.event等数据保存在MongoDB中,之前将MongoDB部署在控制节点上,使用三副本模式,时间长了发现meter数据爆炸式增长,区区2T的磁盘捉襟见肘 ...

  8. MongoDB在单机上搭建分片副本集群(windows)

    ------------------------------1.安装MongoDB...... ------------------------------2.准备好文件夹 --config:配置文件 ...

  9. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  10. mongodb 3.6 集群搭建:分片+副本集

    mongodb是最常用的nosql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

随机推荐

  1. python渗透测试入门——基础的网络编程工具

    <Python黑帽子--黑客与渗透测试编程之道学习>这本书是我在学习安全的过程中发现的在我看来十分优秀的一本书,业内也拥有很高的评价,所以在这里将自己的学习内容分享出来. 1.基础的网络编 ...

  2. 题解 P2080 增进感情

    \(\sf Link\) 爆搜最香了. 感觉有点像01背包(? 对于每件事,我们可以选择干或者不干,如果干就将好感值处理一下,当所有的事都搜完之后,记录最小值\(minn\) . 最终答案就是\(mi ...

  3. Aspose.Cell和NPOI生成Excel文件

    1.使用Aspose.Cell生成Excel文件,Aspose.Cell是.NET组件控件,不依赖COM组件 1首先一点需要使用新建好的空Excel文件做模板,否则容易产生一个多出的警告Sheet 1 ...

  4. 论文笔记 - GRAD-MATCH: A Gradient Matching Based Data Subset Selection For Efficient Learning

    Analysis Coreset 是带有权重的数据子集,目的是在某个方面模拟完整数据的表现(例如损失函数的梯度,既可以是在训练数据上的损失,也可以是在验证数据上的损失): 给出优化目标的定义: $w^ ...

  5. CSS布局秘籍(2)-6脉神剑

    HTML系列: 人人都懂的HTML基础知识-HTML教程(1) HTML元素大全(1) HTML元素大全(2)-表单 CSS系列: CSS基础知识筑基 常用CSS样式属性 CSS选择器大全48式 CS ...

  6. WinDBG详解进程初始化dll是如何加载的

    一:背景 1.讲故事 有朋友咨询个问题,他每次在调试 WinDbg 的时候,进程初始化断点之前都会有一些 dll 加载到进程中,比如下面这样: Microsoft (R) Windows Debugg ...

  7. Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构

    在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...

  8. Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)

    软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...

  9. 原来 GitHub 不仅能学代码,还有这些东西

    我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 大家好,我是风筝. 今天介绍几 ...

  10. php中的try语句

    为了进一步处理异常,我们需要使用try-catch语句----包括Try语句和至少一个的catch语句.任何调用 可能抛出异常的方法的代码都应该使用try语句.Catch语句用来处理可能抛出的异常.以 ...