【mongodb】mongodb副本集的搭建和使用

news2024/9/21 20:35:56

 本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》暂未更新

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

 

一、副本集的搭建

0.介绍副本集

#官网的参考地址
https://docs.mongodb.com/manual/replication/
​
# Mongodb副本集介绍:
Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。
Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,实现数据的高可用。
​
# 副本集作用:
数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
读写分离,读的请求分流到副本上,减轻主节点的读压力。
​
# 副本集角色介绍:
主节点(Primary)
接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。
默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。
​
副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
​
仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
​
# 注意:
在PSS典型架构中(Replica Set)节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策。
在PSA架构中,需要偶数个数据节点,加一个Arbiter构成的Replica Set
  • PSS 典型副本集架构(读写操作都由主处理,从只负责同步)

img

  • PSA(Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set)

img

1.创建多实例目录

[root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p

2.编辑多实例配置文件

[root@redis03 ~]# vim /server/mongodb/28017/conf/mongo.conf
systemLog:
  destination: file
  logAppend: true
  path: /server/mongodb/28017/logs/mongodb.log
  #path: /server/mongodb/28018/logs/mongodb.log
  #path: /server/mongodb/28019/logs/mongodb.log
​
storage:
  journal:
    enabled: true
  dbPath: /server/mongodb/28017/data
  #dbPath: /server/mongodb/28018/data
  #dbPath: /server/mongodb/28019/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
​
processManagement:
  fork: true
  pidFilePath: /server/mongodb/28017/pid/mongod.pid
  #pidFilePath: /server/mongodb/28018/pid/mongod.pid
  #pidFilePath: /server/mongodb/28019/pid/mongod.pid
​
net:
  port: 28017
  #port: 28018
  #port: 28019
  bindIp: 127.0.0.1,10.0.0.93
  
replication:
  #类似于binlog,指定大小
  oplogSizeMB: 1024
  #副本记得名称,集群名称
  replSetName: dba

3.启动多实例

[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
​
[mongo@redis03 ~]$ mongod -f /server/mongodb/28017/conf/mongo.conf
[mongo@redis03 ~]$ mongod -f /server/mongodb/28018/conf/mongo.conf
[mongo@redis03 ~]$ mongod -f /server/mongodb/28019/conf/mongo.conf
​
#验证
[mongo@redis03 ~]$ netstat -lntp       
tcp        0      0 10.0.0.93:28017         0.0.0.0:*               LISTEN      32893/mongod        
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      32893/mongod        
tcp        0      0 10.0.0.93:28018         0.0.0.0:*               LISTEN      32938/mongod        
tcp        0      0 127.0.0.1:28018         0.0.0.0:*               LISTEN      32938/mongod        
tcp        0      0 10.0.0.93:28019         0.0.0.0:*               LISTEN      32981/mongod        
tcp        0      0 127.0.0.1:28019         0.0.0.0:*               LISTEN      32981/mongod

4.登录多实例

[mongo@redis03 ~]$ mongo 10.0.0.93:28017
[mongo@redis03 ~]$ mongo 10.0.0.93:28018
[mongo@redis03 ~]$ mongo 10.0.0.93:28019

5.初始化副本集

#配置副本集
config = {
  _id : "dba", 
  members : [
    {_id:0, host:"10.0.0.93:28017"},
    {_id:1, host:"10.0.0.93:28018"},
    {_id:2, host:"10.0.0.93:28019"},
  ]
}
​
复制集通过 replSetInitiate 命令或 rs.initiate() 命令进行初始化。
初始化后各个成员间开始发送心跳消息,并发起 Primary 选举操作,获得大多数成员投票支持的节点,会成为 Primary,其余节点成为 Secondary。
#读取副本集
rs.initiate(config) 

6.查看副本集状态

dba:PRIMARY> rs.status()
            #健康状态 1表示正常 0表示故障
            "health" : 1,
            #表示状态 1是主库 2是从库 3表示恢复数据中 7表示投票者 8表示down机
            "state" : 1,
            #标注是主库还是从库
            "stateStr" : "PRIMARY",
            #集群启动时间
            "uptime" : 579,
            #另一种格式的时间
            "optime" : {
                "ts" : Timestamp(1590593779, 1),
                "t" : NumberLong(1)
            },
            #上一次心跳传过来数据的时间
            "optimeDate" : ISODate("2020-05-27T15:36:19Z"),
            #检测上一次心跳时间
            "lastHeartbeat" : ISODate("2020-05-27T15:36:25.815Z"),
            
#查看集群与主节点
dba:PRIMARY> rs.isMaster()
​
#oplog信息
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1024MB
log length start to end: 1543secs (0.43hrs)
oplog first event time:  Wed May 27 2020 23:26:46 GMT+0800 (CST)
oplog last event time:   Wed May 27 2020 23:52:29 GMT+0800 (CST)
now:                     Wed May 27 2020 23:52:38 GMT+0800 (CST)
​
#查看延时从库信息
dba:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.0.0.93:28018
    syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
source: 10.0.0.93:28019
    syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
    
#打印副本集配置文件
dba:PRIMARY> rs.config()

7.主库创建数据,从库查看数据

#主库插入数据
db.table.insertMany([{"name":"gcc","age":10},{"name":"zzy","age":9},{"name":"hxh","age":11}])
#主库查看数据
dba:PRIMARY> show tables
table
dba:PRIMARY> db.table.find()
​
#从库查看数据
dba:SECONDARY> show databases
2020-05-27T23:43:40.020+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "operationTime" : Timestamp(1590594219, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590594219, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} 
#连查看库都会被拒绝,因为从库不提供读写
​
#执行命令(从库都要执行)
dba:SECONDARY> rs.slaveOk()
dba:SECONDARY> show databases
admin    0.000GB
cluster  0.000GB
config   0.000GB
local    0.000GB
​
#每次重新连接都要执行以上命令才能读取
#可以配置永久生效
[root@redis03 ~]# vim ~/.mongorc.js
rs.slaveOk()

二、副本集实现高可用

1.故障切换测试

#主库使用 localhost 连接,执行关闭数据库的操作(使用ip连接是不能执行的)
[root@db01 ~]# mongod -f /server/mongodb/28018/conf/mongo.conf --shutdown

#查看其他从库中会有一台从库,变成主库

#故障转移实现了,但是我的程序连接mongodb的配置还需要修改怎么办??

2.程序怎么实现连接切换的

1.如果使用的是单节点,那么程序里面直接配置写死mongodb的ip和端口即可

2.如果是副本集集群的形式,在程序里面写的就是一个列表,列表里面写
    mongo_reip=[10.0.0.91:28017,10.0.0.92:28018,10.0.0.93:29019]
    程序会去使用命令询问谁是主节点,得到结果后在写入数据

3.恢复主库

#重新启动主库,他会自动判断谁是主库,自动成为新的从库

#注意:三台节点,只能坏一台,坏两台就有问题了

4.指定节点提升优先级

#原来的主库配置高,性能好,想恢复之后还让他是主库怎么办

#查看优先级
dba:PRIMARY> rs.conf()
            #权重值
            "priority" : 1,
            
#临时修改配置文件
dba:PRIMARY> config=rs.conf()
#修改配置文件中 id 为0 的priority值为10
dba:PRIMARY> config.members[0].priority=10
#配置文件生效
dba:PRIMARY> rs.reconfig(config)

#新版本调整完直接切换主库,旧版本需要主动降级
dba:PRIMARY> rs.stepDown()

#恢复权重
dba:PRIMARY> config=rs.conf()
dba:PRIMARY> config.members[0].priority=1
dba:PRIMARY> rs.reconfig(config)

三、扩容与删减节点

1.配置一台新的节点

#创建目录
[root@redis03 ~]# mkdir /server/mongodb/28016/{conf,logs,pid,data} -p

#配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28016/conf/
[root@redis03 ~]# sed -i 's#28017#28016#g' /server/mongodb/28016/conf/mongo.conf 

#启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28016/conf/mongo.conf

2.将新节点加入集群

#主库操作
dba:PRIMARY> rs.add("10.0.0.93:28016")
{
    "ok" : 1,
    "operationTime" : Timestamp(1590597530, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590597530, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

#查看集群状态
dba:PRIMARY> rs.status()

#注意:四个节点也不能坏两台机器

3.删除节点

#主库操作
dba:PRIMARY> rs.remove("10.0.0.93:28016")
{
    "ok" : 1,
    "operationTime" : Timestamp(1590597842, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590597842, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

#查看集群状态
dba:PRIMARY> rs.status()

4.添加仲裁节点

# 仲裁节点说明:
不存储数据,只进行选主。

#创建目录
[root@redis03 ~]# mkdir /server/mongodb/28015/{conf,logs,pid,data} -p

#配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28015/conf/
[root@redis03 ~]# sed -i 's#28017#28015#g' /server/mongodb/28015/conf/mongo.conf 

#启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28015/conf/mongo.conf 

#主库操作加入仲裁节点
dba:PRIMARY> rs.addArb(("10.0.0.93:28015")

#查看该库是否有数据

#注意,五个节点时,可以坏两个节点

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

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

相关文章

连锁门店收银系统源码

近年来,随着移动互联网的快速发展,越来越多的企业开始注重私域流量的积累和管理。尤其针对连锁零售门店尤为重要。自然对收银系统的要求也越来越多,要有丰富的营销活动来助力商户玩转私域营销。今天一起来看看收银系统需要具备哪些营销功能吧…

【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例

目录 C语言进制转换详解精讲文章重点内容汇总表格1. 进制概念基础1.1 二进制(Binary)1.2 十进制(Decimal)1.3 八进制(Octal)1.4 十六进制(Hexadecimal) 2. 进制之间的相互转换2.1 十…

云WAF最新动态追踪,为您的网络安全防护加码升级!

技术创新引领防护升级 近年来,各大云运营商纷纷推出了基于人工智能和机器学习技术的增强型 WAF,能够在毫秒级内准确识别和抵御 OWASP排名前10的网络安全威胁,其中包括最近出现的各种病毒,保护效率和智能程度都提高到一个新的层次…

遗传算法与深度学习实战——生命模拟及其应用

遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然…

两种字符串有什么区别——字符数组和字符串,初步认识STL

两种字符串有什么区别——字符数组和字符串,初步认识STL 1.字符数组1.1.基础语法介绍1.2.例题1——自动修正题目描述输入格式输出格式输入输出样例输入 #1输出 #1 1.3.另解——getchar和putchar函数1.4.字符数组相关函数 2.字符串2.1.字符串简介和基础功能2.2.例题2…

MATLAB(6)水纹碰撞覆盖地形

前言 在MATLAB中模拟水纹(如水波)碰撞并覆盖地形的效果涉及到几个复杂的步骤,包括地形的生成、水波的模拟(通常使用波动方程)以及两者的交互。下面我将给出一个简化的示例,展示如何在MATLAB中创建一个基本的…

学琴笔记

1-初级钢琴入门课程介绍_哔哩哔哩_bilibili 一些乐理记录: 1.5:

大语言模型稀疏水印技术

面对大型语言模型(LLMs)在假新闻制造与作弊方面的潜在风险,研究者提出了稀疏水印(Sparse Watermark)——种创新的文本水印技术,旨在监测和追溯LLMs生成的内容。不同于传统水印方法在可检测性与文本质量间的…

CI522一款电动车仪表NFC开发方案

电动车NFC一键启动 NFC智能刷卡解锁,为你解决四处寻找钥匙的困扰,提升电动车智能化。 Ci522是一款高度集成的13.56MHz非接触式读写器芯片,专为电动车NFC一键启动系统(包括仪表总成和电源锁)而设计。这款芯片支持ISO/IE…

Python基础教程(一)

1.编程基础 1.1标识符 标识符是变量、函数、模块和其他对象的名称。Python中标识符的命名不是随意的,而是要遵守一定的命名规则,比如说: 1、标识符是由字母 (A~Z 和 a~z) 、下划线和数字组成,但第一个字符不 能是数字。 2、标识符不…

jmeter-beanshell学习14-字符串替换

前面做断言的时候,会记录各种失败信息,比如:“失败原因1,失败原因2,失败原因3”,中间英文逗号隔开,最后写失败报告的时候,再根据英文逗号,写到不同行 即使不分行,写csv文件&#xff…

一文学会CUDA编程:深入了解CUDA编程与架构(一)

前言: CUDA(Compute Unified Device Architecture,统一计算设备架构)是由NVIDIA公司开发的一种并行计算平台和编程模型。CUDA于2006年发布,旨在通过图形处理器(GPU)解决复杂的计算问题。在早期…

x264 环路滤波原理系列:x264_macroblock_deblock_strength 函数

x264_macroblock_deblock_strength 函数 功能:计算去块滤波强度值,去块强度值决定了去块滤波器对像素值调整的程度。这些值通常基于以下因素:量化参数(QP):较高的QP值可能导致更强烈的去块;宏块的纹理复杂度:具有更复杂纹理的宏块可能需要更细致的去块处理;宏块的类型…

选项卡切换组件容器的实例

实现效果 点击选项卡A、B、C、D、E分别控制组件容器内各个形状组件的显隐。 实现流程 首先需要选择组件容器内的形状组件,默认实例是3个,如需添加多个可在数据中继续添加。 添加【选项卡】组件,在样式中设置5列,数据添加一列&am…

Jupyter Notebook无法自动打开浏览器解决方案

Step1: 在C盘(默认C盘),找到用户文件夹 Step2: 打开用户文件夹,找到自己的“电脑名”文件夹 Step3: 打开“电脑名”文件夹,找到“.jupyter”文件夹 Step4: 打开“.ju…

猫头虎分享:9个实用的GPT-4o提示词

🎉 猫头虎分享:9个实用的GPT-4o提示词 摘要 在这篇文章中,猫头虎将与大家分享9个非常实用的GPT-4o提示词。这些提示词涵盖了从草图到App代码生成、通用网络爬虫到求职助理等多个领域。我们将深入探讨如何利用这些提示词提升工作效率和创作能…

【前端 · 面试 】HTTP 总结(十)—— HTTP 缓存应用

最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。 争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。 前端面试http总结.012 前言 通过前面几篇内容…

2024宁波工业装备博览会-相聚12月

2024宁波工业装备博览会-相聚12月 时间:2024年12月2-4日 地点:宁波国际会展中心 2024中国(宁波)工业装备博览会展出面积、展品内容在不断扩大,专业观众成倍增加,极大地推动宁波智能制造产业的国际交流及贸易市场的发展。展会不…

企业如何通过有效的库存管理来降低库存成本?

企业如何通过有效的库存管理来降低库存成本? 那么如何在满足市场需求的同时,最大限度地减少资金占用、降低仓储成本、避免库存积压与损耗呢? 这个问题很好回答,本文我想带你了解WMS仓库管理系统,其能够有效并精准的帮…

选择最佳SOLIDWORKS服务商:您的成功之钥

在当今快速发展的制造业环境中,选择合适的SOLIDWORKS服务商对于确保您的项目成功至关重要。无论是初次接触SOLIDWORKS还是希望提升现有的设计流程,找到一位可靠的服务商都能为您提供所需的技术支持和服务。本文将帮助您了解如何选择最佳的SOLIDWORKS服务…