MongoDB 5.0版本副本集集群

news2024/12/24 9:03:54

一、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: file
    path: "/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: true
    pidFilePath: "/usr/local/mongodb/replica_sets/myrs_27017/log/mongod.pid"
net:
    bindIp: localhost,10.0.1.10
    port: 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: file
    path: "/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: true
    pidFilePath: "/usr/local/mongodb/replica_sets/myrs_27018/log/mongod.pid"
net:
    bindIp:  localhost,10.0.1.10
    port: 27018
replication:
    replSetName: myrs

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

systemLog:
    destination: file
    path: "/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: true
    pidFilePath: "/usr/local/mongodb/replica_sets/myrs_27019/log/mongod.pid"
net:
    bindIp:  localhost,10.0.1.10
    port: 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: file
    path: "/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: true
    pidFilePath: "/usr/local/mongodb/replica_sets/myrs_27020/log/mongod.pid"
net:
    bindIp:  localhost,10.0.1.10
    port: 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 27020

myrs: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.coloradmin.cn/o/2112264.html

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

相关文章

基于web的赴台展会人员管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

VSC++: 括号对称比较

括号的使用规则&#xff1a;大括号&#xff0c;中括号&#xff0c;小括号{[()]}&#xff1b;中括号&#xff0c;小括号[()]&#xff1b;小括号()&#xff1b;大括号、中括号、小括号、中括号、小括号、大括号{[()][()]}&#xff1b;大括号&#xff0c;中括号&#xff0c;小括号…

Reflection 70B:震撼AI行业的开源模型

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;开源与闭源模型的竞争变得越来越激烈。近日&#xff0c;Reflection 70B模型的发布在AI行业引发了巨大的震动。这款拥有70亿参数的开源模型不仅在多项基准测试中取得了优异成绩&#xff0c;还在很多情况下超越…

无人机之报警器的工作原理

无人机报警器&#xff08;通常指的是无人机上搭载的某种警报系统或装置&#xff0c;用于在特定条件下触发警报&#xff09;的作用原理可能涉及多个方面&#xff0c;但具体到无人机报警器这一组件&#xff0c;其原理往往与无人机的整体安全监控、电池状态监测或任务执行中的特定…

基于Java+SpringBoot+Vue+MySQL的美发管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于SpringBootVue的美发管理系统【附源码文档】、前后端分…

揭秘循环购模式:如何实现消费增值与日常收益

欢迎各位&#xff0c;我是吴军&#xff0c;你们的电商策略顾问。今天&#xff0c;我将向大家介绍一种新颖的商业模式——循环购模式&#xff0c;它如何为商家和消费者创造价值。 你可能会好奇&#xff0c;为何会有“消费1000元&#xff0c;赠送2000元”的优惠&#xff1f;以及…

算法练习小技巧之有序集合--套路详细解析带例题(leetcode)

前言: 本文详细讲解Python中的有序集合SortedList和C中的有序集合multiset的用法&#xff0c;配合leetcode的例题来展示实际的用处。(本人水平不够&#xff0c;还无法讲解有序集合的实现方法&#xff0c;只会用) 觉得有帮助或者写的不错可以点个赞&#xff0c;后面也有几道我找…

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…

本机ip地址怎么看是不是公网

在数字化时代&#xff0c;‌了解自己的网络连接属性&#xff0c;‌尤其是本机IP地址是否为公网IP&#xff0c;‌对于网络安全、‌远程访问、‌在线服务配置等方面都至关重要。‌公网IP&#xff0c;‌即互联网上的唯一地址&#xff0c;‌能让任何连接互联网的设备访问到你的设备…

java框架第五课(终极版本)SpringBoot

一.关于SpringBoot (1)回忆Spring 传统的Spring由Spring 框架(ioc,aop)加mybatis加Springweb组成&#xff0c;虽然相比原生的java程序Spring框架帮我们大大减少了代码量&#xff0c;减少了冗余&#xff0c;提高了开发效率但是由于Spring框架下的配置和相关的jar包依赖过多&am…

图像去噪:使用DAMRmF算法

在数字图像处理领域&#xff0c;噪声是不可避免的&#xff0c;它会影响图像的质量和可读性。为了提高图像的质量&#xff0c;去噪算法是必不可少的工具。在这篇文章中&#xff0c;我们将介绍一种名为DAMRmF的去噪算法&#xff0c;并展示如何使用MATLAB实现和应用它。 一、什么…

1-8 图像腐蚀 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 kernelnp.ones((2,2),np.uint8) _, binary_image cv2.threshold(image, 127, 255, cv2.THRESH_BINARY) eroded_imagecv2.erode(binary_image,kernel,iterations1) eroded_image2cv2.erode(image2,kernel,iterations1) 三、运行现象 四…

如何处理忘记实现接口所有方法

在Java编程中&#xff0c;当你声明一个类实现了某个接口时&#xff0c;但没有实现接口中的所有方法&#xff0c;编译器会报错。这是因为接口规定了必须由实现类提供的功能&#xff0c;任何没有实现的接口方法&#xff0c;都会被认为是实现不完整的&#xff0c;导致编译失败。 …

[含视频和源码]CRUD的最佳实践,联动前后端,包含微信小程序,API,HTML等(三)

关说不练假把式&#xff0c;在上一&#xff0c;二篇中介绍了我心目中的CRUD的样子 基于之前的理念&#xff0c;我开发了一个命名为PasteTemplate的项目&#xff0c;这个项目呢后续会转化成项目模板&#xff0c;转化成项目模板后&#xff0c;后续需要开发新的项目就可以基于这…

【时时三省】(C语言基础)指针进阶 例题3

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 例题&#xff1a; 这个arr里面是放了&#xff3b;a b c d e f \0&#xff3d; 第一个arr 这个sizeof是计算这个数组的大小 这个里面加上\0一共是7个元素 所以打印7 第二个arr0 这个指数组…

OGRE 3D----创建第一个OGRE 3D示例

目录 1. OGRE 3D概述 2. OGRE 3D vs VTK 3. 编译OGRE 3D 源码 4. 创建示例和配置其编译环境 5. 配置示例程序的执行环境 1. OGRE 3D概述 OGRE (Object-Oriented Graphics Rendering Engine) 是一个开源的、高级的 3D 图形渲染引擎&#xff0c;它提供了一个抽象层&#xf…

Mybatis---代理设计模式(超详细)

Mybatis—代理设计模式 文章目录 Mybatis---代理设计模式一、什么是代理设计模式二、静态代理1、定义2、结构3、示例 三、动态代理1、定义2、newProxyInstance &#xff08;&#xff09;方法3、示例 四、CGLIB代理1、引入2、定义3、工作原理4、示例 一、什么是代理设计模式 首…

大数据-121 - Flink Time Watermark 详解 附带示例详解

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Unity(2022.3.41LTS) - UI详细介绍- Toggle(切换)

目录 零.简介 一、基本功能 二、属性和设置 三、使用方法 四、优化和注意事项 零.简介 在 Unity 中&#xff0c;Toggle 是一种常用的 UI 组件&#xff0c;用于表示一个布尔值的状态&#xff0c;类似于复选框。 一、基本功能 状态切换&#xff1a;Toggle 有两种状态&…

sqli-lab靶场学习(一)——Less1-4

前言 最近一段时间想切入安全领域&#xff0c;因为本身有做数据库运维工作&#xff0c;就打算从sql注入方向切入。而sql注入除了学习日常书本上的概念外&#xff0c;需要有个实践的环境&#xff0c;刚好看到sqli-lab这个靶场&#xff0c;就打算先用这个来学习。 安装部署 网上…