MongoDB 单节点升级为副本集高可用集群(1主1从1仲裁)

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)
公众号:老苏畅谈运维
欢迎关注本人公众号,更多精彩与您分享。

一、项目背景

由于历史原因,生产环境中MongoDB使用的是单节点。但随着业务增长,考虑到这个同步业务的重要性,避免由于单节点故障造成业务停止,所以需要升级为副本集保证高可用。
下面这架构图是需要实现的MongoDB副本集高可用架构:
请添加图片描述
Relica Set副本集方式整体大概如图:
请添加图片描述

二、 升级架构前注意事项

在生产环境中,做单节点升级到集群前,一定要先备份好mongodb的所有数据,避免操作失误导致数据丢失。
并且在保证在升级期间不会有程序连接到MongoDB进行读写操作,建议停服务升级,且在凌晨业务低峰期,进行操作。

–使用mongodump进行全库备份

mongodump  -uroot -p123456 --port 27017 --authenticationDatabase admin -j 2 -o /media/backup/full/$(date +%Y%m%d)

三、 原单节点MongoDB配置信息

角色IP
单节点IP:10.10.10.45 端口:27017

该节点配置信息:

# cat /etc/mongod.conf |grep -v '^#'systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.logstorage:dbPath: /var/lib/mongojournal:enabled: trueprocessManagement:timeZoneInfo: /usr/share/zoneinfonet:port: 27017#bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.bindIp: 0.0.0.0

修改该配置文件增加副本集配置

# cat /etc/mongod.conf |grep -v '^#'systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.logstorage:dbPath: /var/lib/mongojournal:enabled: trueprocessManagement:timeZoneInfo: /usr/share/zoneinfonet:port: 27017#bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.bindIp: 0.0.0.0replication:oplogSizeMB: 4096replSetName: rs

四、新增节点信息

角色IP
新增从节点IP:10.10.10.46 端口:27017
新增仲裁节点IP:10.10.10.47 端口:27017

这两个节点配置文件,只需复制PRIMARY节点配置文件,并修改相应的 "bindIp"即可。
从节点配置:

# cat /etc/mongod.conf |grep -v '^#'systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.logstorage:dbPath: /var/lib/mongojournal:enabled: trueprocessManagement:timeZoneInfo: /usr/share/zoneinfonet:port: 27017#bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.bindIp: 0.0.0.0replication:oplogSizeMB: 4096replSetName: rs

仲裁节点配置:

# cat /etc/mongod.conf |grep -v '^#'systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.logstorage:dbPath: /var/lib/mongojournal:enabled: trueprocessManagement:timeZoneInfo: /usr/share/zoneinfonet:port: 27017#bindIp: 127.0.0.1  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.bindIp: 0.0.0.0replication:oplogSizeMB: 4096replSetName: rs

启动3个节点:要先启动PRIMARY节点,2个SECONDARY节点后面启动。

# systemctl start mongod

五、 初始化副本集

使用mongo shell连接到主节点,执行初始化命令

test> use admin
switched to db admin
admin> 
config = {_id : "rs", members : [{_id:0, host:"10.10.10.45:27017"},{_id:1, host:"10.10.10.46:27017"},{_id:2, host:"10.10.10.47:27017", arbiterOnly: true},]
}> rs.initiate(config)               //初始化副本集
{ ok: 1 }                          //返回ok:1成功,返回ok:0失败

在这里插入图片描述

• 查看集群状态信息

rs [direct: secondary] admin> rs.status()
{set: 'rs',date: ISODate('2024-07-06T08:56:17.985Z'),myState: 1,term: Long('1'),syncSourceHost: '',syncSourceId: -1,heartbeatIntervalMillis: Long('2000'),majorityVoteCount: 2,writeMajorityCount: 2,votingMembersCount: 3,writableVotingMembersCount: 2,optimes: {lastCommittedOpTime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },lastCommittedWallTime: ISODate('2024-07-06T08:56:09.745Z'),readConcernMajorityOpTime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },appliedOpTime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },durableOpTime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },lastAppliedWallTime: ISODate('2024-07-06T08:56:09.745Z'),lastDurableWallTime: ISODate('2024-07-06T08:56:09.745Z')},lastStableRecoveryTimestamp: Timestamp({ t: 1720256159, i: 1 }),electionCandidateMetrics: {lastElectionReason: 'electionTimeout',lastElectionDate: ISODate('2024-07-06T08:54:19.727Z'),electionTerm: Long('1'),lastCommittedOpTimeAtElection: { ts: Timestamp({ t: 1720256048, i: 1 }), t: Long('-1') },lastSeenOpTimeAtElection: { ts: Timestamp({ t: 1720256048, i: 1 }), t: Long('-1') },numVotesNeeded: 2,priorityAtElection: 1,electionTimeoutMillis: Long('10000'),numCatchUpOps: Long('0'),newTermStartDate: ISODate('2024-07-06T08:54:19.734Z'),wMajorityWriteAvailabilityDate: ISODate('2024-07-06T08:54:20.619Z')},members: [{_id: 0,name: '10.10.10.45:27017',health: 1,state: 1,stateStr: 'PRIMARY',uptime: 449,optime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },optimeDate: ISODate('2024-07-06T08:56:09.000Z'),lastAppliedWallTime: ISODate('2024-07-06T08:56:09.745Z'),lastDurableWallTime: ISODate('2024-07-06T08:56:09.745Z'),syncSourceHost: '',syncSourceId: -1,infoMessage: '',electionTime: Timestamp({ t: 1720256059, i: 1 }),electionDate: ISODate('2024-07-06T08:54:19.000Z'),configVersion: 1,configTerm: 1,self: true,lastHeartbeatMessage: ''},{_id: 1,name: '10.10.10.46:27017',health: 1,state: 2,stateStr: 'SECONDARY',uptime: 129,optime: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },optimeDurable: { ts: Timestamp({ t: 1720256169, i: 1 }), t: Long('1') },optimeDate: ISODate('2024-07-06T08:56:09.000Z'),optimeDurableDate: ISODate('2024-07-06T08:56:09.000Z'),lastAppliedWallTime: ISODate('2024-07-06T08:56:09.745Z'),lastDurableWallTime: ISODate('2024-07-06T08:56:09.745Z'),lastHeartbeat: ISODate('2024-07-06T08:56:17.775Z'),lastHeartbeatRecv: ISODate('2024-07-06T08:56:16.777Z'),pingMs: Long('0'),lastHeartbeatMessage: '',syncSourceHost: '10.10.10.45:27017',syncSourceId: 0,infoMessage: '',configVersion: 1,configTerm: 1},{_id: 2,name: '10.10.10.47:27017',health: 1,state: 7,stateStr: 'ARBITER',uptime: 129,lastHeartbeat: ISODate('2024-07-06T08:56:17.776Z'),lastHeartbeatRecv: ISODate('2024-07-06T08:56:17.775Z'),pingMs: Long('0'),lastHeartbeatMessage: '',syncSourceHost: '',syncSourceId: -1,infoMessage: '',configVersion: 1,configTerm: 1}],ok: 1,'$clusterTime': {clusterTime: Timestamp({ t: 1720256169, i: 1 }),signature: {hash: Binary.createFromBase64('AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0),keyId: Long('0')}},operationTime: Timestamp({ t: 1720256169, i: 1 })
}

查看从库延时信息

rs [direct: primary] admin> rs.printSecondaryReplicationInfo()
source: 10.10.10.46:27017
{syncedTo: 'Sat Jul 06 2024 16:57:29 GMT+0800 (China Standard Time)',replLag: '0 secs (0 hrs) behind the primary '
}

上面看到从库已经完全同步,没有延时。

六、测试数据

–主库插入数据

rs [direct: primary] admin> for(i=0;i<1000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6})};
DeprecationWarning: Collection.insert() is deprecated. Use insertOne, insertMany, or bulkWrite.
{acknowledged: true,insertedIds: { '0': ObjectId('6689087d597863336614a32f') }
}
rs [direct: primary] admin> show tables;
log
mycollection
system.keys
system.users
system.version

–从库上查看数据

rs [direct: secondary] admin> show tables;
log
mycollection
system.keys
system.users
system.version
rs [direct: secondary] admin> db.log.find().count()
1000

由此可以看出,主从节点数据同步正常。

关注我,学习更多数据库知识。
请添加图片描述

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

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

相关文章

leetcode力扣_排序问题

215.数组中的第K个最大元素 鉴于已经将之前学的排序算法忘得差不多了&#xff0c;只会一个冒泡排序法了&#xff0c;就写了一个冒牌排序法&#xff0c;将给的数组按照降序排列&#xff0c;然后取nums[k-1]就是题目要求的&#xff0c;但是提交之后对于有的示例显示”超出时间限制…

基于顺序表的通讯录实现

一、前言 基于已经学过的顺序表&#xff0c;可以实现一个简单的通讯录。 二、通讯录相关头文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

pycharm如何使用jupyter

目录 配置jupyter新建jupyter文件别人写的方法&#xff08;在pycharm种安装&#xff0c;在网页中使用&#xff09; pycharm专业版 配置jupyter 在pycharm终端启动一个conda虚拟环境&#xff0c;输入 conda install jupyter会有很多前置包需要安装&#xff1a; 新建jupyter…

VScode将界面语言设置为中文

1. 点击左侧的扩展图标&#xff0c;打开侧边栏“EXTENSIONS”面板。 2. 在搜索框中输入“Chinese”&#xff0c;查找出“中文简体”插件&#xff0c;点击“install”按钮。 3. 等待插件安装完成&#xff0c;点击右下角“restart”按钮&#xff0c;从而重新启动Vscode。

计算机网络——数据链路层(以太网扩展、虚拟局域网、高速以太网)

在许多情况下&#xff0c;我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展&#xff0c;然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。 在物理层扩展以太网 现在&#xff0c;扩展主机和集线器之间的距离的一种简单方法就是…

【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Enabling the distribution of interruptsGIC Distributor 中断组分发控制CPU Interface 中断组分发控制Physical LPIs 的启用Summary Enabling the distribution of interrupts 在ARM GICv3和GICv4体系结构中&#xff0c;中断分发…

python sklearn机械学习-数据预处理

&#x1f308;所属专栏&#xff1a;【机械学习】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言&#xff1a; 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失…

【Python】组合数据类型:序列,列表,元组,字典,集合

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️Python】 文章目录 前言组合数据类型序列类型序列常见的操作符列表列表操作len()append()insert()remove()index()sort()reverse()count() 元组三种序列类型的区别 集合类型四种操作符集合setfrozens…

Vue表单输入绑定v-model

表单输入绑定 在前端处理表单时&#xff0c;我们常常需要将表单输入框的内容同步给Javascript中相应的变量。手动连接绑定和更改事件监听器可能会很麻&#xff0c;v-model 指令帮我们简化了这一步骤。 <template><h3>表单输入绑定</h3><hr> <inpu…

C/C++连接MySQL

今天刚学习了MySQL,于是去尝试能否让C/C连接上MySQL,一番尝试后也是成功了&#xff0c;把经验分享给大家&#xff01; 1.首先我们需要找到MySQL所在的目录下&#xff0c;一般默认安装路径都在C:\Program Files\MySQL\MySQL Server 8.0下&#xff1b; 2.随后我们打开Visual Stu…

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下&#xff0c;其实订单服务是api服务&a…

“郭有才”商标主要类别都已被注册!

前阵山东网红“郭有才”火遍大江北&#xff0c;当然少不了许多想去申请注册“郭有才”商标名称的&#xff0c;普推商标知产老杨检索&#xff0c;发现“郭有才”商标申请了43个类别&#xff0c;基本上类别都被申请注册&#xff0c;已注册的商标大多是在“郭有才”火之前申请注册…

NDVI数据集提取植被覆盖度FVC

植被覆盖度FVC 植被覆盖度&#xff08;Foliage Vegetation Cover&#xff0c;FVC&#xff09;是指植被冠层覆盖地表的面积比例&#xff0c;通常用来描述一个区域内植被的茂密程度或生长状况。它是生态学、环境科学以及地理信息系统等领域的重要指标&#xff0c;对于理解地表能…

数据结构之“栈”(全方位认识)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 前言 栈是一种数据结构&#xff0c;具有" 后进先出 "的特点 或者也可见说是 ” 先进后出 “。大家一起加油吧冲冲冲&#xff01;&#xff01; …

react 项目中预防xss攻击的插件 dompurify

一、安装 $ yarn add dompurify $ yarn add --dev types/dompurify 二、使用 import DOMPurify from dompurify;// 1、处理&#xff1a; DOMPurify.sanitize(htmlContent)// 2、之后放进 dangerouslySetInnerHTML dangerouslySetInnerHTML{{ __html: cleanHTML }} 如&#…

Android Studio Run窗口中文乱码解决办法

Android Studio Run窗口中文乱码解决办法 问题描述&#xff1a; AndroidStudio 编译项目时Run窗口中文乱码&#xff0c;如图&#xff1a; 解决方法&#xff1a; 依次打开菜单&#xff1a;Help--Edit Custom VM Options&#xff0c;打开studio64.exe.vmoptions编辑框&#xf…

c/c++ 程序运行的过程分析

c/c编译基础知识 GNU GNU&#xff08;GNU’s Not Unix!&#xff09;是一个由理查德斯托曼&#xff08;Richard Stallman&#xff09;在1983年发起的自由软件项目&#xff0c;旨在创建一个完全自由的操作系统&#xff0c;包括操作系统的内核、编译器、工具、库、文本编辑器、邮…

ROS——坐标系管理、监听与广播、常用可视化工具

坐标系管理 TF功能包 小海龟追踪实验 ros版本(20.04)的tf安装命令: sudo apt-get install ros-noetic-turtle-tf 解决因python版本出现的无法生成跟随海龟&#xff1a; sudo ln -s /usr/bin/python3 /usr/bin/python ( -s 软链接,符号链接) ln命令&#xff08;英文全拼&#…

7 动态规划

下面的例子不错&#xff1a; 对于动态规划&#xff0c;能学到不少东西&#xff1b; 你要清楚每一步都在做什么&#xff0c;划分细致就能够拆解清楚&#xff01; xk. - 力扣&#xff08;LeetCode&#xff09; labuladong的算法笔记-动态规划-CSDN博客 动态规划是一种强大的算法…