Mongo数据库集群搭建

目录

1、Mongo集群优势

1.1 高可用性

1.2 水平扩展性

1.3 高性能

1.4 灵活的架构设计

1.5 数据安全

1.6 管理与监控

2、下载指定操作系统版本包

3、部署和验证工作

3.1 准备配置文件及依赖

3.2 启动第一个节点

3.3 部署更多的节点

3.4 初始化副本集

3.5 设置管理员账户和密码

3.6 验证集群功能

4、常见问题


MongoDB因为使用比较方便,在研发或测试团队用的比较普遍,有时候可能因为成本和预算等原因,短期无法在云上买集群资源,只能在物理机器上部署,考虑一般机器部署的服务和使用的同学都比较多,单节点故障容错率较低,因此一般建议是部署集群模式,否则一台机器故障,可能导致服务不可用或数据丢失。下文简单介绍了Mongo集群优势、部署方法、常见问题。

1、Mongo集群优势

1.1 高可用性

  • 复制集实现故障转移:MongoDB 通过复制集(Replica Set)提供了高可用性。复制集包含一个主节点(Primary)和多个从节点(Secondary),当主节点发生故障时,从节点可以自动提升为主节点,确保服务不中断。
  • 读写分离:可以配置从节点处理读请求,降低主节点的负载,提高整体可用性。

1.2 水平扩展性

  • 分片(Sharding)支持大规模数据集
    • MongoDB 的分片功能允许将数据分布在多个服务器上,以便处理更大的数据集。
    • 分片支持自动均衡,确保各分片数据量和访问负载保持均衡。
  • 无单点瓶颈:通过增加节点,集群可以无限制扩展存储和计算能力,适合高增长的业务场景。

1.3 高性能

  • 并行处理:多个节点可以同时处理请求,利用分片和复制集的架构,支持更高的吞吐量。
  • 内存优先:MongoDB 使用内存映射机制,对于频繁访问的数据,性能优势明显。
  • 灵活的分片键:合理选择分片键可以优化查询性能,减少节点间的网络流量。

1.4 灵活的架构设计

  • 动态模式:MongoDB 以文档为中心的存储方式,不需要预定义模式(Schema),可以快速响应业务需求的变化。
  • 弹性伸缩:支持在运行时扩展和收缩集群,无需停机。
  • 地理分布:通过分片键设计和配置,可以根据地理位置分布数据,提高本地访问速度。

1.5 数据安全

  • 数据冗余:复制集通过多副本存储,提供数据冗余,防止单点故障导致数据丢失。
  • 数据一致性:通过写入确认机制(Write Concern),可以实现不同级别的数据一致性。

1.6 管理与监控

  • 自动化管理:MongoDB 提供工具如 MongoDB AtlasOps Manager,帮助快速部署和管理集群。
  • 实时监控:支持实时监控查询性能、节点状态和集群活动,便于发现和解决问题。

2、下载指定操作系统版本包

下载地址:MongoDB Atlas Database | Multi-Cloud Database Service | MongoDB,如下图所示,按需下载即可。

3、部署和验证工作

3.1 准备配置文件及依赖

以解压后bin文件夹所在的目录为根目录,建议使用配置文件方式启动。为了让目录结构更清晰,可以手动新建一些目录和文件:./logs日志文件夹、数据文件夹./data/db、配置文件./conf/config.yaml

除了基本的配置,那集群之间各节点的如何通信的呢?这个就涉及到keyFile文件的生成。

在MongoDB集群中,使用keyFile进行鉴权是一种常见的方法,它确保只有持有相同keyFile的节点能够相互通信和验证身份

假设我们的文件名为key_file,可以执行如下命令生成keyFile,目录根据实际需要指定就行。

openssl rand -base64 756 > key_file

设置keyFile权限:

  • 出于安全考虑,keyFile必须对MongoDB用户可读,并且其他用户不可读。你可以使用chmod命令将keyFile的权限设置为600(或400,但600更常见,因为它允许文件所有者读写文件,但不允许其他用户访问)。
  • 未设置时./logs/mongod.log日志可能会报错:"msg":"Error creating service context","attr":{"error":"Location5579201: Unable to acquire security key[s]"}}
chmod 600 /path/to/your/key_file

最后完整的./conf/config.yaml文件内容示例如下,注意将/path/to/your/dir改为你自己的地址。

systemLog:destination: filepath: /path/to/your/dir/logs/mongod.loglogAppend: true
storage:dbPath: /path/to/your/dir/data/dbwiredTiger:         # 最大缓存大小为50G,可选设置engineConfig:cacheSizeGB: 50.0 
net:bindIp: 0.0.0.0port: 8017
replication: # 副本集名称replSetName: mongoClusterTest
processManagement:fork: true
security: authorization: enabledkeyFile: /path/to/your/dir/data/key_file # 各节点相互通信和验证身份

3.2 启动第一个节点

./bin/mongod --fork -f ./conf/config.yaml

预期成功会输出:

% ./bin/mongod --fork -f ./conf/config.yaml
about to fork child process, waiting until server is ready for connections.
forked process: 84352
child process started successfully, parent exiting

此时我们已经成功启动了一个节点。

3.3 部署更多的节点

部署第二个、第三个或更多的节点方法和第一个节点类似,注意版本和配置文件保持一样即可。注意给key_file加权限。

chmod 600 /path/to/your/key_file

为了演示方便,假设现在我们在同一台机器成功启动了另外2个节点,端口分别为8018、8019,实际部署时建议在不同机房的机器。

3.4 初始化副本集

在部署机器上通过MongoDB Shell连接其中一个节点,比如第一个:

./bin/mongo --port 8017

如果没有./mongo,可以手动下载mongo shell工具,如果远程连接需要指定--host,也就是mongo部署的机器信息。

在 MongoDB Shell 中执行以下命令,初始化副本集,注意_id需要和配置文件中的replSetName字段值保持一致。

rs.initiate({_id: "mongoClusterTest", // 副本集名称,需与配置文件一致members: [{ _id: 0, host: "127.0.0.1:8017" },{ _id: 1, host: "127.0.0.1:8018" },{ _id: 2, host: "127.0.0.1:8019" }]
});

 预期成功后信息如下:

检查副本集状态, 使用以下命令查看详细信息,确保所有节点的状态为 PRIMARYSECONDARY

rs.conf();
rs.status();

3.5 设置管理员账户和密码

按需常见即可,可以设置数据库级别的权限。下面给出管理员用户的账户和密码示例。管理员用户负责管理整个 MongoDB 集群的权限。以下是创建管理员用户的步骤:

1、以无身份验证模式连接 MongoDB

 连接到primary主节点的 MongoDB(默认无身份验证时)。设置了后,后面连接时需要指定账户和密码。

2、切换到 admin 数据库

use admin;

3、创建管理员用户

假设账户名为zhangsan,密码为abc123456,按需来改就行。

db.createUser({user: "zhangsan",pwd: "abc123456", // 替换为强密码roles: [ { role: "root", db: "admin" } ]
});

 成功操作后的返回信息示例为:

3.6 验证集群功能

为了方便手动操作,我们可以结合一些可视化的工具来操作,比如:Studio 3T。

  • 连接信息,输入节点信息和账户密码。

  • 连接成功后可以看到集群各节点的信息。
  • 如果没问题了就可以右键创建数据库、表,测试数据的增删改查。

4、常见问题

1、报错『ERROR: child process failed, exited with error number 1』退出。

答:可以通过less ./logs/mongod.log查看日志。

2、缓存设置可以结合实际情况设置,比如最大限制为50G,默认为系统可用资源的一半左右。

答:在配置文件中的设置示例。

3、连接方式建议换成集群形式,不推荐使用单节点连接,因为集群节点重启可能会引起重新选举primary节点。手动重新选举有很多方式,可以参考:

强制重新选举(Step Down):MongoDB提供了rs.stepDown()方法,使当前primary节点放弃主节点角色,重新触发选举过程。新的primary节点会在剩余secondary节点中根据优先级选出。
rs.stepDown()
此命令需要在primary节点执行。执行后,当前primary节点会立即转换为secondary,且一段时间内不能重新竞选为primary。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DB Type

P位 p 1时段描述符有效,p 0时段描述符无效 Base Base被分成了三个部分,按照实际拼接即可 G位 如果G 0 说明描述符中Limit的单位是字节,如果是G 1 ,那么limit的描述的单位是页也就是4kb S位 S 1 表示代码段或者数据段描…

大语言模型通用能力排行榜(2024年11月8日更新)

数据来源SuperCLUE 榜单数据为通用能力排行榜 排名 模型名称 机构 总分 理科 文科 Hard 使用方式 发布日期 - o1-preview OpenAI 75.85 86.07 76.6 64.89 API 2024年11月8日 - Claude 3.5 Sonnet(20241022) Anthropic 70.88 82.4…

【Unity基础】对比OnCollisionEnter与OnTriggerEnter

在Unity中,OnCollisionEnter 和 OnTriggerEnter 是两种用于处理碰撞的回调函数,但它们的工作方式和使用场景有所不同: 1. OnCollisionEnter 触发条件:当一个带有 Collider 组件并且**未勾选“Is Trigger”**的物体,与…

利用OpenAI进行测试需求分析——从电商网站需求到测试用例的生成

在软件测试工程师的日常工作中,需求分析是测试工作中的关键步骤。需求文档决定了测试覆盖的范围和测试策略,而测试用例的编写往往依赖于需求的准确理解。传统手工分析需求耗时长,尤其在面对大量需求和复杂逻辑时容易遗漏细节。本文将以电商网…

vue之axios根据某个接口创建实例,并设置headers和超时时间,捕捉异常

import axiosNew from axios;//给axios起个别名//创建常量实例 const instanceNew axiosNew.create({//axios中请求配置有baseURL选项,表示请求URL的公共部分,url baseUrl requestUrlbaseURL: baseURL,//设置超时时间为20秒timeout: 20000,headers: {…

【数学二】线性代数-二次型

考试要求 1、了解二次型的概念, 会用矩阵形式表示二次型,了解合同变换与合同矩阵的概念. 2、了解二次型的秩的概念,了解二次型的标准形、规范形等概念,了解惯性定理,会用正交变换和配方法化二次型为标准形。 3、理解正定二次型、正定矩阵的概念,并掌握其判别法. 二次型…

Qt 5.6.3 手动配置 mingw 环境

- 安装 qt 5.6.3 mingw 版 - 打开 qt creator - 找到选项 工具 - 选项- 构建和运行 - 找到 “编译器” 选项卡 ,点击 "添加" “编译器路径” 设置为 qt 安装目录下, tool 文件夹内的 g.exe 设置完成后,点击 "apply" ,使选项生…

pytorch tensor在CPU和GPU之间转换,numpy之间的转换

# input input.cpu().numpy() input input.cpu().detach().numpy() # 有gradCPU tensor转GPU tensor: cpu_imgs.cuda()GPU tensor 转CPU tensor: gpu_imgs.cpu()numpy转为CPU tensor: torch.from_numpy( imgs )4.CPU tensor转为numpy数…

k8s上部署redis高可用集群

介绍: Redis Cluster通过分片(sharding)来实现数据的分布式存储,每个master节点都负责一部分数据槽(slot)。 当一个master节点出现故障时,Redis Cluster能够自动将故障节点的数据槽转移到其他健…

抖音热门素材去哪找?优质抖音视频素材网站推荐!

是不是和我一样,刷抖音刷到停不下来?越来越多的朋友希望在抖音上创作出爆款视频,但苦于没有好素材。今天就来推荐几个超级实用的抖音视频素材网站,让你的视频内容立刻变得高大上!这篇满是干货,直接上重点&a…

PHP 语法基础

PHP 语法基础 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发,并且可以嵌入HTML中使用。PHP的语法混合了C、Java、Perl以及PHP自创的语法,易于学习和使用。本文将详细介绍PHP的…

Dify 通过导入 DSL 文件创建 Workflow 过程及实现

本文使用 Dify v0.9.2 版本,主要介绍 Dify 通过导入 DSL(或 URL)文件创建(或导出)Workflow 的操作过程及源码分析实现过程。Dify通过导入DSL文件创建Workflow过程及实现:https://z0yrmerhgi8.feishu.cn/wik…

代码随想录第46期 单调栈

这道题主要是单调栈的简单应用 class Solution { public:vector<int> dailyTemperatures(vector<int>& T) {vector<int> result(T.size(),0);stack<int> st;st.push(0);for(int i1;i<T.size();i){if(T[i]<T[st.top()]){st.push(i);}else{wh…

自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)

引言 在这个数字时代&#xff0c;计算机游戏已经成为人们生活中不可或缺的一部分。它们不仅为我们带来了无尽的乐趣&#xff0c;还激发了我们的创造力和解决问题的能力。今天&#xff0c;我们将深入探讨一个特别的头文件——CPPgame.h&#xff0c;它包含了多个结构体和函数&am…

【项目开发】理解SSL延迟:为何HTTPS比HTTP慢?

未经许可,不得转载。 文章目录 前言HTTP与HTTPS的耗时差异TCP握手HTTPS的额外步骤:SSL握手使用curl测量SSL延迟性能与安全的权衡前言 在互联网发展的早期阶段,Netscape公司设计了SSL(Secure Sockets Layer)协议,为网络通信提供加密和安全性。有人曾提出一个大胆的设想:…

3步实现贪吃蛇

方法很简单&#xff0c;打开页面&#xff0c;复制&#xff0c;粘贴 一.整体思维架构 我们根据游戏的开始&#xff0c;运行&#xff0c;结束&#xff0c;将整个游戏划分成三个部分。在每个部分下面又划分出多个功能&#xff0c;接下来我们就根据模块一一实现功能。 二.Gamesta…

【linux012】文件操作命令篇 - more 命令

文章目录 more 命令1、基本用法2、常见选项3、交互式键盘命令4、举例5、注意事项 more 命令 more 是 Linux 中的一个分页查看命令&#xff0c;用于逐屏显示文件内容。它特别适合用于查看较长的文件&#xff0c;与 cat 不同&#xff0c;more 不会一次性输出所有内容&#xff0c…

机器学习笔记2 - 机器学习的一般流程

image.png 1、数据基本处理 数据集的划分 根据用途可将获取到的数据划分为训练集和测试集&#xff0c;有时还会有验证集。一般而言训练集用于训练模型&#xff0c;测试集用于测试模型的效果&#xff08;泛化误差&#xff09;。严格来讲&#xff0c;测试集的数据不能直接或间接&…

《C陷阱与缺陷》

文章目录 1、【词法陷阱】1.1 符号与组成符号间的关系1.1 与 1.3 y x/*p 与 y x/(*p)&#xff0c;a-1 与 a - 1 与 a -1, 老版本编译器的处理是不同的&#xff0c;严格的ANSI C则会报错1.4 十进制的 076&#xff0c;会被处理为八进制&#xff0c;ANSI C禁止这种用法&#x…

小白快速上手 labelme:新手图像标注详解教程

前言 本教程主要面向初次使用 labelme 的新手&#xff0c;详细介绍了如何在 Windows 上通过 Anaconda 创建和配置环境&#xff0c;并使用 labelme 进行图像标注。 1. 准备工作 在开始本教程之前&#xff0c;确保已经安装了 Anaconda。可以参考我之前的教程了解 Anaconda 的下…