MongoDB分布式集群搭建----副本集----PSS/PSA

embedded/2024/11/19 20:07:06/

MongoDB分布式集群

Replication 复制、Replica Set 复制集/副本集 概念

一、 副本集的相关概念

1.概念

“ A replica set is a group of mongod instances that maintain the same data set. ”

  • 一组MongoDB服务器(多个mongod实例)(有不同的IP或端口)(具有相同的副本集名称)
  • 具有相同副本集,相同的数据 (为了保证数据的相同,需要各mongod实例间保持数据的复制)

2.副本集的组成

  • Primary Node 主节点 (一个) 默认的可写节点
  • Secondary Nodes 从节点 (多个)
    在这里插入图片描述

3.复制原理

  • 复制的初始化:当一个复制集被建立之初,我们需要首先初始化一个Primary主节点。
  • Replication(复制)发生在Primary(主节点)和Secondaries(从节点)之间。由主节点将操作记录(oplog)同步到从节点上,从节点根据oplog进行数据更新以获得与主节点相同的数据。【读比较多,写较少,主节点可读可写,从节点只可读】
  • 分担负载均衡,至少三台机器,选举需要超半数,一般是三台机器。一个T->3个T

4. 选举制度

  • 当主节点不可用时,一个复制集中的其他从节点将选举出一个新的主节点
  • 选举采用分级投票制:在最高优先级的节点中得票最高(超过总成员半数)的节点成为新的主节点
    • 影响选举的主要副本集配置:
      • members.priority
      • members.votes

二、从零开始搭建PSS副本集

在这里插入图片描述

一个主节点,两个从节点;在一台机器上模拟三台机器,一个目录代表一个机器,创建三个目录。首先做好规划表:

  • 如果不加副本集名称,那么这三台服务器之间没有关联。为了让三台服务器之间建立联系,引入相同的副本集(rs0)
  • 根据规划表,创建三个配置文件xxx.ini,都需要有副本集
//server1.ini
bind_ip=127.0.0.1
port=27001
dbpath=.\server1
logpath=.\server1\mongod.log
logappend=true
replSet = rs0//server2.ini
bind_ip=127.0.0.1
port=27002
dbpath=.\server2
logpath=.\server2\mongod.log
logappend=true
replSet = rs0//server3.ini
bind_ip=127.0.0.1
port=27003
dbpath=.\server3
logpath=.\server3\mongod.log
logappend=true
replSet = rs0

在这里插入图片描述

  • 写一个启动脚本文件
//创建目录,一个目录相当于一个服务器
mkdir .\server1
mkdir .\server2
mkdir .\server3
//启动3个服务器
start "MongoDB Server1" mongod --config=.\server1.ini
start "MongoDB Server2" mongod --config=.\server2.ini
start "MongoDB Server3" mongod --config=.\server3.ini
//启动3个客户端分别去连接3个服务器
start "Connect to Server1" mongo --port=27001
start "Connect to Server2" mongo --port=27002
start "Connect to Server3" mongo --port=27003
  • 启动后,三个服务器之间并未建立联系

在这里插入图片描述

  • 需要进行初始化,构造成员名单,通过initiate()函数传递名单,可以在终端执行以下语句,亦可以写在rs0conf.js中,客户端连接服务端时附带rs0conf.js配置文件
var rsconf={_id:"rs0","members":[{_id:0,host:"127.0.0.1:27001"},{_id:1,host:"127.0.0.1:27002"},{_id:2,host:"127.0.0.1:27003"},]};
rs.initiate(rsconf)

在这里插入图片描述

  • server1默认为primary,当server1挂掉之后,其它接任,即使重启server1,它当前也不能作为primary。

  • 主节点上可以创建、插入数据,但从节点没有读的功能。在secondary中运行命令会报错,报错"codeName" : "NotPrimaryNoSecondaryOk",需要先在secondary运行以下命令:

rs.secondaryOk()
  • primary具有读写功能,但是secondary只具有读功能。在primary中插入数据,其它两个secondary也能读到对应信息。
use zr;
db.students.insert({"name":"zhangsan"});
show dbs;
show collections;
db.students.find();

在这里插入图片描述

  • 在primary中插入GenerateStudents.js(需要放到与PSS副本集相同的目录中)相关学生数据后,在其它两个secondary中也能看到。
load("GenerateStudents.js")

在这里插入图片描述

  • 可以使用命令让当前的primary降级为secondary,其它服务器当选为primary
rs.stepDown();
  • 查看当前配置
rs.conf();
  • 默认10s中之内进行选举

在这里插入图片描述

复制方法

有关特定方法(包括事务语法和示例)的详细信息,请单击该方法的参考页面链接。

名称说明
rs.add()将节点添加到副本集。
rs.addArb()将仲裁节点添加到副本集。
rs.conf()返回副本集配置文档。
rs.freeze()阻止当前节点在一段时间内寻求选举为主节点。
rs.help()返回副本集函数的基本帮助文本。
rs.initiate()****初始化新的副本集。
rs.printReplicationInfo()从主节点的角度打印副本集状态的格式化报告。
rs.printSecondaryReplicationInfo()从从节点的角度打印副本集状态的格式化报告。
rs.reconfig()通过应用新的副本集配置对象来重新配置副本集。
rs.reconfigForPSASet()在主从仲裁 (PSA) 副本集或正在更改为 PSA 架构的副本集上安全地执行某些重新配置更改。
rs.remove()从副本集中删除节点。
rs.status()返回包含副本集状态信息的文档。
rs.stepDown()导致当前的主节点变为强制选举的从节点。
rs.syncFrom()设置该副本集节点与哪个节点进行同步,复写默认的同步目标选择逻辑。

修改三台服务器的优先级

rs0:PRIMARY>rs.conf()//查看副本集内容,包括三台服务器的id、priority...
rs0:PRIMARY> var rsconf=rs.conf()//拿到配置信息保存到变量rsconf中
rs0:PRIMARY> rsconf.members[0].priority=9//将server1优先级改为9,默认是1
rs0:PRIMARY> rsconf.members[1].priority=0//将server2优先级改为0
rs0:PRIMARY> rs.reconfig(rsconf)//重新配置信息生效
//等待10秒,primary变为server1
  • 退出primary
rs0:PRIMARY> rs.stepDown()

三、搭建PSA副本集

  1. 配置server4、server5、server6三台服务器,并设置仲裁节点(PSA副本集),规划表如图
    在这里插入图片描述

  2. 配置文件xxx.ini

//server4.ini
bind_ip=127.0.0.1
port=27004
dbpath=.\server4
logpath=.\server4\mongod.log
logappend=true
replSet = rs1//server5.ini
bind_ip=127.0.0.1
port=27005
dbpath=.\server5
logpath=.\server5\mongod.log
logappend=true
replSet = rs1//server6.ini
bind_ip=127.0.0.1
port=27006
dbpath=.\server6
logpath=.\server6\mongod.log
logappend=true
replSet = rs1

在这里插入图片描述

  1. rs1.conf文件
var rsconf={_id:"rs1","members":[{_id:0,host:"127.0.0.1:27004"},{_id:1,host:"127.0.0.1:27005"},{_id:2,host:"127.0.0.1:27006",priority:0,arbiterOnly:true},]};
rs.initiate(rsconf)
  • priority: 0: 这个字段指定了成员在选举过程中的优先级。优先级为0意味着这个成员不会被选举为主节点(primary node)。
  • arbiterOnly: true: 这个字段表示该成员是一个仲裁者(arbiter)。仲裁者不存储数据,只参与选举过程,以帮助在副本集中保持奇数个成员来避免脑裂(split-brain)问题。
  1. 启动脚本
mkdir .\server4
mkdir .\server5
mkdir .\server6start "MongoDB Server4" mongod --config=.\server4.ini 
start "MongoDB Server5" mongod --config=.\server5.ini
start "MongoDB Server6" mongod --config=.\server6.inistart "Connect to Server4" mongo --port=27004 --shell rs1conf.js
start "Connect to Server5" mongo --port=27005
start "Connect to Server6" mongo --port=27006

在这里插入图片描述

只能有一个仲裁节点,文件大小固定而且最小,都是300MB

在这里插入图片描述

  • rs0和rs1两个副本集之间没有任何关联。副本集是分布式集群中的一个基本单元。

http://www.ppmy.cn/embedded/138853.html

相关文章

基于GPU器件行为的创新分布式功能安全机制为智能驾驶保驾护航

作者:商瑞 陈娇 随着汽车智能化程度的快速提高,大量新的处理器和系统级芯片(SoC)被广泛引入到车辆中,无论是在驾驶还是座舱等场景,无论采用域控制器模式还是新兴的中央控制单元模式,都无一例外…

labview使用报表工具从数据库导出数据

之前写了一篇labview从数据库导出数据到excel电子表格,但是是基于调用excel的activeX控件,有时候会有一些bug,就比如我工作机就无法显示方法,后面大哥指点才知道没有的原因是excel安装不完整。像我的工作机就没有这个选项。就需要…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

SpringBoot 之整合gRPC

父工程中引入基本的依赖&#xff1a; <modules><module>api</module><module>client</module><module>service</module></modules><parent><artifactId>spring-boot-starter-parent</artifactId><group…

百度世界2024|李彦宏:智能体是AI应用的最主流形态,即将迎来爆发点

“ 过去24个月&#xff0c;AI行业的最大变化是什么&#xff1f;是大模型基本消除了幻觉。” 11月12日&#xff0c;百度创始人李彦宏在百度世界2024大会上&#xff0c;发表了主题为《应用来了》的演讲&#xff0c;发布两大赋能应用的AI技术——检索增强的文生图技术&#xff08;…

【java】抽象类和接口(了解,进阶,到全部掌握)

各位看官早安午安晚安呀 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 大家好我们今天来学习Java面向对象的的抽象类和接口&#xff0c;我们大家庭已经来啦~ 第一次复习时总结&#xff1a; 一&#xff1a;抽象类 1.1…

基于 PyTorch 从零手搓一个GPT Transformer 对话大模型

一、从零手实现 GPT Transformer 模型架构 近年来&#xff0c;大模型的发展势头迅猛&#xff0c;成为了人工智能领域的研究热点。大模型以其强大的语言理解和生成能力&#xff0c;在自然语言处理、机器翻译、文本生成等多个领域取得了显著的成果。但这些都离不开其背后的核心架…

Qt-QWidget中的属性和方法

控件简单概述 控件Wigdet&#xff0c;其实也就是小组件/小部件的意思&#xff0c;但是读作控件就显得非常专业了。 在Qt Designer中 这些都是Qt给我们内置好的类。 Qt中的各种控件都是继承自QWidget类&#xff0c;并且在QWidget这里可以看到控件的属性&#xff1a; QWidget …