利用三个云服务器,搭建MongoDB副本集模式(主从模式)

news2024/11/15 11:47:41

1. 下载安装mongoDB

首先我们需要在三台服务器上分别下载和安装mongoDB。

1.1. 打开服务器,创建目录

创建目录结构如下图所示:(日志文件会自动创建)
在这里插入图片描述

1.2. 下载mongoDB压缩包

把压缩包下载到指定目录(便于后期维护管理),然后解压。
在这里插入图片描述
相关命令参考菜鸟教程

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz    # 下载
tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz                                    # 解压

mv mongodb-src-r4.2.8  /usr/local/mongodb4                          # 将解压包拷贝到指定目录

1.3. 配置文件

把配置文件下载到指定目录(便于后期维护管理)。
在这里插入图片描述
配置文件内容如下:

systemLog: 
    #MongoDB发送所有日志输出的目标指定为文件 
    destination: file 
    #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 
    path: "/root/mongoDB/myrs_27017/log/mongod.log" 
    #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 
    logAppend: true 
storage: 
    #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 
    dbPath: "/root/mongoDB/myrs_27017/data/db" 
    journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 
        enabled: true 
processManagement: 
    #启用在后台运行mongos或mongod进程的守护进程模式。 
    fork: true 
    #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID 
    pidFilePath: "/root/mongoDB/myrs_27017/log/mongod.pid" 
net:
    #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip 
    #bindIpAll: true 
    #服务实例绑定的IP 
    # 0.0.0.0 表示所有ip都能访问
    bindIp: 0.0.0.0
    #绑定的端口 
    port: 27017 
replication: 
    #副本集的名称 
    replSetName: myrs

其他配置信息可参考官方文档。

2. 开启服务器端口和安全组

Centos7开放及查看端口
(PS:别忘了开安全组(有的云服务器运营商中也称之为防火墙)中的端口)

3. 启动mongoDB并且进行连接

3.1. 根据配置文件,启动三个mongoDB

如下图所示,分别进入三个服务器的
/root/mongoDB/mongodb-linux-x86_64-4.0.10/bin
目录,然后执行
./mongod -f /root/mongoDB/myrs_27017/mongod.conf
在这里插入图片描述
(上述mongodb-linux-x86_64-4.0.10为文件名,自行修改)

3.2. 进入mongoDB,将三个数据库进行绑定

任意进入一个服务器,执行(0.0.0.0替换为自己服务器的外网ip,该ip可以是其他服务器的,不过这里推荐使用当前服务器的外网ip)

./mongo --host=0.0.0.0 --port=27017

3.2.1. 初始化新的副本集

rs.initiate()

在这里插入图片描述
1)“ok”的值为1,说明创建成功。
2)命令行提示符发生变化,变成了一个从节点角色,此时默认不能读写。稍等片刻,回车,变成主节点。

3.2.2. 查看副本集的配置内容

说明:
返回包含当前副本集配置的文档。

rs.conf()
myrs:PRIMARY> rs.conf()
{
        "_id" : "myrs",
        "version" : 1,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [
                {
                        "_id" : 0,
                        "host" : "VM-4-16-centos:27017",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 1,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 1
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("64362b90f9a5fe8e25868131")
        }
}

说明:
1) "_id" : "myrs" :副本集的配置数据存储的主键值,默认就是副本集的名字
2) "members" :副本集成员数组,此时只有一个: "host" : "180.76.159.126:27017"
该成员不是仲裁节点:"arbiterOnly" : false
优先级(权重值):"priority" : 1,
3) "settings" :副本集的参数配置。

提示:副本集配置的查看命令,本质是查询的是system.replset的表中的数据:

myrs:PRIMARY> use local 
switched to db local 
myrs:PRIMARY> show collections 
oplog.rs 
replset.election 
replset.minvalid 
replset.oplogTruncateAfterPoint 
startup_log 
system.replset 
system.rollback.id 
myrs:PRIMARY> db.system.replset.find() 
{ "_id" : "myrs", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "180.76.159.126:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5d539bdcd6a308e600d126bb") } } 
myrs:PRIMARY>

3.2.3. 查看副本集状态

说明:
返回包含状态信息的文档。此输出使用从副本集的其他成员发送的心跳包中获得的数据反映副本集的当前状态。

rs.status()
myrs:PRIMARY> rs.status()
{
        "set" : "myrs",
        "date" : ISODate("2023-04-12T03:55:20.107Z"),
        "myState" : 1,
        "term" : NumberLong(1),
        "syncingTo" : "",
        "syncSourceHost" : "",
        "syncSourceId" : -1,
        "heartbeatIntervalMillis" : NumberLong(2000),
        "optimes" : {
                "lastCommittedOpTime" : {
                        "ts" : Timestamp(1681271718, 1),
                        "t" : NumberLong(1)
                },
                "readConcernMajorityOpTime" : {
                        "ts" : Timestamp(1681271718, 1),
                        "t" : NumberLong(1)
                },
                "appliedOpTime" : {
                        "ts" : Timestamp(1681271718, 1),
                        "t" : NumberLong(1)
                },
                "durableOpTime" : {
                        "ts" : Timestamp(1681271718, 1),
                        "t" : NumberLong(1)
                }
        },
        "lastStableCheckpointTimestamp" : Timestamp(1681271698, 4),
        "members" : [
                {
                        "_id" : 0,
                        "name" : "VM-4-16-centos:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 436,
                        "optime" : {
                                "ts" : Timestamp(1681271718, 1),
                                "t" : NumberLong(1)
                        },
                        "optimeDate" : ISODate("2023-04-12T03:55:18Z"),
                        "syncingTo" : "",
                        "syncSourceHost" : "",
                        "syncSourceId" : -1,
                        "infoMessage" : "could not find member to sync from",
                        "electionTime" : Timestamp(1681271696, 2),
                        "electionDate" : ISODate("2023-04-12T03:54:56Z"),
                        "configVersion" : 1,
                        "self" : true,
                        "lastHeartbeatMessage" : ""
                }
        ],
        "ok" : 1,
        "operationTime" : Timestamp(1681271718, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1681271718, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

说明:
1)"set" : "myrs":副本集的名字
2) "myState" : 1:说明状态正常
3) "members" :副本集成员数组,此时只有一个: "name" : "180.76.159.126:27017" ,该成员的角色是 "stateStr" : "PRIMARY", 该节点是健康的: "health" : 1

3.2.4. 添加副本从节点

rs.add("ip:27017")

添加之后再执行rs.status()发现从节点的状态不对劲
在这里插入图片描述
并且查看主节点所在服务器中的日志会发现,基本上每秒会产生1m错误日志。
在这里插入图片描述
后面发现这里的错误日志如下

2023-04-12T10:42:14.196+0800 I ASIO     [Replication] Failed to connect to VM-8-4-centos:27017 - HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.196+0800 I CONNPOOL [Replication] Dropping all pooled connections to VM-8-4-centos:27017 due to HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.196+0800 I REPL_HB  [replexec-2] Error in heartbeat (requestId: 96554) to VM-8-4-centos:27017, response status: HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.196+0800 I ASIO     [Replication] Connecting to VM-8-4-centos:27017
2023-04-12T10:42:14.197+0800 I ASIO     [Replication] Failed to connect to VM-8-4-centos:27017 - HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.197+0800 I CONNPOOL [Replication] Dropping all pooled connections to VM-8-4-centos:27017 due to HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.197+0800 I REPL_HB  [replexec-1] Error in heartbeat (requestId: 96555) to VM-8-4-centos:27017, response status: HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.197+0800 I ASIO     [Replication] Connecting to VM-8-4-centos:27017
2023-04-12T10:42:14.198+0800 I ASIO     [Replication] Failed to connect to VM-8-4-centos:27017 - HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.198+0800 I CONNPOOL [Replication] Dropping all pooled connections to VM-8-4-centos:27017 due to HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.198+0800 I REPL_HB  [replexec-2] Error in heartbeat (requestId: 96556) to VM-8-4-centos:27017, response status: HostUnreachable: Error connecting to VM-8-4-centos:27017 :: caused by :: Could not find address for VM-8-4-centos:27017: SocketException: Host not found (authoritative)
2023-04-12T10:42:14.198+0800 I ASIO     [Replication] Connecting to VM-8-4-centos:27017

这里直接每0.001秒产生四条日志。。。
通过日志可以发现,主要错误的地方是我们初始化第一个结点时,结点的host不对劲,导致连接失败。
因此以此执行下列命令,修改一下第一个结点的host即可。
(ip改为自己这个服务器的外网ip)

>cfg = rs.conf()
>cfg.members[0].host = "ip:27017"
>rs.reconfig(cfg)

通过rs.conf()可查看修改前后的变化。
在这里插入图片描述
再执行rs.status()可发现从节点的状态正常了。
在这里插入图片描述

3.2.5. 添加仲裁从节点

rs.addArb("ip:27017")

执行rs.status()可发现,添加成功且状态正常。
在这里插入图片描述

4. 期间可能遇到的问题

4.1. 结点"name"中ip地址为内网ip,导致副本集之间连接失败。

>cfg = rs.conf()
>cfg.members[0].host = "ip:27017"
>rs.reconfig(cfg)

4.2. 强制将从节点升级为主节点

4.1.同理,

>cfg=rs.conf()
>cfg.members=[cfg.members[0]]
>rs.reconfig(cfg, {force: true});
>rs.status()

4.3. 不小心初始化了两个主节点

将其中一个主节点的mongoDB数据库进程kill掉,然后删掉db和log文件夹下的文件,再重新执行上述流程。

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

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

相关文章

ChatGPT大规模封号+停止注册?最火概念会凉吗?

一、背景 这个周末,先是意大利暂时封杀ChatGPT,限制OpenAI处理本国用户信息。 接着,据韩国媒体报道,三星导入ChatGPT不到20天,便曝出机密资料外泄(涉及半导体设备测量资料、产品良率等内容,已…

微信小程序 | 秋招颗粒无收 ?快用ChatGPT做一款模拟面试小程序

Pre:效果预览 ① 选择职位进行面试 ② 根据岗位职责进行回答 一、需求背景 这两年IT互联网行业进入寒冬期,降本增效、互联网毕业、暂停校招岗位的招聘,各类裁员、缩招的情况层出不穷!对于这个市场来说,在经历了互联网…

阿里云的客服 锻炼你心性的 一种方式 !!!

阿里云的产品,非常棒,开发的同学非常棒,专家们更棒,但,一切的开始就怕一个但字,但我还的说,但,阿里云的客服,OMG ,我已经忍耐了 1年了,是在忍不住…

手麻系统源码,手术麻醉管理系统源码,维护方便,功能强大

手术麻醉管理系统源码,手麻系统源码,C# .net 桌面软件 C/S版 文末获取联系! 手术麻醉管理系统采用下拉式汉化菜单,界面友好,实用性强,设有与住院、病区、药房等系统的软件接口。 开发语言:C# …

代码随想录算法训练营第五十三天 | 1143. 最长公共子序列、1035. 不相交的线、53. 最大子数组和

1143. 最长公共子序列 动规五部曲 1、确定dp数组(dp table)以及下标的含义 dp[i][j]:长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 2、确定递推公式 主要就是两大情况: text1[i…

vue+ts+vite+pinia+element plus+i18n国际化

第一步,安装vue-i18n(我这里版本是9.2.2) npm install vue-i18n element-plus --save 第二步,src文件夹下创建language文件夹,目录如下 第三步,定义本地中文英文 en.ts // en.ts export default {message…

UE DTCmd 插件说明

Exec CMD Exec CMD (Have Process) 在蓝图非阻塞的运行Windows命令行并输出返回值,而且可以时时监听输出内容。 可以直接运行某个程序(输入程序完整路径) 可以直接运行bat脚本,并在bat脚本里面运行你任何想做的操作。 Cmd : 需要…

花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)

有了ChatGPT之后,于我来说,有两个十分明显的变化: 1. 人变的更懒 因为生活、工作中遇到大大小小的事情,都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天,甚至更久才能写一篇原创内容,现…

【MySQL--04】数据类型

文章目录1.数据类型1.1数据类型分类1.2数值类型1.2.1tinyint类型1.2.2bit类型1.2.3小数类型1.2.3.1 float1.2.3.2 decimal1.3字符串类型1.3.1 char1.3.2 varchar1.3.3char和varchar的比较1.4日期和时间类型1.5 enum和set1.5.1 enum1.5.2 set1.5.3 示例1.数据类型 1.1数据类型分…

试题E:蜂巢 ——蓝桥杯第十三届省赛Java 大学A组

试题E:蜂巢 解析 很明显的一道坐标计算问题,只是通过看似比较复杂的描述而已。 题目定义了一种行走方向,大概就是一共六种行走方向,如果以o为原点,建立坐标系,那么方向0和3就是x轴。其他方向为分力即可&am…

【微信小程序】免费的高德地图api——获取天气(全过程)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

硬件工程师需要掌握的PCB设计常用知识点

一个优秀的硬件工程师设计的产品一定是既满足设计需求又满足生产工艺的,某个方面有瑕疵都不能算是一次完美的产品设计。规范产品的电路设计,工艺设计,PCB设计的相关工艺参数,使得生产出来的实物产品满足可生产性、可测试性、可维修…

Windows 安装 Go1.20.3 顺便了解 go env 环境变量

文章目录1.下载与安装2.GOROOT3.Go 的包管理3.1 GOPATH 模式3.2 Go Modules 模式4.GOPATH5.GO111MODULE6.GOPROXY7.GOSUMDB8.GONOPROXY/GONOSUMDB/GOPRIVATE9.GOMODCACHE10.GOCACHE11.GOENV12.GOBIN13.参考资料1.下载与安装 参考文章:Golang V1.19.1 安装配置 (win…

Vue3带来了什么

目录性能方面的优化更好的TypeScript集成用于处理大规模用例的新API分层内部模块CompositionAPI更多RFC提供的两个新功能proxy代替defineProperty双向绑定性能方面的优化 首先是相对Vue2的一些性能改进: 通过摇树(减轻了多达41%的资源大小)初始渲染&am…

Hadoop安装Hbase启动失败报错解决方法

先进入hbase文件目录里看日志文件看看报什么错再具体解决: vim /opt/module/hbase-1.3.3/logs/hbase-root-master-hadoop-single.log 1.报错org.apache.hadoop.security.AccessControlException: Permission denied: user异常解决方法 1、第一种 在hdfs的配置文件…

3.2 二维随机变量的边缘分布

思维导图: 学习目标: 要学习二维随机变量的边缘分布,我可能会按照以下步骤进行学习: 理解二维随机变量的概念和表示方法,包括联合分布函数和联合分布律等概念。理解二维随机变量的边缘分布的概念和意义,即…

2023年4月份北京/广州/深圳DAMA-CDGP数据治理专家证书收益

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

Mysql的学习与巩固:一条SQL查询语句是如何执行的?

前提 我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单…

【华为机试真题详解JAVA实现】—MP3光标位置

目录 一、题目描述 二、解题代码 一、题目描述 MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。 现在要实现通过上下键控制光标移动来浏览歌曲列…

[2022 SP] Copy, Right? 深度学习模型版权保护的测试框架

Copy, Right? A Testing Framework for Copyright Protection of Deep Learning Models | IEEE Conference Publication | IEEE Xplore 摘要 深度学习模型,尤其是那些大规模和高性能的模型,训练成本可能非常高,需要大量的数据和计算资源。…