首页 > 数据库 >NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)

时间:2022-12-21 23:34:39浏览次数:39  
标签:userName ObjectId -- MongoDB 数据库 age Enterprise id


MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)

  • ​​前言​​
  • ​​一、什么是MongoDB复制集 ?​​
  • ​​二、MongoDB复制集 架构设计​​
  • ​​三、MongoDB复制集 实战案例​​
  • ​​1、MongoDB复制集部署​​
  • ​​2、模拟master故障,实现故障转移、故障恢复​​

前言

本环境是基于 Centos 7.8 系统构建mongodb-enterprise-4.2.8学习环境
具体构建,请参考 ​​mongodb-enterprise-4.2.8 环境构建​​

MongoDB复制是将数据同步到多个服务器的过程;复制集提供了数据的冗余备份并提高了数据的可用性,通常可以保证数据的安全性;复制集还允许技术人员从硬件故障和服务中断中恢复数据。


一、什么是MongoDB复制集 ?

什么是复制集

  • 保障数据的安全性
  • 数据的冗余、备份
  • 数据高可用性 (24*7)
  • 灾难恢复
  • 无需停机维护(如备份,重建索引,压缩)
  • 分布式读取数据
  • 副本集对应用层是透明的(相对于终端用户)

MongoDB复制集 工作原理

  • 1、mongodb的复制集至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。
  • 2、mongodb各个节点常见的搭配方式为:一主一从、一主多从。
  • 3、主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致

二、MongoDB复制集 架构设计

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_MongoDB复制集


MongoDB 复制集的特点

  • N 个节点的集群
  • 任何节点可作为主节点
  • 所有写入操作都在主节点上
  • 自动故障转移
  • 自动恢复

三、MongoDB复制集 实战案例

1、MongoDB复制集部署

环境准备

role

host

ip

mongodb-version

master

node01

192.168.5.11

mongodb-enterprise-4.2.8

slave1

node02

192.168.5.12

mongodb-enterprise-4.2.8

slave2

node03

192.168.5.13

mongodb-enterprise-4.2.8

修改MongoDB配置文件

# 所有节点修改
--- node01
[root@node01 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.11
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node01 ~]# systemctl restart mongod

--- node02
[root@node02 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.12
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node02 ~]# systemctl restart mongod

--- node03
[root@node03 ~]# vim /etc/mongod.conf
net:
port: 27017
bindIp: 127.0.0.1,192.168.5.13
replication:
oplogSizeMB: 1024
replSetName: myRs
[root@node03 ~]# systemctl restart mongod

配置主节点

# 登录MongoDB
[root@node01 ~]# mongo
MongoDB shell version v4.2.8

# 查看ReplSet状态
MongoDB Enterprise > rs.status()
{
"operationTime" : Timestamp(0, 0),
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized",
"$clusterTime" : {
"clusterTime" : Timestamp(0, 0),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}

# 初始化ReplSet复制集
MongoDB Enterprise > rs.initiate({_id:'myRS',members:[{_id:1,host:'192.168.5.11:27017'}]})
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1613533287, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1613533287, 1)
}

再次查看ReplSet状态

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_数据库_02


主上增加从节点

MongoDB Enterprise myRS:PRIMARY> rs.add('192.168.5.12:27017','192.168.5.13:27017')
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1613534429, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1613534429, 1)
}

查看ReplSet状态

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_MongoDB_03

主节点插入数据,测试主从同步

主插入数据

# 插入数据
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test

MongoDB Enterprise myRS:PRIMARY> for(var i =0; i <4; i ++){db.user.insert({userName:'my'+i,age:i})}
WriteResult({ "nInserted" : 1 })

# 查看数据
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{ "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }

slave01查看

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_MongoDB_04

slave02查看

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_NoSQL_05


MongoDB复制集成功!!!

2、模拟master故障,实现故障转移、故障恢复

模拟关闭主节点

MongoDB Enterprise myRS:PRIMARY> use admin
switched to db admin
MongoDB Enterprise myRS:PRIMARY> db.shutdownServer()
2021-02-17T12:30:51.021+0800 I NETWORK [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
server should be down...
2021-02-17T12:30:51.038+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.038+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
2021-02-17T12:30:51.042+0800 I NETWORK [js] trying reconnect to 127.0.0.1:27017 failed
2021-02-17T12:30:51.042+0800 I NETWORK [js] reconnect 127.0.0.1:27017 failed failed
MongoDB Enterprise >

node03查看

node02切换为master

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_数据库_06


node02查看插入三条记录

[root@node02 ~]# mongo
MongoDB shell version v4.2.8
MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =4; i <7; i ++){db.user.insert({userName:'my'+i,age:i})}
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{ "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }

node03查看

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_数据库_07


启动master

[root@node01 ~]# systemctl start mongod
[root@node01 ~]# systemctl is-active mongod
active

node03查看主从状态

node01已经切换到salve状态

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_MongoDB_08


node02再次插入三条数据

MongoDB Enterprise myRS:PRIMARY> use test
switched to db test
MongoDB Enterprise myRS:PRIMARY> for(var i =7; i <10; i ++){db.user.insert({userName:'my'+i,age:i})}
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise myRS:PRIMARY> db.user.find()
{ "_id" : ObjectId("602c98c21b314e8e6e90e15a"), "userName" : "my0", "age" : 0 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15b"), "userName" : "my1", "age" : 1 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15c"), "userName" : "my2", "age" : 2 }
{ "_id" : ObjectId("602c98c21b314e8e6e90e15d"), "userName" : "my3", "age" : 3 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e15"), "userName" : "my4", "age" : 4 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e16"), "userName" : "my5", "age" : 5 }
{ "_id" : ObjectId("602c9d4a2db6914f63068e17"), "userName" : "my6", "age" : 6 }
{ "_id" : ObjectId("602c9f71912509e6bd44076c"), "userName" : "my7", "age" : 7 }
{ "_id" : ObjectId("602c9f71912509e6bd44076d"), "userName" : "my8", "age" : 8 }
{ "_id" : ObjectId("602c9f71912509e6bd44076e"), "userName" : "my9", "age" : 9 }

node01查看数据

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_MongoDB_09

node03查看数据

NoSQL 数据库案例实战 --MongoDB 数据库高可用解决方案 -- MongoDB复制集(主从复制)_运维_10

故障切换、故障恢复成功实现!!!


标签:userName,ObjectId,--,MongoDB,数据库,age,Enterprise,id
From: https://blog.51cto.com/u_14904176/5960228

相关文章

  • RHCSA-2学习摘要
     Liunx发行版本(1)RHEL----红帽公司(2)CentOS----红帽系统(3)Fedora----红帽系统(4)openSUSE----德国厂商(5)Gentoo----操作比较发杂(6)Debian(7)Ubuntu国产发行版本:RedFlag中标深度 ......
  • 华为云会议,助力企业高效办公
      需要开的“突袭式会议”越来越多,如何在第一时间将大家快速组织起来,并聚焦解决问题非常重要。一个好的视频会议系统可以起到事半功倍的效果,让视频会议变得更加高效。 ......
  • #yyds干货盘点#【愚公系列】2022年12月 微信小程序-three.js绘制球体
    前言Three.js是一款运行在浏览器中的3D引擎,你可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。一个典型的Three.js程序至少要包括渲染器(Renderer)、场......
  • 华为云会议——安全得多,高效得很
      如今,云会议不断被企业使用,已成为企业高频刚需的数字化协作基础服务。华为云会议是基于云架构的多方视频会议服务平台,用云原生的方式将华为将近30年在视频通信领域的技术......
  • 51. 小蜜蜂
    51.小蜜蜂一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从1号格子可以爬到2号或者3号格子,从2号则可以爬到3号或......
  • 华为云会议,更专业“会”更好
      随着企业数字化进程的加速,尤其疫情以来,更多用户通过在线会议等方式满足了一定场景下的沟通需求。远程办公的习惯逐渐被培养起来,沟通已经从传统会议室延伸到各种区域和各......
  • 华为云会议,让会议更智能
      近几年,在数字经济的推动下,企业上云增速持续扩大。特别是自疫情爆发以来,视频会议已进入云时代。云会议已经成为当今企业日常办公的刚需。  而华为拥有30年的音频技术......
  • 小游戏进入增长快车道,行业变现模式分析
    根据《2022微信小游戏增长白皮书》显示,目前微信小游戏开发者数量已经超过10万人次,特别是在持续出现小游戏爆火社交平台的趋势下,小游戏发展势头强劲。此外仅看微信小游戏的商......
  • YonBuilder移动开发平台功能大盘点
        YonBuilder是面向企业组织和个人开发者的低代码开发平台,实现无代码、低代码、专业代码开发三种模式。提供元数据驱动和画布构建两种开发方式,通过点击拖拽+自动化代......
  • Forexclub认为针对俄的天然气价格上限可能只是摆设
    欧盟能源监管机构合作署(ACER)负责人告诉英国《金融时报》,欧盟对天然气的价格上限是一个未经测试的工具,可能无法阻止欧洲家庭和企业的天然气价格飙升,可能只是摆设。......