MongoDB 5.0版本副本集集群

一、MongoDB 5.0版本副本集集群部署

什么是MongoDB的副本集

MongoDB的副本集(Replica Set)是一种用于提高数据库系统可用性、可靠性和数据冗余性的机制。副本集包含一组相互连接的MongoDB节点,其中包括一个主节点(Primary)多个从节点(Secondary)。主节点处理所有的写入操作以及读取操作,而从节点则通过异步复制主节点上的操作来保持数据的一致性,从而作为数据的热备份。如果主节点发生故障,从节点之一可以通过选举过程升级为主节点,以保证服务的连续性。

MongoDB副本集基本组成

MongoDB副本集通常由以下部分组成:

  • 一个主节点(Primary): 处理所有写操作
  • 多个从节点(Secondary): 复制主节点数据,可以处理读操作
  • 可选的仲裁节点(Arbiter): 不存储数据,只参与选举

仲裁者作用

仲裁者(Arbiter)在MongoDB副本集中扮演着重要的角色,下面是仲裁者的作用

  • 选举过程:仲裁者在选举过程中投出关键的一票,帮助确定新的主节点。
  • 防止死锁:在偶数成员的情况下,仲裁者可以打破平局,避免系统陷入死锁状态。
  • 不存储数据:仲裁者不存储任何数据,减少了存储开销和数据复制带来的网络负载。
  • 提高可靠性:通过仲裁者的存在,可以显著提高副本集的可靠性和高可用性。

部署副本集

1 节点划分

mongo1

mongo2

端口

角色

shared server1(Primary)

shared server1(Primary)

27017

主节点

shared server2(Secondary)

shared server2(Secondary)

27018

副本节点

shared server3(Secondary)

shared server3(Secondary)

27019

副本节点

shared server4(Arbiter)

shared server4(Arbiter)

27020

仲裁节点

2 安装MongoDB

2.1 下载并安装MongoDB

下载适用于Linux系统的MongoDB安装包,并解压至指定路径。

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.2.tgz
tar -xzvf mongodb-linux-x86_64-rhel70-5.0.2.tgz -C /usr/local
cd /usr/local/
mv mongodb-linux-x86_64-rhel70-5.0.2/ /usr/local/mongodb

3 创建主节点

3.1 创建数据和日志目录
mkdir -p /usr/local/mongodb/replica_sets/myrs_27017/{log,data/db}
3.2 配置文件

vim /usr/local/mongodb/replica_sets/myrs_27017/mongod.conf

systemLog:destination: filepath: "/usr/local/mongodb/replica_sets/myrs_27017/log/mongod.log"logAppend: true
storage:dbPath: "/usr/local/mongodb/replica_sets/myrs_27017/data/db"journal:enabled: true
processManagement:fork: truepidFilePath: "/usr/local/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:bindIp: localhost,10.0.1.10port: 27017
replication:replSetName: myrs
3.3 启动主节点
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/replica_sets/myrs_27017/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 15214
child process started successfully, parent exiting

4 创建副本节点

4.1 创建数据和日志目录
mkdir -p /usr/local/mongodb/replica_sets/myrs_{27018,27019,27020}/{log,data/db}
4.2 配置副本节点

vim /usr/local/mongodb/replica_sets/myrs_27018/mongod.conf

systemLog:destination: filepath: "/usr/local/mongodb/replica_sets/myrs_27018/log/mongod.log"logAppend: true
storage:dbPath: "/usr/local/mongodb/replica_sets/myrs_27018/data/db"journal:enabled: true
processManagement:fork: truepidFilePath: "/usr/local/mongodb/replica_sets/myrs_27018/log/mongod.pid"
net:bindIp:  localhost,10.0.1.10port: 27018
replication:replSetName: myrs

vim /usr/local/mongodb/replica_sets/myrs_27019/mongod.conf

systemLog:destination: filepath: "/usr/local/mongodb/replica_sets/myrs_27019/log/mongod.log"logAppend: true
storage:dbPath: "/usr/local/mongodb/replica_sets/myrs_27019/data/db"journal:enabled: true
processManagement:fork: truepidFilePath: "/usr/local/mongodb/replica_sets/myrs_27019/log/mongod.pid"
net:bindIp:  localhost,10.0.1.10port: 27019
replication:replSetName: myrs
4.3 启动节点服务
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/replica_sets/myrs_27018/mongod.conf
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/replica_sets/myrs_27019/mongod.conf

5 创建仲裁节点

5.1 创建配置文件

vim /usr/local/mongodb/replica_sets/myrs_27020/mongod.conf

systemLog:destination: filepath: "/usr/local/mongodb/replica_sets/myrs_27020/log/mongod.log"logAppend: true
storage:dbPath: "/usr/local/mongodb/replica_sets/myrs_27020/data/db"journal:enabled: true
processManagement:fork: truepidFilePath: "/usr/local/mongodb/replica_sets/myrs_27020/log/mongod.pid"
net:bindIp:  localhost,10.0.1.10port: 27020
replication:replSetName: myrs
5.3 启动节点服务
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/replica_sets/myrs_27020/mongod.conf

6 添加环境变量

vim /etc/profile
export PATH=/usr/local/mongodb/bin/:$PATH
source /etc/profile
which mongo
/usr/local/mongodb/bin/mongo

7 初始化副本集

7.1 进入集群
mongo --host 10.0.1.10 --port 27017
7.2 初始化集群
> rs.initiate()

7.3 查看副本集
myrs:PRIMARY> rs.conf()

7.4 添加副本节点
myrs:PRIMARY> rs.add("10.0.1.10:27018")
myrs:PRIMARY> rs.add("10.0.1.10:27019")
myrs:PRIMARY> rs.addArb("10.0.1.10:27020")

遇到问题,rs.addArb无响应解决办法:

db.adminCommand({"setDefaultRWConcern" : 1,"defaultWriteConcern" : {"w" : 2}
})
7.5 再次查看副本集配置信息
myrs:PRIMARY> rs.conf()
{"_id" : "myrs","version" : 6,"term" : 2,"members" : [{"_id" : 0,"host" : "10.0.1.10:27017","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"secondaryDelaySecs" : NumberLong(0),"votes" : 1},{"_id" : 1,"host" : "10.0.1.10:27018","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"secondaryDelaySecs" : NumberLong(0),"votes" : 1},{"_id" : 2,"host" : "10.0.1.10:27019","arbiterOnly" : false,"buildIndexes" : true,"hidden" : false,"priority" : 1,"tags" : {},"secondaryDelaySecs" : NumberLong(0),"votes" : 1},{"_id" : 3,"host" : "10.0.1.10:27020","arbiterOnly" : true,"buildIndexes" : true,"hidden" : false,"priority" : 0,"tags" : {},"secondaryDelaySecs" : NumberLong(0),"votes" : 1}]
  • 成员0
    • _id:0,成员的唯一标识符。
    • host10.0.1.10:27017,表示该成员的主机地址和端口。
    • arbiterOnlyfalse,表示这不是一个仲裁节点。
    • priority:1,优先级为1,意味着它可以成为主节点。
    • votes:1,投票权重为1,参与选举投票。

测试副本集的数据读写同步操作

1 测试步骤

1.1 准备工作

确保副本集已经正确配置并运行。可以通过以下命令查看副本集的配置:

myrs:PRIMARY> rs.conf()

插入数据在主节点上插入一些测试数据,以确保数据能够正确地写入并同步到从节点。

myrs:PRIMARY> use testdb;
myrs:PRIMARY> db.test.insertOne({ name: "John Doe", age: 30 });
{"acknowledged" : true,"insertedId" : ObjectId("66d57a427713464146c2cca9")
}
1.2 验证主节点

在主节点上查询刚刚插入的数据,确保数据已经成功插入。

myrs:PRIMARY> db.test.find();
{ "_id" : ObjectId("66d57a427713464146c2cca9"), "name" : "John Doe", "age" : 30 }
1.3 等待数据同步

数据插入后,可能需要几秒钟的时间才能完全同步到从节点。可以使用 rs.status() 查看同步进度。

myrs:PRIMARY> rs.status()

查看 health 字段,确保从节点的状态为 1

1.4 设置副本节点可读并验证从节点

连接到从节点,查询刚刚插入的数据,确保数据已经成功同步。

设置从节点有读取权限
myrs:SECONDARY> rs.secondaryOk()
设置从节点关闭读取权限
myrs:SECONDARY> rs.secondaryOk(false)
myrs:SECONDARY> use testdb;
myrs:SECONDARY> db.test.find();
{ "_id" : ObjectId("66d57a427713464146c2cca9"), "name" : "John Doe", "age" : 30 }

如果数据已经出现在从节点上,说明同步操作成功。

1.5 更新数据

在主节点上更新刚刚插入的数据,再次验证同步操作。

myrs:PRIMARY> db.test.updateOne({ name: "John Doe" }, { $set: { age: 31 } });

验证更新同步在从节点上查询更新后的数据,确保数据已经同步。

myrs:SECONDARY> db.test.find();
{ "_id" : ObjectId("66d57a427713464146c2cca9"), "name" : "John Doe", "age" : 31 }

删除数据在主节点上删除刚刚插入的数据,再次验证同步操作。

myrs:PRIMARY> db.test.deleteOne({ name: "John Doe" });

验证删除同步在从节点上查询删除后的数据,确保数据已经同步删除。

myrs:SECONDARY> db.test.find();

2 仲裁节点不存储数据

mongo --host 10.0.1.10 --port 27020myrs:ARBITER> rs.secondaryOk()
myrs:ARBITER> show dbs
uncaught exception: Error: listDatabases failed:{"topologyVersion" : {"processId" : ObjectId("66d563aefe48eda115ba75a8"),"counter" : NumberLong(1)},"ok" : 0,"errmsg" : "node is not in primary or recovering state","code" : 13436,"codeName" : "NotPrimaryOrSecondary"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs/<@src/mongo/shell/mongo.js:145:19
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:97:12
shellHelper.show@src/mongo/shell/utils.js:956:13
shellHelper@src/mongo/shell/utils.js:838:15
@(shellhelp2):1:1

主节点的选举规则

MongoDB 副本集中的主节点选举规则是为了确保在一个分布式环境中选择一个合适的节点来承担主节点的角色。主节点负责处理所有的写操作,并将数据同步到从节点。以下是一些主要的选举规则和流程:

1.1 选举流程

故障检测

  • 当主节点发生故障或离线时,从节点会检测到这种情况,并开始进行选举过程。

心跳机制

  • 副本集中的成员定期发送心跳消息来检测其他成员的状态。如果一段时间内没有收到主节点的心跳响应,从节点会认为主节点已离线。

选举开始

  • 当检测到主节点离线时,从节点会进入选举阶段。每个从节点都会尝试成为新的主节点。

选举资格

  • 只有具有选举资格的节点才能成为主节点。选举资格取决于优先级(priority)、投票权重(votes)和其他配置参数。

1.2 选举规则

优先级(Priority)

  • 每个节点都有一个优先级值(priority),默认为1。优先级较高的节点更有可能成为主节点。
  • 优先级为0的节点不能成为主节点。

选举顺序

  • 如果多个节点具有相同的优先级,则按照节点的_id进行排序。
  • 具有较高优先级的节点将优先成为主节点。

投票机制

  • 每个节点都有一个投票权重(votes),默认为1。节点需要获得大多数投票才能成为主节点。
  • 仲裁节点(arbiterOnly)不存储数据,但参与投票。仲裁节点的投票权重为1。

多数票原则

  • 在选举过程中,需要获得大多数节点的投票才能成为主节点。如果总共有N个节点,则需要超过N/2的票数。

二、mongosync集群之间数据同步

参考链接:Cluster-to-Cluster Sync - MongoDB Cluster-to-Cluster Sync v1.8

Cluster-to-Cluster Sync 通过 mongosync 实用程序提供 MongoDB 集群之间的持续数据同步或一次性数据迁移。

mongosync 可以在两个集群之间持续同步数据,帮助您创建反映生产环境的专用分析、开发或测试集群。

同步后的集群还能满足审计和数据驻留合规性的局部性要求。除了连续的数据同步外,mongosync 还可以用于集群间的一次性数据迁移。

使用mongosync需要考虑版本兼容问题

三、mongoshake集群之间数据同步

1 部署第二台mongo主机,与第一台一样,仅需把ip修改即可。

2 从MongoDB副本集同步到MongoDB副本集

2.1 安装mongoshake

wget https://github.com/alibaba/MongoShake/releases/download/release-v2.8.4-20230425/mongo-shake-v2.8.4.tgz
tar -xzvf mongo-shake-v2.8.4.tgz -C /usr/local
cd /usr/local/
mv mongo-shake-v2.8.4/ mongoshake

2.2 修改配置文件

vim /usr/local/mongoshake/collector.conf

mongo_urls = mongodb://10.0.1.10:27017,10.0.1.10:27018,10.0.1.10:27019,10.0.1.10:27020
tunnel.address = mongodb://10.0.1.20:27017,10.0.1.20:27018,10.0.1.20:27019,10.0.1.20:27020
sync_mode = all
incr_sync.mongo_fetch_method = oplog
  • mongo_urls :源端MongoDB实例的ConnectionStringURI格式连接地址
  • tunnel.address:目标端MongoDB实例的ConnectionStringURI格式连接地址
  • sync_mode :数据同步的方式,取值:all:执行全量数据同步和增量数据同步。full:仅执行全量数据同步。incr:仅执行增量数据同步。
  • incr_sync.mongo_fetch_method = oplog # 如果希望以change stream拉取,该值需要配置change_stream,支持>=4.0.1版本。

2.3 启动!

./collector.linux -conf=collector.conf -verbose 1

2.4 测试是否能实时同步

在10.0.1.10发送端插入数据

mongo --host 10.0.1.10 --port 27017
myrs:PRIMARY> use testdb;
myrs:PRIMARY> db.test.insertOne({ name: "ke li", age: 22 });
myrs:PRIMARY> db.test.find();
{ "_id" : ObjectId("66d6c61f2f0fd77307a32d80"), "name" : "ke li", "age" : 22 }

在10.0.1.20可以查看到数据

mongo --host 10.0.1.20 --port 27017
myrs:PRIMARY> use testdb;
myrs:PRIMARY> db.test.find();
{ "_id" : ObjectId("66d6c61f2f0fd77307a32d80"), "name" : "ke li", "age" : 22 }

验证成功,实现了单向实时同步功能。

参考资料:

通过MongoShake实现MongoDB实例的单向同步_云数据库 MongoDB 版(MongoDB)-阿里云帮助中心 (aliyun.com)

Mongo-shake-阿里云开发者社区 (aliyun.com)

MongoShake最佳实践-阿里云开发者社区 (aliyun.com)

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

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

相关文章

使用FastJson2将对象转成JSON字符串时,小数转换出错

maven坐标 <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.40</version> </dependency> 问题现象&#xff1a; 问题原因&#xff1a; IOUtils.write…

SSM框架学习(二:SpringFramework实战指南)

目录 一、SpringFramework介绍 1.总体技术体系 &#xff08;1&#xff09;单一架构 &#xff08;2&#xff09; 分布式架构 2.Spring 和 SpringFramework概念 &#xff08;1&#xff09;广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff09; &#xff…

基于IndexDB+md-editor-v3实现的简单的文章书写小系统

基于IndexDBmd-editor-v3实现的简单的文章书写小系统 文章说明核心代码效果展示源码下载 文章说明 采用vue3 IndexDB 实现的个人仓库系统&#xff0c;采用markdown书写文章&#xff0c;并将文章信息存储在IndexDB数据库中&#xff0c;通过JavaScript原生自带的分词API进行文章…

STM32——串口通信(发送/接收数据与中断函数应用)

文章目录 通信&#xff1a;串口通信简介&#xff1a;1.双工/单工&#xff1a;2.同步/异步&#xff1a;3.电平&#xff1a;电平标准&#xff1a; 串口参数以及数据帧时序&#xff1a;数据帧&#xff1a;1.波特率和比特率&#xff1a;例&#xff1a;无校验&#xff0c;1位停止位 …

【WebGIS实例】(16)GeoServer 自定义样式 - 渲染矢量数据

1. 前言 本篇博客将会分享一系列的 GeoServer 样式&#xff0c;通过这些样式预先在服务端完成数据渲染&#xff0c;让前端应用更便捷的加载数据服务。 2. 面矢量 示例数据&#xff1a; {type: FeatureCollection,features: [{type: Feature,properties: {分类字段: 字段一…

数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索 最终我们是需要使用 API 的方式&#xff0c;调用后端服务拉取数据填充筛选器组件&#xff0c;不过在探索阶段&#xff0c;直接用 API 方式&#xff0c;就需要构造 mock 数据&#xff0c;比较麻烦&#xff0c;因此先使用 Function 方式来进行功能验证。 组件初…

代理模式详解

1.基本介绍 代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能;被代理的对象可以是远程对象、创建开销大的对象或需要安全控制…

记录:uniapp直播的弹幕的样式修改与发送弹幕会自动滚动到底部两个技巧

1、在直播页面的弹幕评论中&#xff0c;我们希望的样式是&#xff1a; 观众名字&#xff1a;评论 而且颜色有所区分&#xff0c;并在同一行显示 2、我们希望在发弹幕的时候可以回自动滚动到自己发的内容那里 一&#xff1a;弹幕样式修改 因为是小白&#xff0c;前端对于样式这…

苹果手机照片被删除?如何通过不同的方法来恢复照片

手机已经成为我们生活中不可或缺的一部分&#xff0c;它不仅仅是通讯工具&#xff0c;更是我们记录生活点滴的重要工具之一。然而&#xff0c;正如其他任何设备一样&#xff0c;iPhone上存储的照片有时也会不小心被删除或丢失。 别担心&#xff0c;即使你误删了重要的照片&…

重头开始嵌入式第三十四天(数据库二)

sqlite3的一些补充 目录 sqlite3的一些补充 1.事物 2.连接&#xff0c;联合 3.触发器 4.子查询 1.事物 数据库事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;它由一系列对数据库的操作组成。 一、事务的特性 1. 原子性&#xff08;Atomicity&#xff09…

Linux:目录及文件管理

目录及文件管理 cd的命令使用 . 当前目录 .. 父目录&#xff08;上一层&#xff09; ~ 表示家目录 家目录&#xff1a;专门存放用户个性化信息的目录 ~user&#xff1a;用户user的家目录 /root: 是Linux管理员的家目录 /home: 存放所有普通用户的家目录]# cd ~root #去…

大模型LLM算法工程师技术面试指南

大模型LLM算法工程师技术面试指南 AI大模型全套学习资料 “最先掌握AI的人&#xff0c;将会比较晚掌握AI的人有竞争优势”。 这句话&#xff0c;放在计算机、互联网、移动互联网的开局时期&#xff0c;都是一样的道理。 我在一线互联网企业工作十余年里&#xff0c;指导过不少…

Java异常类

目录 Java异常类 Java中的异常体系 抛出异常 处理异常 处理异常的两种方式 try...catch和throws的区别 finally关键字 抛出异常注意事项 自定义异常类 Java异常类 Java中的异常体系 在Java中&#xff0c;异常类的父类为Throwable类&#xff0c;在Throwable下&#x…

记一次高版本view-design的组件迁移到自身项目的低版本

背景 npm i -S view-design当前老项目使用view-design这个组件库&#xff0c;但是当我们去官网查看该组件库最新版本&#xff0c;竟然发现没有博主想用的image/ImagePreivew这两个基础组件 说实话&#xff0c;有点离谱了哈&#xff01;&#xff01; 自己造轮子&#xff1f; …

数据结构基本知识

一、什么是数据结构 1.1、组织存储数据 ---------》内存&#xff08;存储&#xff09; 1.2、研究目的 如何存储数据&#xff08;变量&#xff0c;数组....)程序数据结构算法 1.3、常见保存数据的方法 数组&#xff1a;保存自己的数据指针&#xff1a;是间接访问已经存在的…

分库分表核心理念

文章目录 分库&#xff0c;分表&#xff0c;分库分表什么时候分库&#xff1f;什么时候分表&#xff1f;什么时候既分库又分表&#xff1f;横向拆分 & 纵向拆分 分表算法Range 范围Hash 取模一致性 Hash斐波那契散列 严格雪崩标准&#xff08;SAC&#xff09;订单分库分表实…

【880高数】高等数学一刷错题整理

第一章 函数、极限、连续 2024.8.11日 1. 2. 3. 4. 5. 2024.8.12日 1. 2. 3. 4. 5. 6. 7. 8. 2024.8.13日 1. 2. 3. 4. 2024.8.14日 1. 2. 3. 4. 5. 第二章 一元函数微分学及其应用 2024.8.15日 1. 2. 3. 4. 5. 6. 2024.8.16日 1. 2. 3. 4. 5. 2024.8.17日 1. 2. 3. 4…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

相亲交友系统背后的科技力量:智能匹配的秘密

随着互联网技术的发展&#xff0c;相亲交友系统已经成为许多人寻找另一半的重要工具。这些相亲交友系统不仅仅是一个简单的社交平台&#xff0c;它们背后隐藏着强大的科技力量&#xff0c;尤其是智能匹配技术&#xff0c;使得用户能够更加高效地找到适合自己的伴侣。 相亲交友…

信息学奥赛初赛天天练-87-NOIP2014普及组-完善程序-矩阵、子矩阵、最大子矩阵和、前缀和、打擂台求最大值

1 完善程序 最大子矩阵和 给出 m行 n列的整数矩阵&#xff0c;求最大的子矩阵和(子矩阵不能为空)。 输入第一行包含两个整数 m和 n&#xff0c;即矩阵的行数和列数。之后 m行&#xff0c;每行 n个整数&#xff0c;描述整个矩阵。程序最终输出最大的子矩阵和。 &#xff08;最…