mongodb-7.0.14分片副本集超详细部署
mongodb介绍:
是最常用的nosql数据库,在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群。
环境准备
系统系统 BC 21.10
三台服务器:192.168.123.247/248/249
安装包:
mongodb-linux-x86_64-rhel8-7.0.14.tgz (截止2024年10月11日星期五次新版)
mongosh-2.3.1-linux-x64.tgz
服务器规划
| 服务器247 | 服务器248 | 服务器249 |
|---|---|---|
| mongos | mongos | mongos |
| config server | config server | config server |
| shard1 | 主节点 shard1 副节点 | shard1 仲裁 |
| shard2 | 仲裁 shard2 主节点 | shard2 副节点 |
| shard3 | 副节点 shard3 仲裁 | shard3 主节点 |
端口规划
| 主机名 | IP | 组件mongos | 组件config server | 分片shard |
|---|---|---|---|---|
| server1 | 192.168.123.247 | 端口:27000 | 端口:27017 | shard1:27001 |
| server2 | 192.168.123.248 | 端口:27000 | 端口:27017 | shard2:27002 |
| server3 | 192.168.123.249 | 端口:27000 | 端口:27017 | shard3:27003 |
时间同步
略
防火墙
略
集群部署
解压mongodb
官网下载,根据操作系统选择下载相应的版本。
Mongodb-download
在三台机器上执行解压
tar zxvf mongodb-linux-x86_64-rhel8-7.0.14.tgz -C /usr/local/mongodb
新建目录
三台机器建立config、mongos、shard1、shard2、shard3目录,包括子目录
mkdir -p /usr/local/mongodb/config/{conf,data,log,run}
mkdir -p /usr/local/mongodb/mongos/{conf,data,log,run}
mkdir -p /usr/local/mongodb/shard{1,2,3}/{conf,data,log}
目录结构概述
/usr/local/mongodb/config:
用途:存放配置服务器的相关文件。
子目录:
conf:存放配置服务器的配置文件(如 mongod.conf)。
data:存放配置服务器的数据文件。
log:存放配置服务器的日志文件。
run: 存储进程PID文件
/usr/local/mongodb/mongos:
用途:存放路由进程(Mongos)的相关文件。
子目录:
conf:存放路由进程的配置文件。
data:因为 Mongos 不持久化数据。(也可以不创建)
log:存放路由进程的日志文件。
run: 存储进程PID文件
/usr/local/mongodb/shard{1,2,3}:
用途:存放分片服务器的相关文件。
子目录:
conf:存放分片服务器的配置文件。
data:存放分片服务器的数据文件。
log:存放分片服务器的日志文件。
配置环境变量
vim /etc/profile
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
使立即生效
source /etc/profile
安装依赖包,缺少就安装
yum install libcurl openssl xz-libs
创建用户,指定组标识符
groupadd mongo -g 777
useradd mongo -g 777 -M -s /sbin/nologin
id mongo
开机启动
cat > /etc/systemd/system/mongodb.service << EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target[Service]
Type=simple
ExecStart=/usr/local/mongodb/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf --shutdown
PrivateTmp=true[Install]
WantedBy=multi-user.target
EOF
三台config server配置:
cat > /usr/local/mongodb/config/conf/mongod.conf << EOF
# 日志设置
systemLog:destination: file # 日志写入文件path: /usr/local/mongodb/config/log/mongod.log # 日志文件路径logAppend: true # 追加日志logRotate: rename # 日志轮转方式,支持 rename 或 reopen# 网络设置
net:port: 27017 # MongoDB 默认端口bindIp: 0.0.0.0 # 允许从所有 IP 访问,生产环境建议限制# 数据目录
storage:dbPath: /usr/local/mongodb/config/data # 数据文件存放路径wiredTiger:engineConfig:cacheSizeGB: 1 # 根据情况配置内存# 进程设置
processManagement:fork: true # 以后台进程方式运行pidFilePath: /usr/local/mongodb/config/run/mongod.pid # PID 文件路径#复制集名称
replication:replSetName: "myconfigset"#作为配置服务
sharding:clusterRole: configsvrEOF
三台mongos配置
cat > /usr/local/mongodb/config/conf/mongod.conf << EOF# 日志设置
systemLog:destination: file # 日志写入文件path: /usr/local/mongodb/mongos/log/mongos.log # 日志文件路径logAppend: true # 追加日志logRotate: rename # 日志轮转方式,支持 rename 或 reopen# 网络设置
net:port: 27000 # MongoDB 默认端口bindIp: 0.0.0.0 # 允许从所有 IP 访问,生产环境建议限制# 进程设置
processManagement:fork: true # 以后台进程方式运行pidFilePath: /usr/local/mongodb/mongos/run/mongos.pid # PID 文件路径#网络延迟阈值
replication:localPingThresholdMs: 15#关联配置服务
sharding:configDB: myconfigset/server1:27017,server2:27017,server3:27017EOF
启动三台config server (3台)
mongod --config /usr/local/mongodb/config/conf/mongod.conf
安装mongosh
安装好mongosh工具,方便初始化副本集使用,
# mongosh mongodb://server1:27017。成功登录如下图:默认的提示符是’test>’

大内存页 关闭 hugepage
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
初始化配置副本集(3台机器执行相同操作)
启动config server后,开始初始化副本集,登录任意一台开始初始化配置副本集
#7.0.14版本登录时在test>数据库下,切换到admin数据库
test> use admin
switched to db admin
admin>#执行以下config变量,注意myconfigset,要和mongod.conf里配置一致。
config={_id:"myconfigset",members:[
{_id:0,host:"server1:27017"},
{_id:1,host:"server2:27017"},
{_id:2,host:"server3:27017",},
]}
执行结果如下:

#再执行初始化
rs.initiate(config)

rs.status()





3.9 配置分片副本集
每台shard1,shard2,shard3配置
Shard1
cat > /usr/local/mongodb/shard1/conf/shard1.conf << EOF
# 日志设置
systemLog:destination: file # 日志写入文件path: /usr/local/mongodb/shard1/log/shard1.log # 日志文件路径logAppend: true # 追加日志logRotate: rename # 日志轮转方式,支持 rename 或 reopen# 网络设置
net:port: 27001 # MongoDB shard1端口bindIp: 0.0.0.0 # 允许从所有 IP 访问,生产环境建议限制# 数据目录
storage:dbPath: /usr/local/mongodb/shard1/data # 数据文件存放路径wiredTiger:engineConfig:cacheSizeGB: 1 # 根据情况配置内存# 进程设置
processManagement:fork: true # 以后台进程方式运行pidFilePath: /usr/local/mongodb/shard1/data/shard1.pid # PID 文件路径#复制集名称
replication:replSetName: "shard1"#慢查询
operationProfiling:slowOpThresholdMs : 100mode: "slowOp"#作为分片服务
sharding:clusterRole: shardsvrEOF
Shard2
cat > /usr/local/mongodb/shard2/conf/shard2.conf << EOF# 日志设置
systemLog:destination: file # 日志写入文件path: /usr/local/mongodb/shard2/log/shard2.log # 日志文件路径logAppend: true # 追加日志logRotate: rename # 日志轮转方式,支持 rename 或 reopen# 网络设置
net:port: 27002 # shard2端口bindIp: 0.0.0.0 # 允许从所有 IP 访问,生产环境建议限制# 数据目录
storage:dbPath: /usr/local/mongodb/shard2/data # 数据文件存放路径wiredTiger:engineConfig:cacheSizeGB: 1 # 根据情况配置内存# 进程设置
processManagement:fork: true # 以后台进程方式运行pidFilePath: /usr/local/mongodb/shard2/data/shard2.pid # PID 文件路径#复制集名称
replication:replSetName: "shard2"#慢查询
operationProfiling:slowOpThresholdMs : 100mode: "slowOp"#作为分片服务
sharding:clusterRole: shardsvrEOF
Shard3
cat > /usr/local/mongodb/shard3/conf/shard3.conf << EOF# 日志设置
systemLog:destination: file # 日志写入文件path: /usr/local/mongodb/shard3/log/shard3.log # 日志文件路径logAppend: true # 追加日志logRotate: rename # 日志轮转方式,支持 rename 或 reopen# 网络设置
net:port: 27003 # MongoDB shard3 默认端口bindIp: 0.0.0.0 # 允许从所有 IP 访问,生产环境建议限制# 数据目录
storage:dbPath: /usr/local/mongodb/shard3/data # 数据文件存放路径wiredTiger:engineConfig:cacheSizeGB: 1 # 根据情况配置内存# 进程设置
processManagement:fork: true # 以后台进程方式运行pidFilePath: /usr/local/mongodb/shard3/data/shard3.pid # PID 文件路径#复制集名称
replication:replSetName: "shard3"#慢查询
operationProfiling:slowOpThresholdMs : 100mode: "slowOp"#作为分片服务
sharding:clusterRole: shardsvrEOF
启动三台247,248,249服务器的shard1 server
mongod --config /usr/local/mongodb/shard1/conf/shard1.conf

初始化shard1分片副本集
登录任意一台,注意端口号
mongosh mongodb://server1:27001
初始化三台的shard1
#7.0.14版本登录时在test>数据库下,切换到admin数据库
test> use admin
switched to db admin
admin>
config={_id:“shard1”,members:[
{_id:0,host:“server1:27001”},
{_id:1,host:“server2:27001”},
{_id:2,host:“server3:27001”,arbiterOnly: true},
]}

#再执行初始化
rs.initiate(config)

rs.status()





启动三台247,248,249服务器的shard2 server
mongod --config /usr/local/mongodb/shard2/conf/shard2.conf
登录任意一个节点,注意端口号,注意安装了mongosh
mongosh mongodb://server2:27002
初始化三台的shard2
#7.0.14版本登录时在test>数据库下,切换到admin数据库
test> use admin
switched to db admin
admin>config={_id:"shard2",members:[
{_id:0,host:"server1:27002",arbiterOnly: true},
{_id:1,host:"server2:27002"},
{_id:2,host:"server3:27002"},
]}#再执行初始化
rs.initiate(config)
rs.status()





3.12.1 初始化三台的shard3
#7.0.14版本登录时在test>数据库下,切换到admin数据库
test> use admin;
switched to db admin
admin>config={_id:"shard3",members:[
{_id:0,host:"server1:27003"},
{_id:1,host:"server2:27003",arbiterOnly: true},
{_id:2,host:"server3:27003"},
]}#再执行初始化
rs.initiate(config)
rs.status()





启动mongos路由并分片
启动三台247,248,249服务器的mongos
mongos --config /usr/local/mongodb/mongos/conf/mongos.conf

登录任意路由节点,注意端口号,注意安装了mongosh
mongosh mongodb://server1:27000
添加分片
#7.0.14版本登录时在test>数据库下,切换到admin数据库
test> use admin
switched to db admin
admin>db.adminCommand({ "setDefaultRWConcern" : 1, "defaultWriteConcern" : { "w" : 1 }})
admin>##添加分片
sh.addShard("shard1/server1:27001,server2:27001,server3:27001")
sh.addShard("shard2/server1:27002,server2:27002,server3:27002")
sh.addShard("shard3/server1:27003,server2:27003,server3:27003")
#
Admin> sh.status();

验证分片机制
指定分片生效:
db.runCommand({enablesharding:"testdb"})
哈希分片
db.runCommand({shardcollection:"testdb.table1",key:{id:"hashed"}})
插入1万个数据,测试
for (var i = 1; i <= 10000; i++){
db.table1.insertOne({id:i,"test1":"testval1"});

Shard1

Shard2

Shard3

汇总内容

验证已完成,可以看到数据分到3个分片,各自分片数量为:
shard1 “count” : 3366,
shard2 “count” : 3284,
shard3 “count” : 3350。
已经成功!
相关文章:
mongodb-7.0.14分片副本集超详细部署
mongodb介绍: 是最常用的nosql数据库,在数据库排名中已经上升到了前六。这篇文章介绍如何搭建高可用的mongodb(分片副本)集群。 环境准备 系统系统 BC 21.10 三台服务器:192.168.123.247/248/249 安装包:…...
C++运算出现整型溢出
考虑如下代码: int aINT_MAX; int b 1; long c ab; 这段代码没有编过! 原因是a和b都是int型,相加之后会溢出。 请记住,c语言没有赋值,只有表达式,右侧会存在一个暂存的int保存ab的值,而明…...
LeetCode岛屿数量
题目描述 给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网…...
Karmada核心概念
以下内容为翻译,原文地址 Karmada 是什么? | karmada 一、Karmada核心概念 一)什么是Karmada 1、Karmada:开放,多云,多集群Kubernetes业务流程 Karmada (Kubernetes Armada)是一个Kubernetes管理系统&…...
Rust 与生成式 AI:从语言选择到开发工具的演进
在现代软件开发领域,Rust 语言正在逐步崭露头角,尤其是在高性能和可靠性要求较高的应用场景。与此同时,生成式 AI 的崛起正在重新塑造开发者的工作方式,从代码生成到智能调试,生成式 AI 的应用正成为提升开发效率和质量…...
Python爬虫高效数据爬取方法
大家好!今天我们来聊聊Python爬虫中那些既简洁又高效的数据爬取方法。作为一名爬虫工程师,我们总是希望用最少的代码完成最多的工作。下面我ll分享一些在使用requests库进行网络爬虫时常用且高效的函数和方法。 1. requests.get() - 简单而强大 requests.get()是我们最常用的…...
C语言之扫雷小游戏(完整代码版)
说起扫雷游戏,这应该是很多人童年的回忆吧,中小学电脑课最常玩的必有扫雷游戏,那么大家知道它是如何开发出来的吗,扫雷游戏背后的原理是什么呢?今天就让我们一探究竟! 扫雷游戏介绍 如下图,简…...
Spring WebFlux 响应式概述(1)
1、响应式编程概述 1.1、响应式编程介绍 1.1.1、为什么需要响应式 传统的命令式编程在面对当前的需求时的一些限制。在应用负载较高时,要求应用需要有更高的可用性,并提供低的延迟时间。 1、Thread per Request 模型 比如使用Servlet开发的单体应用&a…...
Unity游戏通用框架——事件的订阅和发布(观察者模式)
在游戏开发的基本思想中,逻辑与表现的分离极为重要,相互之间并不关心具体实现,只注册对应的事件,有事件发生时才调用相应的函数 事件管理器 using System.Collections; using System.Collections.Generic;public class event_ma…...
将 Ubuntu 系统中的 **swap** 空间从 2GB 扩展到 16GB
要将 Ubuntu 系统中的 swap 空间从 2GB 扩展到 16GB,可以按照以下步骤操作: 1. 关闭现有 Swap 文件 首先需要禁用当前的 swap 文件,以便重新调整其大小。 sudo swapoff -a2. 删除旧的 Swap 文件 假设当前的 swap 文件位于 /swapfile&…...
流程图 LogicFlow
流程图 LogicFlow 官方文档:https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …...
Mac通过键盘选取内容
问题: 我们在使用键盘的时候经常懒得动手去拿鼠标了,并且熟练使用键盘可以提高我们的工作效率,比如在我们需要复制内容的时候,可以仅仅通过键盘来选取想要的内容; 解决: 将鼠标光标移动到想要选取的内容…...
如何通过OpenCV实现图像融合拼接?
图像拼接的意义 2024年了,谈论图像拼接,不算新事物,我们这里探讨图像拼接,主要探讨图像拼接的意义、难点和大概的实现思路。图像拼接可以突破设备视野限制,通过拼接低分辨率图像获得高分辨率图像。 扩展视野ÿ…...
Qt5.14.2 安装详细教程(图文版)
Qt 是一个跨平台的 C 应用程序开发框架,主要用于开发图形用户界面(GUI)程序,但也支持非 GUI 程序的开发。Qt 提供了丰富的功能库和工具,使开发者能够在不同平台上编写、编译和运行应用程序,而无需修改代码。…...
深圳市步步精科技有限公司荣获发明专利,彰显技术研发实力
2024年8月13日,深圳市步步精科技有限公司(BBJconn)正式获得了其新开发的防水连接器专利,授权公告号为CN 118352837 B。这项技术的突破标志着公司在连接器领域的持续创新,进一步巩固了其行业领先地位。 专利技术概述 此…...
std::function的概念和使用方法
一、概念 std::function是 C 标准库中的一个模板类,定义在<functional>头文件中。它是一种通用的多态函数包装器,其实例能够对任何可调用对象进行存储、复制和调用操作,这些可调用对象包括普通函数、函数指针、成员函数指针、函数对象…...
OpenAI的Swarm是一个实验性质的多智能体编排框架
先上文档,然后解释,然后是代码 OpenAI的Swarm是一个实验性质的多智能体编排框架,旨在简化多智能体系统的构建、编排和部署。以下是对Swarm的详细介绍: 一、核心概念和特点 智能体(Agent): Swar…...
简易STL实现 | Map 的实现
提供了键值对的存储机制,处理 具有唯一键的关联数据 1、特性 键值对存储:std::map 通过键值对的形式 存储数据,其中每个键 都是唯一的,并且 与一个值相关联 自动排序:std::map 内部 使用一种平衡二叉搜索树…...
`concurrent.futures` 是 Python 标准库中的一个模块
先来看文档 concurrent.futures 是 Python 标准库中的一个模块,它提供了一个高级接口来异步执行代码,使用线程或进程池来并行运行任务。这个模块提供了两种主要的池类型:ThreadPoolExecutor 和 ProcessPoolExecutor,以及一个通用的…...
PicoQuant GmbH公司Dr. Christian Oelsner到访东隆科技
昨日,德国PicoQuant公司的光谱和显微应用和市场专家Dr.Christian Oelsner莅临武汉东隆科技有限公司。会议上Dr. Christian Oelsner就荧光寿命光谱和显微技术的最新研究和应用进行了深入的交流与探讨。此次访问不仅加强了两家公司在高科技领域的合作关系,…...
ESXi 8.0U3i在部署过程中出现技嘉(GIGABYTE)Z390 I AORUS PRO WIFI主板+万兆intel x520-da2 sr2 82599ES万兆网卡不识别处理方法
你遇到的问题核心是:ESXi 8.0U3i 原生 / 通用集成镜像缺少对技嘉 Z390 I AORUS PRO WIFI 板载网卡、Intel X520-DA2(82599ES)万兆网卡及部分 NVMe/USB 控制器的完整驱动支持。解决思路是:先排查 BIOS → 再用定制镜像(下载现成或自己封装)→ 最后验证驱动…...
给硬件工程师的PCIe协议栈拆解:从FPGA IP核视角看三层协议如何协同工作
给硬件工程师的PCIe协议栈拆解:从FPGA IP核视角看三层协议如何协同工作 当你在Xilinx UltraScale或Intel Stratix 10 FPGA中集成PCIe硬核IP时,是否曾好奇过那个配置向导里勾选的"Enable Advanced Mode"究竟在底层做了什么?物理层的…...
从零开始:crAPI靶场环境搭建与实战通关指南
1. 环境准备:从零搭建crAPI靶场 第一次接触crAPI靶场时,我花了两小时才搞明白为什么docker-compose总是报错。后来发现是因为Ubuntu系统残留的旧版Docker没卸载干净。建议所有新手都从干净的Ubuntu 20.04 LTS环境开始,这会帮你避开80%的环境问…...
Visual C++运行时组件故障解决完全指南:从问题定位到能力提升
Visual C运行时组件故障解决完全指南:从问题定位到能力提升 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行时组件(Microsof…...
PyTorch模型参数与元数据安全存储:safetensors实战解析
1. 为什么需要safetensors存储模型参数? 在深度学习项目中,模型参数的保存和加载是最基础也最频繁的操作。传统PyTorch开发者习惯使用torch.save和torch.load这对黄金组合,直到某天我在分布式训练集群上遇到了一个诡异的问题:一个…...
Redmine API实战指南:从数据同步到工作流自动化
Redmine API实战指南:从数据同步到工作流自动化 【免费下载链接】redmine Mirror of redmine code source - Official Subversion repository is at https://svn.redmine.org/redmine - contact: vividtone or maeda (at) farend (dot) jp 项目地址: https://gitc…...
【开题答辩全过程】以 校园超市购物系统为例,包含答辩的问题和答案
个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...
蓝芯算力:RISC-V 芯片破局之路
字节跳动前高管卢山创办的蓝芯算力完成数亿元融资,专注 RISC-V AI 算力芯片研发。目前已获超 20 万片订单,在 x86 和 ARM 主导的市场中开辟差异化道路。创始人背景与创业初衷蓝芯算力创始人卢山毕业于清华,有超 20 年芯片设计经验。他曾就职英…...
Loop:重新定义macOS窗口管理的艺术与科学
Loop:重新定义macOS窗口管理的艺术与科学 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在数字工作空间中,窗口管理不再是简单的排列组合,而是一种提升专注力与创造力的空间艺术。Loop…...
3步搞定AtlasOS系统技术故障:Xbox控制器驱动完全解决方案
3步搞定AtlasOS系统技术故障:Xbox控制器驱动完全解决方案 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/at…...
