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

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,都需要有副本集
json 复制代码
//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
  • 写一个启动脚本文件
json 复制代码
//创建目录,一个目录相当于一个服务器
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配置文件
json 复制代码
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运行以下命令:

json 复制代码
rs.secondaryOk()
  • primary具有读写功能,但是secondary只具有读功能。在primary中插入数据,其它两个secondary也能读到对应信息。
json 复制代码
use zr;
db.students.insert({"name":"zhangsan"});
show dbs;
show collections;
db.students.find();
  • 在primary中插入GenerateStudents.js(需要放到与PSS副本集相同的目录中)相关学生数据后,在其它两个secondary中也能看到。
json 复制代码
load("GenerateStudents.js")
  • 可以使用命令让当前的primary降级为secondary,其它服务器当选为primary
json 复制代码
rs.stepDown();
  • 查看当前配置
json 复制代码
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() 设置该副本集节点与哪个节点进行同步,复写默认的同步目标选择逻辑。

修改三台服务器的优先级

js 复制代码
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
js 复制代码
rs0:PRIMARY> rs.stepDown()

三、搭建PSA副本集

  1. 配置server4、server5、server6三台服务器,并设置仲裁节点(PSA副本集),规划表如图

  2. 配置文件xxx.ini

json 复制代码
//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文件
json 复制代码
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. 启动脚本
json 复制代码
mkdir .\server4
mkdir .\server5
mkdir .\server6

start "MongoDB Server4" mongod --config=.\server4.ini 
start "MongoDB Server5" mongod --config=.\server5.ini
start "MongoDB Server6" mongod --config=.\server6.ini

start "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两个副本集之间没有任何关联。副本集是分布式集群中的一个基本单元。
相关推荐
倔强的石头_11 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
初次攀爬者4 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
AI全栈实验室4 天前
MongoDB迁移金仓踩了5个坑,最后一个差点回滚
mongodb
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端