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就荧光寿命光谱和显微技术的最新研究和应用进行了深入的交流与探讨。此次访问不仅加强了两家公司在高科技领域的合作关系,…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
